@@ -31,21 +31,25 @@ public class TimingStats implements ToXContentObject, Writeable {
31
31
public static final ParseField MIN_BUCKET_PROCESSING_TIME_MS = new ParseField ("minimum_bucket_processing_time_ms" );
32
32
public static final ParseField MAX_BUCKET_PROCESSING_TIME_MS = new ParseField ("maximum_bucket_processing_time_ms" );
33
33
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" );
34
36
35
37
public static final ParseField TYPE = new ParseField ("timing_stats" );
36
38
37
39
public static final ConstructingObjectParser <TimingStats , Void > PARSER =
38
40
new ConstructingObjectParser <>(
39
41
TYPE .getPreferredName (),
40
42
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 ]));
42
45
43
46
static {
44
47
PARSER .declareString (constructorArg (), Job .ID );
45
48
PARSER .declareLong (constructorArg (), BUCKET_COUNT );
46
49
PARSER .declareDouble (optionalConstructorArg (), MIN_BUCKET_PROCESSING_TIME_MS );
47
50
PARSER .declareDouble (optionalConstructorArg (), MAX_BUCKET_PROCESSING_TIME_MS );
48
51
PARSER .declareDouble (optionalConstructorArg (), AVG_BUCKET_PROCESSING_TIME_MS );
52
+ PARSER .declareDouble (optionalConstructorArg (), EXPONENTIAL_AVERAGE_BUCKET_PROCESSING_TIME_MS );
49
53
}
50
54
51
55
public static String documentId (String jobId ) {
@@ -57,26 +61,35 @@ public static String documentId(String jobId) {
57
61
private Double minBucketProcessingTimeMs ;
58
62
private Double maxBucketProcessingTimeMs ;
59
63
private Double avgBucketProcessingTimeMs ;
64
+ private Double exponentialAvgBucketProcessingTimeMs ;
60
65
61
66
public TimingStats (
62
67
String jobId ,
63
68
long bucketCount ,
64
69
@ Nullable Double minBucketProcessingTimeMs ,
65
70
@ Nullable Double maxBucketProcessingTimeMs ,
66
- @ Nullable Double avgBucketProcessingTimeMs ) {
71
+ @ Nullable Double avgBucketProcessingTimeMs ,
72
+ @ Nullable Double exponentialAvgBucketProcessingTimeMs ) {
67
73
this .jobId = jobId ;
68
74
this .bucketCount = bucketCount ;
69
75
this .minBucketProcessingTimeMs = minBucketProcessingTimeMs ;
70
76
this .maxBucketProcessingTimeMs = maxBucketProcessingTimeMs ;
71
77
this .avgBucketProcessingTimeMs = avgBucketProcessingTimeMs ;
78
+ this .exponentialAvgBucketProcessingTimeMs = exponentialAvgBucketProcessingTimeMs ;
72
79
}
73
80
74
81
public TimingStats (String jobId ) {
75
- this (jobId , 0 , null , null , null );
82
+ this (jobId , 0 , null , null , null , null );
76
83
}
77
84
78
85
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 );
80
93
}
81
94
82
95
public TimingStats (StreamInput in ) throws IOException {
@@ -85,6 +98,7 @@ public TimingStats(StreamInput in) throws IOException {
85
98
this .minBucketProcessingTimeMs = in .readOptionalDouble ();
86
99
this .maxBucketProcessingTimeMs = in .readOptionalDouble ();
87
100
this .avgBucketProcessingTimeMs = in .readOptionalDouble ();
101
+ this .exponentialAvgBucketProcessingTimeMs = in .readOptionalDouble ();
88
102
}
89
103
90
104
public String getJobId () {
@@ -107,12 +121,16 @@ public Double getAvgBucketProcessingTimeMs() {
107
121
return avgBucketProcessingTimeMs ;
108
122
}
109
123
124
+ public Double getExponentialAvgBucketProcessingTimeMs () {
125
+ return exponentialAvgBucketProcessingTimeMs ;
126
+ }
127
+
110
128
/**
111
129
* Updates the statistics (min, max, avg) for the given data point (bucket processing time).
112
130
*/
113
131
public void updateStats (double bucketProcessingTimeMs ) {
114
132
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 );
116
134
}
117
135
if (minBucketProcessingTimeMs == null || bucketProcessingTimeMs < minBucketProcessingTimeMs ) {
118
136
minBucketProcessingTimeMs = bucketProcessingTimeMs ;
@@ -127,16 +145,29 @@ public void updateStats(double bucketProcessingTimeMs) {
127
145
// bucket processing times.
128
146
avgBucketProcessingTimeMs = (bucketCount * avgBucketProcessingTimeMs + bucketProcessingTimeMs ) / (bucketCount + 1 );
129
147
}
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
+ }
130
155
bucketCount ++;
131
156
}
132
157
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
+
133
163
@ Override
134
164
public void writeTo (StreamOutput out ) throws IOException {
135
165
out .writeString (jobId );
136
166
out .writeLong (bucketCount );
137
167
out .writeOptionalDouble (minBucketProcessingTimeMs );
138
168
out .writeOptionalDouble (maxBucketProcessingTimeMs );
139
169
out .writeOptionalDouble (avgBucketProcessingTimeMs );
170
+ out .writeOptionalDouble (exponentialAvgBucketProcessingTimeMs );
140
171
}
141
172
142
173
@ Override
@@ -153,6 +184,9 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
153
184
if (avgBucketProcessingTimeMs != null ) {
154
185
builder .field (AVG_BUCKET_PROCESSING_TIME_MS .getPreferredName (), avgBucketProcessingTimeMs );
155
186
}
187
+ if (exponentialAvgBucketProcessingTimeMs != null ) {
188
+ builder .field (EXPONENTIAL_AVERAGE_BUCKET_PROCESSING_TIME_MS .getPreferredName (), exponentialAvgBucketProcessingTimeMs );
189
+ }
156
190
builder .endObject ();
157
191
return builder ;
158
192
}
@@ -166,12 +200,19 @@ public boolean equals(Object o) {
166
200
&& this .bucketCount == that .bucketCount
167
201
&& Objects .equals (this .minBucketProcessingTimeMs , that .minBucketProcessingTimeMs )
168
202
&& 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 );
170
205
}
171
206
172
207
@ Override
173
208
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 );
175
216
}
176
217
177
218
@ Override
@@ -185,7 +226,8 @@ public String toString() {
185
226
public static boolean differSignificantly (TimingStats stats1 , TimingStats stats2 ) {
186
227
return differSignificantly (stats1 .minBucketProcessingTimeMs , stats2 .minBucketProcessingTimeMs )
187
228
|| differSignificantly (stats1 .maxBucketProcessingTimeMs , stats2 .maxBucketProcessingTimeMs )
188
- || differSignificantly (stats1 .avgBucketProcessingTimeMs , stats2 .avgBucketProcessingTimeMs );
229
+ || differSignificantly (stats1 .avgBucketProcessingTimeMs , stats2 .avgBucketProcessingTimeMs )
230
+ || differSignificantly (stats1 .exponentialAvgBucketProcessingTimeMs , stats2 .exponentialAvgBucketProcessingTimeMs );
189
231
}
190
232
191
233
/**
0 commit comments