Skip to content

Commit a4c0993

Browse files
add search context
1 parent 75a63a0 commit a4c0993

File tree

4 files changed

+23
-12
lines changed

4 files changed

+23
-12
lines changed

server/src/main/java/org/elasticsearch/index/search/stats/ShardSearchPhaseAPMMetrics.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ public ShardSearchPhaseAPMMetrics(MeterRegistry meterRegistry) {
5757
}
5858

5959
@Override
60-
public void onCanMatchPhase(long tookInNanos) {
61-
recordPhaseLatency(canMatchPhaseMetric, tookInNanos);
60+
public void onCanMatchPhase(SearchContext searchContext, long tookInNanos) {
61+
SearchExecutionContext searchExecutionContext = searchContext.getSearchExecutionContext();
62+
Long timeRangeFilterFromMillis = searchExecutionContext.getTimeRangeFilterFromMillis();
63+
recordPhaseLatency(canMatchPhaseMetric, tookInNanos, searchContext.request(), timeRangeFilterFromMillis);
6264
}
6365

6466
@Override

server/src/main/java/org/elasticsearch/index/shard/SearchOperationListener.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,10 @@ default void onFailedDfsPhase(SearchContext searchContext) {}
9191
* Executed after the can-match phase successfully finished.
9292
* Note: this is not invoked if the can match phase execution failed.
9393
*
94+
* @param searchContext the current search context
9495
* @param tookInNanos the number of nanoseconds the can-match execution took
9596
*/
96-
default void onCanMatchPhase(long tookInNanos) {}
97+
default void onCanMatchPhase(SearchContext searchContext, long tookInNanos) {}
9798

9899
/**
99100
* Executed when a new reader context was created
@@ -246,10 +247,10 @@ public void onDfsPhase(SearchContext searchContext, long tookInNanos) {
246247
}
247248

248249
@Override
249-
public void onCanMatchPhase(long tookInNanos) {
250+
public void onCanMatchPhase(SearchContext searchContext, long tookInNanos) {
250251
for (SearchOperationListener listener : listeners) {
251252
try {
252-
listener.onCanMatchPhase(tookInNanos);
253+
listener.onCanMatchPhase(searchContext, tookInNanos);
253254
} catch (Exception e) {
254255
logger.warn(() -> "onCanMatchPhase listener [" + listener + "] failed", e);
255256
}

server/src/main/java/org/elasticsearch/search/SearchService.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,14 +1938,13 @@ public void canMatch(CanMatchNodeRequest request, ActionListener<CanMatchNodeRes
19381938
final List<CanMatchNodeResponse.ResponseOrFailure> responses = new ArrayList<>(shardLevelRequests.size());
19391939
for (var shardLevelRequest : shardLevelRequests) {
19401940
long shardCanMatchStartTimeInNanos = System.nanoTime();
1941-
ShardSearchRequest shardSearchRequest = request.createShardSearchRequest(shardLevelRequest);
1941+
final ShardSearchRequest shardSearchRequest = request.createShardSearchRequest(shardLevelRequest);
19421942
final IndexService indexService = indicesService.indexServiceSafe(shardSearchRequest.shardId().getIndex());
19431943
final IndexShard indexShard = indexService.getShard(shardSearchRequest.shardId().id());
1944-
try {
1945-
// TODO remove the exception handling as it's now in canMatch itself
1944+
try (SearchContext searchContext = createSearchContext(shardSearchRequest, defaultSearchTimeout)) {
19461945
responses.add(new CanMatchNodeResponse.ResponseOrFailure(canMatch(shardSearchRequest)));
1947-
indexShard.getSearchOperationListener().onCanMatchPhase(System.nanoTime() - shardCanMatchStartTimeInNanos);
1948-
} catch (Exception e) {
1946+
indexShard.getSearchOperationListener().onCanMatchPhase(searchContext, System.nanoTime() - shardCanMatchStartTimeInNanos);
1947+
} catch (IOException e) {
19491948
responses.add(new CanMatchNodeResponse.ResponseOrFailure(e));
19501949
}
19511950
}

server/src/test/java/org/elasticsearch/search/TelemetryMetrics/ShardSearchPhaseAPMMetricsTests.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,15 @@ public void testCanMatchSearch() {
265265
"1"
266266
);
267267

268-
final List<Measurement> fetchMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(CAN_MATCH_SEARCH_PHASE_METRIC);
269-
assertEquals(num_primaries, fetchMeasurements.size());
268+
final List<Measurement> canMatchMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(CAN_MATCH_SEARCH_PHASE_METRIC);
269+
assertEquals(num_primaries, canMatchMeasurements.size());
270+
assertAttributes(canMatchMeasurements, false, false);
271+
final List<Measurement> queryMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(QUERY_SEARCH_PHASE_METRIC);
272+
assertEquals(num_primaries, queryMeasurements.size());
273+
assertAttributes(queryMeasurements, false, false);
274+
final List<Measurement> fetchMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(FETCH_SEARCH_PHASE_METRIC);
275+
assertEquals(1, fetchMeasurements.size());
276+
assertAttributes(fetchMeasurements, false, false);
270277
}
271278

272279
private static void assertAttributes(List<Measurement> measurements, boolean isSystem, boolean isScroll) {
@@ -360,6 +367,8 @@ public void testTimeRangeFilterAllResults() {
360367
assertSearchHits(searchResponse, "1", "2");
361368
assertThat(searchResponse.getSkippedShards(), Matchers.greaterThanOrEqualTo(num_primaries - 2));
362369
});
370+
final List<Measurement> canMatchMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(CAN_MATCH_SEARCH_PHASE_METRIC);
371+
assertEquals(num_primaries, canMatchMeasurements.size());
363372
final List<Measurement> queryMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(QUERY_SEARCH_PHASE_METRIC);
364373
// the two docs are at most spread across two shards, other shards are empty and get filtered out
365374
assertThat(queryMeasurements.size(), Matchers.lessThanOrEqualTo(2));

0 commit comments

Comments
 (0)