88import org .apache .jmeter .samplers .Remoteable ;
99import org .apache .jmeter .samplers .SampleEvent ;
1010import org .apache .jmeter .samplers .SampleListener ;
11+ import org .apache .jmeter .samplers .SampleResult ;
1112import org .apache .jmeter .testelement .TestStateListener ;
13+ import org .apache .jmeter .threads .JMeterContext ;
1214import org .apache .jmeter .threads .JMeterContextService ;
15+ import org .apache .jmeter .threads .JMeterThread ;
1316import org .apache .jmeter .util .JMeterUtils ;
17+ import org .apache .jmeter .visualizers .SamplingStatCalculator ;
1418import org .slf4j .Logger ;
1519import org .slf4j .LoggerFactory ;
1620
21+
22+
23+ import org .apache .jmeter .engine .util .CompoundVariable ;
24+ import org .apache .jmeter .threads .JMeterVariables ;
25+ import org .apache .jmeter .functions .AbstractFunction ;
26+
27+
28+
29+
1730import java .io .Serializable ;
1831import java .net .DatagramPacket ;
1932import java .net .DatagramSocket ;
@@ -32,13 +45,20 @@ public class AutoStop
3245 private final static String ERROR_RATE_SECS = "error_rate_length" ;
3346 private final static String RESPONSE_LATENCY = "avg_response_latency" ;
3447 private final static String RESPONSE_LATENCY_SECS = "avg_response_latency_length" ;
48+ private final static String PERCENTILE_RESPONSE_TIME = "percentile_response_time" ;
49+ private final static String PERCENTILE_RESPONSE_TIME_SECS ="percentile_response_time_secs" ;
50+ private final static String PERCENTILE_VALUE = "percentile_value" ;
51+ private final static String CUSTOM_VALIDATION_DURATION = "custom_validation_duration" ;
3552 private long curSec = 0L ;
3653 private GraphPanelChartAverageElement avgRespTime = new GraphPanelChartAverageElement ();
3754 private GraphPanelChartAverageElement avgRespLatency = new GraphPanelChartAverageElement ();
3855 private GraphPanelChartAverageElement errorRate = new GraphPanelChartAverageElement ();
56+ SamplingStatCalculator statCalc = new SamplingStatCalculator ();
3957 private long respTimeExceededStart = 0 ;
4058 private long errRateExceededStart = 0 ;
4159 private long respLatencyExceededStart = 0 ;
60+ private long percentileRespTimeExceededStart = 0 ;
61+ private long customValidationExceededStart = 0 ;
4262 private int stopTries = 0 ;
4363 //optimization: not convert String to number for each sample
4464 private int testValueRespTime = 0 ;
@@ -47,6 +67,15 @@ public class AutoStop
4767 private int testValueRespLatencySec = 0 ;
4868 private float testValueError = 0 ;
4969 private int testValueErrorSec = 0 ;
70+ private int testValuePercentileRespTime = 0 ;
71+ private int testValuePercentileRespTimeSec = 0 ;
72+ private float testPercentileValue = 0 ;
73+ private int percentileResponseTime = 0 ;
74+ private String testExpectedValue = "true" ;
75+ private String testActualValue = "false" ;
76+ private int testValueCustomSec = 180 ;
77+ private boolean skipIter = false ;
78+
5079
5180 public AutoStop () {
5281 super ();
@@ -74,7 +103,7 @@ public void sampleOccurred(SampleEvent se) {
74103 if (testValueRespLatency > 0 ) {
75104 //log.debug("Avg resp time: "+avgRespTime.getValue());
76105 if (avgRespLatency .getValue () > testValueRespLatency ) {
77- //log.debug((sec - respTimeExceededStart)+" "+getResponseTimeSecsAsInt ());
106+ //log.debug((sec - respTimeExceededStart)+" "+getResponseLatencySecsAsInt ());
78107 if (sec - respLatencyExceededStart >= testValueRespLatencySec ) {
79108 log .info ("Average Latency Time is more than " + getResponseLatency () + " for " + getResponseLatencySecs () + "s. Auto-shutdown test..." );
80109 System .out .println ("AutoStop - Average Latency Time is more than " + getResponseLatency () + " for " + getResponseLatencySecs () + "s. Auto-shutdown test..." );
@@ -99,10 +128,27 @@ public void sampleOccurred(SampleEvent se) {
99128 }
100129 }
101130
131+ if (testValuePercentileRespTime > 0 ) {
132+ SampleResult sr = se .getResult ();
133+ statCalc .addSample (sr );
134+ // log.debug(testPercentileValue+"Percentile Response >"+testValuePercentileRespTime+"until"+testValuePercentileRespTimeSec+"currentValue"+percentileResponseTime);
135+ // log.debug(testActualValue+">>"+testExpectedValue+">>"+skipIter+">>"+testValueCustomSec);
136+ if (percentileResponseTime > testValuePercentileRespTime ) {
137+ //log.debug((sec - percentileRespTimeExceededStart)+" "+getPercentileResponseTimeSecsAsInt());
138+ if (sec - percentileRespTimeExceededStart >= testValuePercentileRespTimeSec ) {
139+ log .info (testPercentileValue +"Percentile Response more than " + getPercentileResponseTime () + " for " + getPercentileResponseTimeSecs () + "s. Auto-shutdown test..." );
140+ stopTest ();
141+ }
142+ } else {
143+ percentileRespTimeExceededStart = sec ;
144+ }
145+ }
146+
102147 curSec = sec ;
103148 avgRespTime = new GraphPanelChartAverageElement ();
104149 avgRespLatency = new GraphPanelChartAverageElement ();
105150 errorRate = new GraphPanelChartAverageElement ();
151+ percentileResponseTime = statCalc .getPercentPoint (testPercentileValue ).intValue ();
106152 }
107153
108154 avgRespTime .add (se .getResult ().getTime ());
@@ -130,6 +176,8 @@ public void testStarted() {
130176 errRateExceededStart = 0 ;
131177 respTimeExceededStart = 0 ;
132178 respLatencyExceededStart = 0 ;
179+ percentileRespTimeExceededStart = 0 ;
180+ customValidationExceededStart = 0 ;
133181
134182 //init test values
135183 testValueError = getErrorRateAsFloat ();
@@ -138,6 +186,11 @@ public void testStarted() {
138186 testValueRespLatencySec = getResponseLatencySecsAsInt ();
139187 testValueRespTime = getResponseTimeAsInt ();
140188 testValueRespTimeSec = getResponseTimeSecsAsInt ();
189+ testValuePercentileRespTime = getPercentileResponseTimeAsInt ();
190+ testValuePercentileRespTimeSec = getPercentileResponseTimeSecsAsInt ();
191+ testPercentileValue = getPercentileValueAsFloat ();
192+ testValueCustomSec = getCustomValidationDurationAsInt ();
193+
141194 }
142195
143196 @ Override
@@ -153,6 +206,14 @@ public void testEnded() {
153206 public void testEnded (String string ) {
154207 }
155208
209+ void setPercentileResponseTime (String text ) { setProperty (PERCENTILE_RESPONSE_TIME , text ); }
210+
211+ void setPercentileResponseTimeSecs (String text ) { setProperty (PERCENTILE_RESPONSE_TIME_SECS , text ); }
212+
213+ void setPercentileValue (String text ) { setProperty (PERCENTILE_VALUE , text ); }
214+
215+ void setCustomValidationDuration (String text ) { setProperty (CUSTOM_VALIDATION_DURATION , text ); }
216+
156217 void setResponseTime (String text ) {
157218 setProperty (RESPONSE_TIME , text );
158219 }
@@ -177,6 +238,14 @@ void setErrorRateSecs(String text) {
177238 setProperty (ERROR_RATE_SECS , text );
178239 }
179240
241+ String getPercentileResponseTime () { return getPropertyAsString (PERCENTILE_RESPONSE_TIME ); }
242+
243+ String getPercentileResponseTimeSecs () { return getPropertyAsString (PERCENTILE_RESPONSE_TIME_SECS ); }
244+
245+ String getPercentileValue () { return getPropertyAsString (PERCENTILE_VALUE ); }
246+
247+ String getCustomValidationDuration () { return getPropertyAsString (CUSTOM_VALIDATION_DURATION ); }
248+
180249 String getResponseTime () {
181250 return getPropertyAsString (RESPONSE_TIME );
182251 }
@@ -201,6 +270,50 @@ String getErrorRateSecs() {
201270 return getPropertyAsString (ERROR_RATE_SECS );
202271 }
203272
273+ private int getPercentileResponseTimeAsInt () {
274+ int res = 0 ;
275+ try {
276+ res = Integer .parseInt (getPercentileResponseTime ());
277+ } catch (NumberFormatException e ) {
278+ log .error ("Wrong response time: " + getPercentileResponseTime (), e );
279+ setPercentileResponseTime ("0" );
280+ }
281+ return res ;
282+ }
283+
284+ private int getPercentileResponseTimeSecsAsInt () {
285+ int res = 0 ;
286+ try {
287+ res = Integer .parseInt (getPercentileResponseTimeSecs ());
288+ } catch (NumberFormatException e ) {
289+ log .error ("Wrong response time period: " + getPercentileResponseTimeSecs (), e );
290+ setPercentileResponseTimeSecs ("1" );
291+ }
292+ return res > 0 ? res : 1 ;
293+ }
294+
295+ private int getCustomValidationDurationAsInt () {
296+ int res = 0 ;
297+ try {
298+ res = Integer .parseInt (getCustomValidationDuration ());
299+ } catch (NumberFormatException e ) {
300+ log .error ("Wrong time period: " + getCustomValidationDuration (), e );
301+ setCustomValidationDuration ("1" );
302+ }
303+ return res > 0 ? res : 1 ;
304+ }
305+
306+ private float getPercentileValueAsFloat () {
307+ float res = 0 ;
308+ try {
309+ res = Float .parseFloat (getPercentileValue ()) / 100 ;
310+ } catch (NumberFormatException e ) {
311+ log .error ("Wrong Percentile Value: " + getPercentileValue (), e );
312+ setPercentileValue ("1" );
313+ }
314+ return res > 0 ? res : 1 ;
315+ }
316+
204317 private int getResponseTimeAsInt () {
205318 int res = 0 ;
206319 try {
0 commit comments