@@ -31,21 +31,25 @@ public class TimingStats implements ToXContentObject, Writeable {
3131 public static final ParseField MIN_BUCKET_PROCESSING_TIME_MS = new ParseField ("minimum_bucket_processing_time_ms" );
3232 public static final ParseField MAX_BUCKET_PROCESSING_TIME_MS = new ParseField ("maximum_bucket_processing_time_ms" );
3333 public static final ParseField AVG_BUCKET_PROCESSING_TIME_MS = new ParseField ("average_bucket_processing_time_ms" );
34+ public static final ParseField EXPONENTIAL_AVERAGE_BUCKET_PROCESSING_TIME_MS =
35+ new ParseField ("exponential_average_bucket_processing_time_ms" );
3436
3537 public static final ParseField TYPE = new ParseField ("timing_stats" );
3638
3739 public static final ConstructingObjectParser <TimingStats , Void > PARSER =
3840 new ConstructingObjectParser <>(
3941 TYPE .getPreferredName (),
4042 true ,
41- args -> new TimingStats ((String ) args [0 ], (long ) args [1 ], (Double ) args [2 ], (Double ) args [3 ], (Double ) args [4 ]));
43+ args ->
44+ new TimingStats ((String ) args [0 ], (long ) args [1 ], (Double ) args [2 ], (Double ) args [3 ], (Double ) args [4 ], (Double ) args [5 ]));
4245
4346 static {
4447 PARSER .declareString (constructorArg (), Job .ID );
4548 PARSER .declareLong (constructorArg (), BUCKET_COUNT );
4649 PARSER .declareDouble (optionalConstructorArg (), MIN_BUCKET_PROCESSING_TIME_MS );
4750 PARSER .declareDouble (optionalConstructorArg (), MAX_BUCKET_PROCESSING_TIME_MS );
4851 PARSER .declareDouble (optionalConstructorArg (), AVG_BUCKET_PROCESSING_TIME_MS );
52+ PARSER .declareDouble (optionalConstructorArg (), EXPONENTIAL_AVERAGE_BUCKET_PROCESSING_TIME_MS );
4953 }
5054
5155 public static String documentId (String jobId ) {
@@ -57,26 +61,35 @@ public static String documentId(String jobId) {
5761 private Double minBucketProcessingTimeMs ;
5862 private Double maxBucketProcessingTimeMs ;
5963 private Double avgBucketProcessingTimeMs ;
64+ private Double exponentialAvgBucketProcessingTimeMs ;
6065
6166 public TimingStats (
6267 String jobId ,
6368 long bucketCount ,
6469 @ Nullable Double minBucketProcessingTimeMs ,
6570 @ Nullable Double maxBucketProcessingTimeMs ,
66- @ Nullable Double avgBucketProcessingTimeMs ) {
71+ @ Nullable Double avgBucketProcessingTimeMs ,
72+ @ Nullable Double exponentialAvgBucketProcessingTimeMs ) {
6773 this .jobId = jobId ;
6874 this .bucketCount = bucketCount ;
6975 this .minBucketProcessingTimeMs = minBucketProcessingTimeMs ;
7076 this .maxBucketProcessingTimeMs = maxBucketProcessingTimeMs ;
7177 this .avgBucketProcessingTimeMs = avgBucketProcessingTimeMs ;
78+ this .exponentialAvgBucketProcessingTimeMs = exponentialAvgBucketProcessingTimeMs ;
7279 }
7380
7481 public TimingStats (String jobId ) {
75- this (jobId , 0 , null , null , null );
82+ this (jobId , 0 , null , null , null , null );
7683 }
7784
7885 public TimingStats (TimingStats lhs ) {
79- this (lhs .jobId , lhs .bucketCount , lhs .minBucketProcessingTimeMs , lhs .maxBucketProcessingTimeMs , lhs .avgBucketProcessingTimeMs );
86+ this (
87+ lhs .jobId ,
88+ lhs .bucketCount ,
89+ lhs .minBucketProcessingTimeMs ,
90+ lhs .maxBucketProcessingTimeMs ,
91+ lhs .avgBucketProcessingTimeMs ,
92+ lhs .exponentialAvgBucketProcessingTimeMs );
8093 }
8194
8295 public TimingStats (StreamInput in ) throws IOException {
@@ -85,6 +98,7 @@ public TimingStats(StreamInput in) throws IOException {
8598 this .minBucketProcessingTimeMs = in .readOptionalDouble ();
8699 this .maxBucketProcessingTimeMs = in .readOptionalDouble ();
87100 this .avgBucketProcessingTimeMs = in .readOptionalDouble ();
101+ this .exponentialAvgBucketProcessingTimeMs = in .readOptionalDouble ();
88102 }
89103
90104 public String getJobId () {
@@ -107,12 +121,16 @@ public Double getAvgBucketProcessingTimeMs() {
107121 return avgBucketProcessingTimeMs ;
108122 }
109123
124+ public Double getExponentialAvgBucketProcessingTimeMs () {
125+ return exponentialAvgBucketProcessingTimeMs ;
126+ }
127+
110128 /**
111129 * Updates the statistics (min, max, avg) for the given data point (bucket processing time).
112130 */
113131 public void updateStats (double bucketProcessingTimeMs ) {
114132 if (bucketProcessingTimeMs < 0.0 ) {
115- throw new IllegalArgumentException ("bucketProcessingTimeMs must be positive , was: " + bucketProcessingTimeMs );
133+ throw new IllegalArgumentException ("bucketProcessingTimeMs must be non-negative , was: " + bucketProcessingTimeMs );
116134 }
117135 if (minBucketProcessingTimeMs == null || bucketProcessingTimeMs < minBucketProcessingTimeMs ) {
118136 minBucketProcessingTimeMs = bucketProcessingTimeMs ;
@@ -127,16 +145,29 @@ public void updateStats(double bucketProcessingTimeMs) {
127145 // bucket processing times.
128146 avgBucketProcessingTimeMs = (bucketCount * avgBucketProcessingTimeMs + bucketProcessingTimeMs ) / (bucketCount + 1 );
129147 }
148+ if (exponentialAvgBucketProcessingTimeMs == null ) {
149+ exponentialAvgBucketProcessingTimeMs = bucketProcessingTimeMs ;
150+ } else {
151+ // Calculate the exponential moving average (see https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average) of
152+ // bucket processing times.
153+ exponentialAvgBucketProcessingTimeMs = (1 - ALPHA ) * exponentialAvgBucketProcessingTimeMs + ALPHA * bucketProcessingTimeMs ;
154+ }
130155 bucketCount ++;
131156 }
132157
158+ /**
159+ * Constant smoothing factor used for calculating exponential moving average. Represents the degree of weighting decrease.
160+ */
161+ private static double ALPHA = 0.01 ;
162+
133163 @ Override
134164 public void writeTo (StreamOutput out ) throws IOException {
135165 out .writeString (jobId );
136166 out .writeLong (bucketCount );
137167 out .writeOptionalDouble (minBucketProcessingTimeMs );
138168 out .writeOptionalDouble (maxBucketProcessingTimeMs );
139169 out .writeOptionalDouble (avgBucketProcessingTimeMs );
170+ out .writeOptionalDouble (exponentialAvgBucketProcessingTimeMs );
140171 }
141172
142173 @ Override
@@ -153,6 +184,9 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
153184 if (avgBucketProcessingTimeMs != null ) {
154185 builder .field (AVG_BUCKET_PROCESSING_TIME_MS .getPreferredName (), avgBucketProcessingTimeMs );
155186 }
187+ if (exponentialAvgBucketProcessingTimeMs != null ) {
188+ builder .field (EXPONENTIAL_AVERAGE_BUCKET_PROCESSING_TIME_MS .getPreferredName (), exponentialAvgBucketProcessingTimeMs );
189+ }
156190 builder .endObject ();
157191 return builder ;
158192 }
@@ -166,12 +200,19 @@ public boolean equals(Object o) {
166200 && this .bucketCount == that .bucketCount
167201 && Objects .equals (this .minBucketProcessingTimeMs , that .minBucketProcessingTimeMs )
168202 && Objects .equals (this .maxBucketProcessingTimeMs , that .maxBucketProcessingTimeMs )
169- && Objects .equals (this .avgBucketProcessingTimeMs , that .avgBucketProcessingTimeMs );
203+ && Objects .equals (this .avgBucketProcessingTimeMs , that .avgBucketProcessingTimeMs )
204+ && Objects .equals (this .exponentialAvgBucketProcessingTimeMs , that .exponentialAvgBucketProcessingTimeMs );
170205 }
171206
172207 @ Override
173208 public int hashCode () {
174- return Objects .hash (jobId , bucketCount , minBucketProcessingTimeMs , maxBucketProcessingTimeMs , avgBucketProcessingTimeMs );
209+ return Objects .hash (
210+ jobId ,
211+ bucketCount ,
212+ minBucketProcessingTimeMs ,
213+ maxBucketProcessingTimeMs ,
214+ avgBucketProcessingTimeMs ,
215+ exponentialAvgBucketProcessingTimeMs );
175216 }
176217
177218 @ Override
@@ -185,7 +226,8 @@ public String toString() {
185226 public static boolean differSignificantly (TimingStats stats1 , TimingStats stats2 ) {
186227 return differSignificantly (stats1 .minBucketProcessingTimeMs , stats2 .minBucketProcessingTimeMs )
187228 || differSignificantly (stats1 .maxBucketProcessingTimeMs , stats2 .maxBucketProcessingTimeMs )
188- || differSignificantly (stats1 .avgBucketProcessingTimeMs , stats2 .avgBucketProcessingTimeMs );
229+ || differSignificantly (stats1 .avgBucketProcessingTimeMs , stats2 .avgBucketProcessingTimeMs )
230+ || differSignificantly (stats1 .exponentialAvgBucketProcessingTimeMs , stats2 .exponentialAvgBucketProcessingTimeMs );
189231 }
190232
191233 /**
0 commit comments