You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by fs...@apache.org on 2021/06/03 17:39:29 UTC
[jmeter] branch master updated: Make the estimator used for
calculating percentiles on the dashboard configurable
This is an automated email from the ASF dual-hosted git repository.
fschumacher pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git
The following commit(s) were added to refs/heads/master by this push:
new 1647a2b Make the estimator used for calculating percentiles on the dashboard configurable
1647a2b is described below
commit 1647a2b0cb69c2bae415d22816df0065403f44a6
Author: Felix Schumacher <fe...@internetallee.de>
AuthorDate: Thu Jun 3 19:32:17 2021 +0200
Make the estimator used for calculating percentiles on the dashboard configurable
Bugzilla Id: 65353
---
.../jmeter/visualizers/backend/SamplerMetric.java | 9 +++--
.../jmeter/visualizers/backend/UserMetric.java | 5 ++-
.../processor/DescriptiveStatisticsFactory.java | 43 ++++++++++++++++++++++
.../report/processor/PercentileAggregator.java | 4 +-
xdocs/changes.xml | 1 +
xdocs/usermanual/properties_reference.xml | 6 ++-
6 files changed, 60 insertions(+), 8 deletions(-)
diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
index a279310..0ae60fb 100644
--- a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
+++ b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
@@ -24,6 +24,7 @@ import java.util.Map;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.apache.jmeter.control.TransactionController;
+import org.apache.jmeter.report.processor.DescriptiveStatisticsFactory;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.documentation.VisibleForTesting;
@@ -41,15 +42,15 @@ public class SamplerMetric {
/**
* Response times for OK samples
*/
- private DescriptiveStatistics okResponsesStats = new DescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
+ private DescriptiveStatistics okResponsesStats = DescriptiveStatisticsFactory.createDescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
/**
* Response times for KO samples
*/
- private DescriptiveStatistics koResponsesStats = new DescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
+ private DescriptiveStatistics koResponsesStats = DescriptiveStatisticsFactory.createDescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
/**
* Response times for All samples
*/
- private DescriptiveStatistics allResponsesStats = new DescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
+ private DescriptiveStatistics allResponsesStats = DescriptiveStatisticsFactory.createDescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
/**
* OK, KO, ALL stats
*/
@@ -57,7 +58,7 @@ public class SamplerMetric {
/**
* Timeboxed percentiles don't makes sense
*/
- private DescriptiveStatistics pctResponseStats = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
+ private DescriptiveStatistics pctResponseStats = DescriptiveStatisticsFactory.createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
private int successes;
private int failures;
private int hits;
diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/UserMetric.java b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/UserMetric.java
index 1358962..1c84707 100644
--- a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/UserMetric.java
+++ b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/UserMetric.java
@@ -18,6 +18,7 @@
package org.apache.jmeter.visualizers.backend;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
+import org.apache.jmeter.report.processor.DescriptiveStatisticsFactory;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.util.JMeterUtils;
@@ -27,10 +28,12 @@ import org.apache.jmeter.util.JMeterUtils;
* @since 2.13
*/
public class UserMetric {
+
private static final int SLIDING_WINDOW_SIZE = JMeterUtils.getPropDefault("backend_metrics_window", 100); //$NON-NLS-1$
// Limit to sliding window of SLIDING_WINDOW_SIZE values
- private DescriptiveStatistics usersStats = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
+ private DescriptiveStatistics usersStats = DescriptiveStatisticsFactory.createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
+
/**
*
*/
diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/DescriptiveStatisticsFactory.java b/src/core/src/main/java/org/apache/jmeter/report/processor/DescriptiveStatisticsFactory.java
new file mode 100644
index 0000000..7b03408
--- /dev/null
+++ b/src/core/src/main/java/org/apache/jmeter/report/processor/DescriptiveStatisticsFactory.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jmeter.report.processor;
+
+import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
+import org.apache.commons.math3.stat.descriptive.rank.Percentile;
+import org.apache.commons.math3.stat.descriptive.rank.Percentile.EstimationType;
+import org.apache.jmeter.util.JMeterUtils;
+
+public class DescriptiveStatisticsFactory {
+ private static final int SLIDING_WINDOW_SIZE = JMeterUtils.getPropDefault("backend_metrics_window", 100); //$NON-NLS-1$
+ private static final EstimationType ESTIMATION_TYPE = EstimationType
+ .valueOf(JMeterUtils.getPropDefault("backend_metrics_percentile_estimator", "LEGACY")); //$NON-NLS-1$
+
+ private DescriptiveStatisticsFactory() {
+ // utility class -> hide the constructor
+ }
+
+ public static DescriptiveStatistics createDescriptiveStatistics() {
+ return createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
+ }
+
+ public static DescriptiveStatistics createDescriptiveStatistics(int windowSize) {
+ DescriptiveStatistics statistics = new DescriptiveStatistics();
+ statistics.setPercentileImpl(new Percentile().withEstimationType(ESTIMATION_TYPE));
+ return statistics;
+ }
+}
diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java b/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java
index 44fbe0e..ca81b2e 100644
--- a/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java
+++ b/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java
@@ -42,7 +42,7 @@ public class PercentileAggregator implements Aggregator {
* the index of the percentile
*/
public PercentileAggregator(double index) {
- statistics = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
+ statistics = DescriptiveStatisticsFactory.createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
percentileIndex = index;
}
@@ -50,7 +50,7 @@ public class PercentileAggregator implements Aggregator {
* @param lastAggregator {@link PercentileAggregator}
*/
public PercentileAggregator(PercentileAggregator lastAggregator) {
- statistics = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
+ statistics = DescriptiveStatisticsFactory.createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
this.percentileIndex = lastAggregator.percentileIndex;
}
diff --git a/xdocs/changes.xml b/xdocs/changes.xml
index 46bbf8f..aa03e32 100644
--- a/xdocs/changes.xml
+++ b/xdocs/changes.xml
@@ -121,6 +121,7 @@ Summary
<h3>Report / Dashboard</h3>
<ul>
+ <li><bug>65353</bug>Make the estimator used for calculating percentiles on the dashboard configurable</li>
</ul>
<h3>General</h3>
diff --git a/xdocs/usermanual/properties_reference.xml b/xdocs/usermanual/properties_reference.xml
index de95a86..5e1565d 100644
--- a/xdocs/usermanual/properties_reference.xml
+++ b/xdocs/usermanual/properties_reference.xml
@@ -1161,7 +1161,11 @@ JMETER-SERVER</source>
Setting this value too high can lead to OOM Backend metrics sliding window size
Defaults to: <code>5000</code>
</property>
-
+<property name="backend_metrics_percentile_estimator">
+ Specify the <a href="https://commons.apache.org/proper/commons-math/javadocs/api-3.5/org/apache/commons/math3/stat/descriptive/rank/Percentile.EstimationType.html">Percentile Estimation Type</a> to use.<br/>
+ To make the values from the dashboard compatible with the Aggragate Report, use the value <code>R_3</code>.<br/>
+ Defaults to: <code>LEGACY</code>
+</property>
<property name="backend_metrics_window_mode">
Backend metrics window mode.
Possible values:
Re: [jmeter] branch master updated: Make the estimator used for
calculating percentiles on the dashboard configurable
Posted by Philippe Mouawad <ph...@gmail.com>.
Hello Felix,
Thanks for this fix.
I saw a little typo in:
To make the values from the dashboard compatible with the Aggragate Report,
use the value <code>R_3</code>.<br/>
Should be:
To make the values from the dashboard compatible with the Aggregate Report,
use the value <code>R_3</code>.<br/>
Regards
On Thu, Jun 3, 2021 at 7:39 PM <fs...@apache.org> wrote:
> This is an automated email from the ASF dual-hosted git repository.
>
> fschumacher pushed a commit to branch master
> in repository https://gitbox.apache.org/repos/asf/jmeter.git
>
>
> The following commit(s) were added to refs/heads/master by this push:
> new 1647a2b Make the estimator used for calculating percentiles on
> the dashboard configurable
> 1647a2b is described below
>
> commit 1647a2b0cb69c2bae415d22816df0065403f44a6
> Author: Felix Schumacher <fe...@internetallee.de>
> AuthorDate: Thu Jun 3 19:32:17 2021 +0200
>
> Make the estimator used for calculating percentiles on the dashboard
> configurable
>
> Bugzilla Id: 65353
> ---
> .../jmeter/visualizers/backend/SamplerMetric.java | 9 +++--
> .../jmeter/visualizers/backend/UserMetric.java | 5 ++-
> .../processor/DescriptiveStatisticsFactory.java | 43
> ++++++++++++++++++++++
> .../report/processor/PercentileAggregator.java | 4 +-
> xdocs/changes.xml | 1 +
> xdocs/usermanual/properties_reference.xml | 6 ++-
> 6 files changed, 60 insertions(+), 8 deletions(-)
>
> diff --git
> a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
> b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
> index a279310..0ae60fb 100644
> ---
> a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
> +++
> b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
> @@ -24,6 +24,7 @@ import java.util.Map;
>
> import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
> import org.apache.jmeter.control.TransactionController;
> +import org.apache.jmeter.report.processor.DescriptiveStatisticsFactory;
> import org.apache.jmeter.samplers.SampleResult;
> import org.apache.jmeter.util.JMeterUtils;
> import org.apache.jorphan.documentation.VisibleForTesting;
> @@ -41,15 +42,15 @@ public class SamplerMetric {
> /**
> * Response times for OK samples
> */
> - private DescriptiveStatistics okResponsesStats = new
> DescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
> + private DescriptiveStatistics okResponsesStats =
> DescriptiveStatisticsFactory.createDescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
> /**
> * Response times for KO samples
> */
> - private DescriptiveStatistics koResponsesStats = new
> DescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
> + private DescriptiveStatistics koResponsesStats =
> DescriptiveStatisticsFactory.createDescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
> /**
> * Response times for All samples
> */
> - private DescriptiveStatistics allResponsesStats = new
> DescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
> + private DescriptiveStatistics allResponsesStats =
> DescriptiveStatisticsFactory.createDescriptiveStatistics(LARGE_SLIDING_WINDOW_SIZE);
> /**
> * OK, KO, ALL stats
> */
> @@ -57,7 +58,7 @@ public class SamplerMetric {
> /**
> * Timeboxed percentiles don't makes sense
> */
> - private DescriptiveStatistics pctResponseStats = new
> DescriptiveStatistics(SLIDING_WINDOW_SIZE);
> + private DescriptiveStatistics pctResponseStats =
> DescriptiveStatisticsFactory.createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
> private int successes;
> private int failures;
> private int hits;
> diff --git
> a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/UserMetric.java
> b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/UserMetric.java
> index 1358962..1c84707 100644
> ---
> a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/UserMetric.java
> +++
> b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/UserMetric.java
> @@ -18,6 +18,7 @@
> package org.apache.jmeter.visualizers.backend;
>
> import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
> +import org.apache.jmeter.report.processor.DescriptiveStatisticsFactory;
> import org.apache.jmeter.samplers.SampleResult;
> import org.apache.jmeter.threads.JMeterContextService;
> import org.apache.jmeter.util.JMeterUtils;
> @@ -27,10 +28,12 @@ import org.apache.jmeter.util.JMeterUtils;
> * @since 2.13
> */
> public class UserMetric {
> +
> private static final int SLIDING_WINDOW_SIZE =
> JMeterUtils.getPropDefault("backend_metrics_window", 100); //$NON-NLS-1$
>
> // Limit to sliding window of SLIDING_WINDOW_SIZE values
> - private DescriptiveStatistics usersStats = new
> DescriptiveStatistics(SLIDING_WINDOW_SIZE);
> + private DescriptiveStatistics usersStats =
> DescriptiveStatisticsFactory.createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
> +
> /**
> *
> */
> diff --git
> a/src/core/src/main/java/org/apache/jmeter/report/processor/DescriptiveStatisticsFactory.java
> b/src/core/src/main/java/org/apache/jmeter/report/processor/DescriptiveStatisticsFactory.java
> new file mode 100644
> index 0000000..7b03408
> --- /dev/null
> +++
> b/src/core/src/main/java/org/apache/jmeter/report/processor/DescriptiveStatisticsFactory.java
> @@ -0,0 +1,43 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to you under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +
> +package org.apache.jmeter.report.processor;
> +
> +import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
> +import org.apache.commons.math3.stat.descriptive.rank.Percentile;
> +import
> org.apache.commons.math3.stat.descriptive.rank.Percentile.EstimationType;
> +import org.apache.jmeter.util.JMeterUtils;
> +
> +public class DescriptiveStatisticsFactory {
> + private static final int SLIDING_WINDOW_SIZE =
> JMeterUtils.getPropDefault("backend_metrics_window", 100); //$NON-NLS-1$
> + private static final EstimationType ESTIMATION_TYPE = EstimationType
> +
> .valueOf(JMeterUtils.getPropDefault("backend_metrics_percentile_estimator",
> "LEGACY")); //$NON-NLS-1$
> +
> + private DescriptiveStatisticsFactory() {
> + // utility class -> hide the constructor
> + }
> +
> + public static DescriptiveStatistics createDescriptiveStatistics() {
> + return createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
> + }
> +
> + public static DescriptiveStatistics createDescriptiveStatistics(int
> windowSize) {
> + DescriptiveStatistics statistics = new DescriptiveStatistics();
> + statistics.setPercentileImpl(new
> Percentile().withEstimationType(ESTIMATION_TYPE));
> + return statistics;
> + }
> +}
> diff --git
> a/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java
> b/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java
> index 44fbe0e..ca81b2e 100644
> ---
> a/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java
> +++
> b/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java
> @@ -42,7 +42,7 @@ public class PercentileAggregator implements Aggregator {
> * the index of the percentile
> */
> public PercentileAggregator(double index) {
> - statistics = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
> + statistics =
> DescriptiveStatisticsFactory.createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
> percentileIndex = index;
> }
>
> @@ -50,7 +50,7 @@ public class PercentileAggregator implements Aggregator {
> * @param lastAggregator {@link PercentileAggregator}
> */
> public PercentileAggregator(PercentileAggregator lastAggregator) {
> - statistics = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
> + statistics =
> DescriptiveStatisticsFactory.createDescriptiveStatistics(SLIDING_WINDOW_SIZE);
> this.percentileIndex = lastAggregator.percentileIndex;
> }
>
> diff --git a/xdocs/changes.xml b/xdocs/changes.xml
> index 46bbf8f..aa03e32 100644
> --- a/xdocs/changes.xml
> +++ b/xdocs/changes.xml
> @@ -121,6 +121,7 @@ Summary
>
> <h3>Report / Dashboard</h3>
> <ul>
> + <li><bug>65353</bug>Make the estimator used for calculating percentiles
> on the dashboard configurable</li>
> </ul>
>
> <h3>General</h3>
> diff --git a/xdocs/usermanual/properties_reference.xml
> b/xdocs/usermanual/properties_reference.xml
> index de95a86..5e1565d 100644
> --- a/xdocs/usermanual/properties_reference.xml
> +++ b/xdocs/usermanual/properties_reference.xml
> @@ -1161,7 +1161,11 @@ JMETER-SERVER</source>
> Setting this value too high can lead to OOM Backend metrics sliding
> window size
> Defaults to: <code>5000</code>
> </property>
> -
> +<property name="backend_metrics_percentile_estimator">
> + Specify the <a href="
> https://commons.apache.org/proper/commons-math/javadocs/api-3.5/org/apache/commons/math3/stat/descriptive/rank/Percentile.EstimationType.html">Percentile
> Estimation Type</a> to use.<br/>
> + To make the values from the dashboard compatible with the Aggragate
> Report, use the value <code>R_3</code>.<br/>
> + Defaults to: <code>LEGACY</code>
> +</property>
> <property name="backend_metrics_window_mode">
> Backend metrics window mode.
> Possible values:
>
--
Cordialement.
Philippe Mouawad.