Skip to content

Commit e2bdd43

Browse files
authored
Add DatafeedTimingStats.average_search_time_per_bucket_ms and TimingStats.total_bucket_processing_time_ms stats (#44125)
1 parent d8f9e02 commit e2bdd43

File tree

25 files changed

+449
-98
lines changed

25 files changed

+449
-98
lines changed

client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedTimingStats.java

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ public class DatafeedTimingStats implements ToXContentObject {
3636

3737
public static final ParseField JOB_ID = new ParseField("job_id");
3838
public static final ParseField SEARCH_COUNT = new ParseField("search_count");
39+
public static final ParseField BUCKET_COUNT = new ParseField("bucket_count");
3940
public static final ParseField TOTAL_SEARCH_TIME_MS = new ParseField("total_search_time_ms");
41+
public static final ParseField AVG_SEARCH_TIME_PER_BUCKET_MS = new ParseField("average_search_time_per_bucket_ms");
4042

4143
public static final ParseField TYPE = new ParseField("datafeed_timing_stats");
4244

@@ -50,23 +52,37 @@ private static ConstructingObjectParser<DatafeedTimingStats, Void> createParser(
5052
args -> {
5153
String jobId = (String) args[0];
5254
Long searchCount = (Long) args[1];
53-
Double totalSearchTimeMs = (Double) args[2];
54-
return new DatafeedTimingStats(jobId, getOrDefault(searchCount, 0L), getOrDefault(totalSearchTimeMs, 0.0));
55+
Long bucketCount = (Long) args[2];
56+
Double totalSearchTimeMs = (Double) args[3];
57+
Double avgSearchTimePerBucketMs = (Double) args[4];
58+
return new DatafeedTimingStats(
59+
jobId,
60+
getOrDefault(searchCount, 0L),
61+
getOrDefault(bucketCount, 0L),
62+
getOrDefault(totalSearchTimeMs, 0.0),
63+
avgSearchTimePerBucketMs);
5564
});
5665
parser.declareString(constructorArg(), JOB_ID);
5766
parser.declareLong(optionalConstructorArg(), SEARCH_COUNT);
67+
parser.declareLong(optionalConstructorArg(), BUCKET_COUNT);
5868
parser.declareDouble(optionalConstructorArg(), TOTAL_SEARCH_TIME_MS);
69+
parser.declareDouble(optionalConstructorArg(), AVG_SEARCH_TIME_PER_BUCKET_MS);
5970
return parser;
6071
}
6172

6273
private final String jobId;
6374
private long searchCount;
75+
private long bucketCount;
6476
private double totalSearchTimeMs;
77+
private Double avgSearchTimePerBucketMs;
6578

66-
public DatafeedTimingStats(String jobId, long searchCount, double totalSearchTimeMs) {
79+
public DatafeedTimingStats(
80+
String jobId, long searchCount, long bucketCount, double totalSearchTimeMs, @Nullable Double avgSearchTimePerBucketMs) {
6781
this.jobId = Objects.requireNonNull(jobId);
6882
this.searchCount = searchCount;
83+
this.bucketCount = bucketCount;
6984
this.totalSearchTimeMs = totalSearchTimeMs;
85+
this.avgSearchTimePerBucketMs = avgSearchTimePerBucketMs;
7086
}
7187

7288
public String getJobId() {
@@ -77,16 +93,28 @@ public long getSearchCount() {
7793
return searchCount;
7894
}
7995

96+
public long getBucketCount() {
97+
return bucketCount;
98+
}
99+
80100
public double getTotalSearchTimeMs() {
81101
return totalSearchTimeMs;
82102
}
83103

104+
public Double getAvgSearchTimePerBucketMs() {
105+
return avgSearchTimePerBucketMs;
106+
}
107+
84108
@Override
85109
public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params params) throws IOException {
86110
builder.startObject();
87111
builder.field(JOB_ID.getPreferredName(), jobId);
88112
builder.field(SEARCH_COUNT.getPreferredName(), searchCount);
113+
builder.field(BUCKET_COUNT.getPreferredName(), bucketCount);
89114
builder.field(TOTAL_SEARCH_TIME_MS.getPreferredName(), totalSearchTimeMs);
115+
if (avgSearchTimePerBucketMs != null) {
116+
builder.field(AVG_SEARCH_TIME_PER_BUCKET_MS.getPreferredName(), avgSearchTimePerBucketMs);
117+
}
90118
builder.endObject();
91119
return builder;
92120
}
@@ -103,12 +131,14 @@ public boolean equals(Object obj) {
103131
DatafeedTimingStats other = (DatafeedTimingStats) obj;
104132
return Objects.equals(this.jobId, other.jobId)
105133
&& this.searchCount == other.searchCount
106-
&& this.totalSearchTimeMs == other.totalSearchTimeMs;
134+
&& this.bucketCount == other.bucketCount
135+
&& this.totalSearchTimeMs == other.totalSearchTimeMs
136+
&& Objects.equals(this.avgSearchTimePerBucketMs, other.avgSearchTimePerBucketMs);
107137
}
108138

109139
@Override
110140
public int hashCode() {
111-
return Objects.hash(jobId, searchCount, totalSearchTimeMs);
141+
return Objects.hash(jobId, searchCount, bucketCount, totalSearchTimeMs, avgSearchTimePerBucketMs);
112142
}
113143

114144
@Override

client/rest-high-level/src/main/java/org/elasticsearch/client/ml/job/process/TimingStats.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
public class TimingStats implements ToXContentObject {
4040

4141
public static final ParseField BUCKET_COUNT = new ParseField("bucket_count");
42+
public static final ParseField TOTAL_BUCKET_PROCESSING_TIME_MS = new ParseField("total_bucket_processing_time_ms");
4243
public static final ParseField MIN_BUCKET_PROCESSING_TIME_MS = new ParseField("minimum_bucket_processing_time_ms");
4344
public static final ParseField MAX_BUCKET_PROCESSING_TIME_MS = new ParseField("maximum_bucket_processing_time_ms");
4445
public static final ParseField AVG_BUCKET_PROCESSING_TIME_MS = new ParseField("average_bucket_processing_time_ms");
@@ -49,12 +50,28 @@ public class TimingStats implements ToXContentObject {
4950
new ConstructingObjectParser<>(
5051
"timing_stats",
5152
true,
52-
args ->
53-
new TimingStats((String) args[0], (long) args[1], (Double) args[2], (Double) args[3], (Double) args[4], (Double) args[5]));
53+
args -> {
54+
String jobId = (String) args[0];
55+
Long bucketCount = (Long) args[1];
56+
Double totalBucketProcessingTimeMs = (Double) args[2];
57+
Double minBucketProcessingTimeMs = (Double) args[3];
58+
Double maxBucketProcessingTimeMs = (Double) args[4];
59+
Double avgBucketProcessingTimeMs = (Double) args[5];
60+
Double exponentialAvgBucketProcessingTimeMs = (Double) args[6];
61+
return new TimingStats(
62+
jobId,
63+
getOrDefault(bucketCount, 0L),
64+
getOrDefault(totalBucketProcessingTimeMs, 0.0),
65+
minBucketProcessingTimeMs,
66+
maxBucketProcessingTimeMs,
67+
avgBucketProcessingTimeMs,
68+
exponentialAvgBucketProcessingTimeMs);
69+
});
5470

5571
static {
5672
PARSER.declareString(constructorArg(), Job.ID);
57-
PARSER.declareLong(constructorArg(), BUCKET_COUNT);
73+
PARSER.declareLong(optionalConstructorArg(), BUCKET_COUNT);
74+
PARSER.declareDouble(optionalConstructorArg(), TOTAL_BUCKET_PROCESSING_TIME_MS);
5875
PARSER.declareDouble(optionalConstructorArg(), MIN_BUCKET_PROCESSING_TIME_MS);
5976
PARSER.declareDouble(optionalConstructorArg(), MAX_BUCKET_PROCESSING_TIME_MS);
6077
PARSER.declareDouble(optionalConstructorArg(), AVG_BUCKET_PROCESSING_TIME_MS);
@@ -63,6 +80,7 @@ public class TimingStats implements ToXContentObject {
6380

6481
private final String jobId;
6582
private long bucketCount;
83+
private double totalBucketProcessingTimeMs;
6684
private Double minBucketProcessingTimeMs;
6785
private Double maxBucketProcessingTimeMs;
6886
private Double avgBucketProcessingTimeMs;
@@ -71,12 +89,14 @@ public class TimingStats implements ToXContentObject {
7189
public TimingStats(
7290
String jobId,
7391
long bucketCount,
92+
double totalBucketProcessingTimeMs,
7493
@Nullable Double minBucketProcessingTimeMs,
7594
@Nullable Double maxBucketProcessingTimeMs,
7695
@Nullable Double avgBucketProcessingTimeMs,
7796
@Nullable Double exponentialAvgBucketProcessingTimeMs) {
7897
this.jobId = jobId;
7998
this.bucketCount = bucketCount;
99+
this.totalBucketProcessingTimeMs = totalBucketProcessingTimeMs;
80100
this.minBucketProcessingTimeMs = minBucketProcessingTimeMs;
81101
this.maxBucketProcessingTimeMs = maxBucketProcessingTimeMs;
82102
this.avgBucketProcessingTimeMs = avgBucketProcessingTimeMs;
@@ -91,6 +111,10 @@ public long getBucketCount() {
91111
return bucketCount;
92112
}
93113

114+
public double getTotalBucketProcessingTimeMs() {
115+
return totalBucketProcessingTimeMs;
116+
}
117+
94118
public Double getMinBucketProcessingTimeMs() {
95119
return minBucketProcessingTimeMs;
96120
}
@@ -112,6 +136,7 @@ public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params par
112136
builder.startObject();
113137
builder.field(Job.ID.getPreferredName(), jobId);
114138
builder.field(BUCKET_COUNT.getPreferredName(), bucketCount);
139+
builder.field(TOTAL_BUCKET_PROCESSING_TIME_MS.getPreferredName(), totalBucketProcessingTimeMs);
115140
if (minBucketProcessingTimeMs != null) {
116141
builder.field(MIN_BUCKET_PROCESSING_TIME_MS.getPreferredName(), minBucketProcessingTimeMs);
117142
}
@@ -135,6 +160,7 @@ public boolean equals(Object o) {
135160
TimingStats that = (TimingStats) o;
136161
return Objects.equals(this.jobId, that.jobId)
137162
&& this.bucketCount == that.bucketCount
163+
&& this.totalBucketProcessingTimeMs == that.totalBucketProcessingTimeMs
138164
&& Objects.equals(this.minBucketProcessingTimeMs, that.minBucketProcessingTimeMs)
139165
&& Objects.equals(this.maxBucketProcessingTimeMs, that.maxBucketProcessingTimeMs)
140166
&& Objects.equals(this.avgBucketProcessingTimeMs, that.avgBucketProcessingTimeMs)
@@ -146,6 +172,7 @@ public int hashCode() {
146172
return Objects.hash(
147173
jobId,
148174
bucketCount,
175+
totalBucketProcessingTimeMs,
149176
minBucketProcessingTimeMs,
150177
maxBucketProcessingTimeMs,
151178
avgBucketProcessingTimeMs,
@@ -156,4 +183,8 @@ public int hashCode() {
156183
public String toString() {
157184
return Strings.toString(this);
158185
}
186+
187+
private static <T> T getOrDefault(@Nullable T value, T defaultValue) {
188+
return value != null ? value : defaultValue;
189+
}
159190
}

client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedTimingStatsTests.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@
2727
import java.io.IOException;
2828

2929
import static org.hamcrest.Matchers.equalTo;
30+
import static org.hamcrest.Matchers.nullValue;
3031

3132
public class DatafeedTimingStatsTests extends AbstractXContentTestCase<DatafeedTimingStats> {
3233

3334
private static final String JOB_ID = "my-job-id";
3435

3536
public static DatafeedTimingStats createRandomInstance() {
36-
return new DatafeedTimingStats(randomAlphaOfLength(10), randomLong(), randomDouble());
37+
return new DatafeedTimingStats(
38+
randomAlphaOfLength(10), randomLong(), randomLong(), randomDouble(), randomBoolean() ? null : randomDouble());
3739
}
3840

3941
@Override
@@ -59,34 +61,38 @@ public void testParse_OptionalFieldsAbsent() throws IOException {
5961
DatafeedTimingStats stats = DatafeedTimingStats.PARSER.apply(parser, null);
6062
assertThat(stats.getJobId(), equalTo(JOB_ID));
6163
assertThat(stats.getSearchCount(), equalTo(0L));
64+
assertThat(stats.getBucketCount(), equalTo(0L));
6265
assertThat(stats.getTotalSearchTimeMs(), equalTo(0.0));
66+
assertThat(stats.getAvgSearchTimePerBucketMs(), nullValue());
6367
}
6468
}
6569

6670
public void testEquals() {
67-
DatafeedTimingStats stats1 = new DatafeedTimingStats(JOB_ID, 5, 100.0);
68-
DatafeedTimingStats stats2 = new DatafeedTimingStats(JOB_ID, 5, 100.0);
69-
DatafeedTimingStats stats3 = new DatafeedTimingStats(JOB_ID, 5, 200.0);
71+
DatafeedTimingStats stats1 = new DatafeedTimingStats(JOB_ID, 5, 10, 100.0, 20.0);
72+
DatafeedTimingStats stats2 = new DatafeedTimingStats(JOB_ID, 5, 10, 100.0, 20.0);
73+
DatafeedTimingStats stats3 = new DatafeedTimingStats(JOB_ID, 5, 10, 200.0, 20.0);
7074

7175
assertTrue(stats1.equals(stats1));
7276
assertTrue(stats1.equals(stats2));
7377
assertFalse(stats2.equals(stats3));
7478
}
7579

7680
public void testHashCode() {
77-
DatafeedTimingStats stats1 = new DatafeedTimingStats(JOB_ID, 5, 100.0);
78-
DatafeedTimingStats stats2 = new DatafeedTimingStats(JOB_ID, 5, 100.0);
79-
DatafeedTimingStats stats3 = new DatafeedTimingStats(JOB_ID, 5, 200.0);
81+
DatafeedTimingStats stats1 = new DatafeedTimingStats(JOB_ID, 5, 10, 100.0, 20.0);
82+
DatafeedTimingStats stats2 = new DatafeedTimingStats(JOB_ID, 5, 10, 100.0, 20.0);
83+
DatafeedTimingStats stats3 = new DatafeedTimingStats(JOB_ID, 5, 10, 200.0, 20.0);
8084

8185
assertEquals(stats1.hashCode(), stats1.hashCode());
8286
assertEquals(stats1.hashCode(), stats2.hashCode());
8387
assertNotEquals(stats2.hashCode(), stats3.hashCode());
8488
}
8589

8690
public void testConstructorAndGetters() {
87-
DatafeedTimingStats stats = new DatafeedTimingStats(JOB_ID, 5, 123.456);
91+
DatafeedTimingStats stats = new DatafeedTimingStats(JOB_ID, 5, 10, 123.456, 78.9);
8892
assertThat(stats.getJobId(), equalTo(JOB_ID));
8993
assertThat(stats.getSearchCount(), equalTo(5L));
94+
assertThat(stats.getBucketCount(), equalTo(10L));
9095
assertThat(stats.getTotalSearchTimeMs(), equalTo(123.456));
96+
assertThat(stats.getAvgSearchTimePerBucketMs(), equalTo(78.9));
9197
}
9298
}

client/rest-high-level/src/test/java/org/elasticsearch/client/ml/job/process/TimingStatsTests.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@
1818
*/
1919
package org.elasticsearch.client.ml.job.process;
2020

21+
import org.elasticsearch.common.xcontent.DeprecationHandler;
22+
import org.elasticsearch.common.xcontent.XContentFactory;
2123
import org.elasticsearch.common.xcontent.XContentParser;
24+
import org.elasticsearch.common.xcontent.XContentType;
2225
import org.elasticsearch.test.AbstractXContentTestCase;
2326

27+
import java.io.IOException;
28+
2429
import static org.hamcrest.Matchers.equalTo;
2530
import static org.hamcrest.Matchers.nullValue;
2631

@@ -32,6 +37,7 @@ public static TimingStats createTestInstance(String jobId) {
3237
return new TimingStats(
3338
jobId,
3439
randomLong(),
40+
randomDouble(),
3541
randomBoolean() ? null : randomDouble(),
3642
randomBoolean() ? null : randomDouble(),
3743
randomBoolean() ? null : randomDouble(),
@@ -54,41 +60,59 @@ protected boolean supportsUnknownFields() {
5460
}
5561

5662
public void testConstructor() {
57-
TimingStats stats = new TimingStats(JOB_ID, 7, 1.0, 2.0, 1.23, 7.89);
63+
TimingStats stats = new TimingStats(JOB_ID, 7, 8.61, 1.0, 2.0, 1.23, 7.89);
5864

5965
assertThat(stats.getJobId(), equalTo(JOB_ID));
6066
assertThat(stats.getBucketCount(), equalTo(7L));
67+
assertThat(stats.getTotalBucketProcessingTimeMs(), equalTo(8.61));
6168
assertThat(stats.getMinBucketProcessingTimeMs(), equalTo(1.0));
6269
assertThat(stats.getMaxBucketProcessingTimeMs(), equalTo(2.0));
6370
assertThat(stats.getAvgBucketProcessingTimeMs(), equalTo(1.23));
6471
assertThat(stats.getExponentialAvgBucketProcessingTimeMs(), equalTo(7.89));
6572
}
6673

6774
public void testConstructor_NullValues() {
68-
TimingStats stats = new TimingStats(JOB_ID, 7, null, null, null, null);
75+
TimingStats stats = new TimingStats(JOB_ID, 7, 8.61, null, null, null, null);
6976

7077
assertThat(stats.getJobId(), equalTo(JOB_ID));
7178
assertThat(stats.getBucketCount(), equalTo(7L));
79+
assertThat(stats.getTotalBucketProcessingTimeMs(), equalTo(8.61));
7280
assertThat(stats.getMinBucketProcessingTimeMs(), nullValue());
7381
assertThat(stats.getMaxBucketProcessingTimeMs(), nullValue());
7482
assertThat(stats.getAvgBucketProcessingTimeMs(), nullValue());
7583
assertThat(stats.getExponentialAvgBucketProcessingTimeMs(), nullValue());
7684
}
7785

86+
public void testParse_OptionalFieldsAbsent() throws IOException {
87+
String json = "{\"job_id\": \"my-job-id\"}";
88+
try (XContentParser parser =
89+
XContentFactory.xContent(XContentType.JSON).createParser(
90+
xContentRegistry(), DeprecationHandler.THROW_UNSUPPORTED_OPERATION, json)) {
91+
TimingStats stats = TimingStats.PARSER.apply(parser, null);
92+
assertThat(stats.getJobId(), equalTo(JOB_ID));
93+
assertThat(stats.getBucketCount(), equalTo(0L));
94+
assertThat(stats.getTotalBucketProcessingTimeMs(), equalTo(0.0));
95+
assertThat(stats.getMinBucketProcessingTimeMs(), nullValue());
96+
assertThat(stats.getMaxBucketProcessingTimeMs(), nullValue());
97+
assertThat(stats.getAvgBucketProcessingTimeMs(), nullValue());
98+
assertThat(stats.getExponentialAvgBucketProcessingTimeMs(), nullValue());
99+
}
100+
}
101+
78102
public void testEquals() {
79-
TimingStats stats1 = new TimingStats(JOB_ID, 7, 1.0, 2.0, 1.23, 7.89);
80-
TimingStats stats2 = new TimingStats(JOB_ID, 7, 1.0, 2.0, 1.23, 7.89);
81-
TimingStats stats3 = new TimingStats(JOB_ID, 7, 1.0, 3.0, 1.23, 7.89);
103+
TimingStats stats1 = new TimingStats(JOB_ID, 7, 8.61, 1.0, 2.0, 1.23, 7.89);
104+
TimingStats stats2 = new TimingStats(JOB_ID, 7, 8.61, 1.0, 2.0, 1.23, 7.89);
105+
TimingStats stats3 = new TimingStats(JOB_ID, 7, 8.61, 1.0, 3.0, 1.23, 7.89);
82106

83107
assertTrue(stats1.equals(stats1));
84108
assertTrue(stats1.equals(stats2));
85109
assertFalse(stats2.equals(stats3));
86110
}
87111

88112
public void testHashCode() {
89-
TimingStats stats1 = new TimingStats(JOB_ID, 7, 1.0, 2.0, 1.23, 7.89);
90-
TimingStats stats2 = new TimingStats(JOB_ID, 7, 1.0, 2.0, 1.23, 7.89);
91-
TimingStats stats3 = new TimingStats(JOB_ID, 7, 1.0, 3.0, 1.23, 7.89);
113+
TimingStats stats1 = new TimingStats(JOB_ID, 7, 8.61, 1.0, 2.0, 1.23, 7.89);
114+
TimingStats stats2 = new TimingStats(JOB_ID, 7, 8.61, 1.0, 2.0, 1.23, 7.89);
115+
TimingStats stats3 = new TimingStats(JOB_ID, 7, 8.61, 1.0, 3.0, 1.23, 7.89);
92116

93117
assertEquals(stats1.hashCode(), stats1.hashCode());
94118
assertEquals(stats1.hashCode(), stats2.hashCode());

0 commit comments

Comments
 (0)