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 <[email protected]>
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:

Reply via email to