Skip to content

Commit 66dcc4b

Browse files
refactor with latest changes from main
1 parent bf489f4 commit 66dcc4b

File tree

4 files changed

+38
-18
lines changed

4 files changed

+38
-18
lines changed

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

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,15 @@ public ShardSearchPhaseAPMMetrics(MeterRegistry meterRegistry) {
5757
}
5858

5959
@Override
60-
public void onCanMatchPhase(ShardSearchRequest shardSearchRequest, long tookInNanos) {
61-
recordPhaseLatency(
62-
canMatchPhaseMetric,
63-
tookInNanos,
64-
shardSearchRequest,
65-
null // we don't have the time range filter info at this point in the search
66-
);
60+
public void onCanMatchPhase(Map<String, Object> searchRequestAttributes, long tookInNanos) {
61+
canMatchPhaseMetric.record(TimeUnit.NANOSECONDS.toMillis(tookInNanos), searchRequestAttributes);
6762
}
6863

6964
@Override
7065
public void onDfsPhase(SearchContext searchContext, long tookInNanos) {
71-
recordPhaseLatency(dfsPhaseMetric, tookInNanos);
66+
SearchExecutionContext searchExecutionContext = searchContext.getSearchExecutionContext();
67+
Long timeRangeFilterFromMillis = searchExecutionContext.getTimeRangeFilterFromMillis();
68+
recordPhaseLatency(dfsPhaseMetric, tookInNanos, searchContext.request(), timeRangeFilterFromMillis);
7269
}
7370

7471
@Override
@@ -85,10 +82,6 @@ public void onFetchPhase(SearchContext searchContext, long tookInNanos) {
8582
recordPhaseLatency(fetchPhaseMetric, tookInNanos, searchContext.request(), timeRangeFilterFromMillis);
8683
}
8784

88-
private static void recordPhaseLatency(LongHistogram histogramMetric, long tookInNanos) {
89-
histogramMetric.record(TimeUnit.NANOSECONDS.toMillis(tookInNanos));
90-
}
91-
9285
private static void recordPhaseLatency(
9386
LongHistogram histogramMetric,
9487
long tookInNanos,

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
import org.elasticsearch.ExceptionsHelper;
1313
import org.elasticsearch.search.internal.ReaderContext;
1414
import org.elasticsearch.search.internal.SearchContext;
15-
import org.elasticsearch.search.internal.ShardSearchRequest;
1615
import org.elasticsearch.transport.TransportRequest;
1716

1817
import java.util.List;
18+
import java.util.Map;
1919

2020
/**
2121
* An listener for search, fetch and context events.
@@ -92,10 +92,10 @@ default void onFailedDfsPhase(SearchContext searchContext) {}
9292
* Executed after the can-match phase successfully finished.
9393
* Note: this is not invoked if the can match phase execution failed.
9494
*
95-
* @param shardSearchRequest the current shard search request
95+
* @param searchRequestAttributes the attributes of the search request
9696
* @param tookInNanos the number of nanoseconds the can-match execution took
9797
*/
98-
default void onCanMatchPhase(ShardSearchRequest shardSearchRequest, long tookInNanos) {}
98+
default void onCanMatchPhase(Map<String, Object> searchRequestAttributes, long tookInNanos) {}
9999

100100
/**
101101
* Executed when a new reader context was created
@@ -248,10 +248,10 @@ public void onDfsPhase(SearchContext searchContext, long tookInNanos) {
248248
}
249249

250250
@Override
251-
public void onCanMatchPhase(ShardSearchRequest shardSearchRequest, long tookInNanos) {
251+
public void onCanMatchPhase(Map<String, Object> searchRequestAttributes, long tookInNanos) {
252252
for (SearchOperationListener listener : listeners) {
253253
try {
254-
listener.onCanMatchPhase(shardSearchRequest, tookInNanos);
254+
listener.onCanMatchPhase(searchRequestAttributes, tookInNanos);
255255
} catch (Exception e) {
256256
logger.warn(() -> "onCanMatchPhase listener [" + listener + "] failed", e);
257257
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.elasticsearch.action.search.CanMatchNodeRequest;
2727
import org.elasticsearch.action.search.CanMatchNodeResponse;
2828
import org.elasticsearch.action.search.OnlinePrewarmingService;
29+
import org.elasticsearch.action.search.SearchRequestAttributesExtractor;
2930
import org.elasticsearch.action.search.SearchShardTask;
3031
import org.elasticsearch.action.search.SearchType;
3132
import org.elasticsearch.action.support.TransportActions;
@@ -1936,6 +1937,7 @@ public AliasFilter buildAliasFilter(ProjectState state, String index, Set<Resolv
19361937
public void canMatch(CanMatchNodeRequest request, ActionListener<CanMatchNodeResponse> listener) {
19371938
var shardLevelRequests = request.getShardLevelRequests();
19381939
final List<CanMatchNodeResponse.ResponseOrFailure> responses = new ArrayList<>(shardLevelRequests.size());
1940+
Map<String, Object> searchRequestAttributes = null;
19391941
for (var shardLevelRequest : shardLevelRequests) {
19401942
long shardCanMatchStartTimeInNanos = System.nanoTime();
19411943
ShardSearchRequest shardSearchRequest = request.createShardSearchRequest(shardLevelRequest);
@@ -1946,7 +1948,18 @@ public void canMatch(CanMatchNodeRequest request, ActionListener<CanMatchNodeRes
19461948
CanMatchContext canMatchContext = createCanMatchContext(shardSearchRequest);
19471949
CanMatchShardResponse canMatchShardResponse = canMatch(canMatchContext, true);
19481950
responses.add(new CanMatchNodeResponse.ResponseOrFailure(canMatchShardResponse));
1949-
indexShard.getSearchOperationListener().onCanMatchPhase(System.nanoTime() - shardCanMatchStartTimeInNanos);
1951+
1952+
if (searchRequestAttributes == null) {
1953+
// All of the shards in the request are for the same search, so the attributes will be the same for all shards.
1954+
searchRequestAttributes = SearchRequestAttributesExtractor.extractAttributes(
1955+
shardSearchRequest,
1956+
canMatchContext.getTimeRangeFilterFromMillis(),
1957+
shardSearchRequest.nowInMillis()
1958+
);
1959+
}
1960+
1961+
indexShard.getSearchOperationListener()
1962+
.onCanMatchPhase(searchRequestAttributes, System.nanoTime() - shardCanMatchStartTimeInNanos);
19501963
} catch (Exception e) {
19511964
responses.add(new CanMatchNodeResponse.ResponseOrFailure(e));
19521965
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public void testMetricsDfsQueryThenFetch() {
101101
);
102102
final List<Measurement> dfsMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(DFS_SEARCH_PHASE_METRIC);
103103
assertEquals(num_primaries, dfsMeasurements.size());
104+
assertAttributes(dfsMeasurements, false, false);
104105
final List<Measurement> queryMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(QUERY_SEARCH_PHASE_METRIC);
105106
assertEquals(num_primaries, queryMeasurements.size());
106107
final List<Measurement> fetchMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(FETCH_SEARCH_PHASE_METRIC);
@@ -117,8 +118,10 @@ public void testMetricsDfsQueryThenFetchSystem() {
117118
);
118119
final List<Measurement> dfsMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(DFS_SEARCH_PHASE_METRIC);
119120
assertEquals(0, dfsMeasurements.size()); // DFS phase not done for index with single shard
121+
assertAttributes(dfsMeasurements, true, false);
120122
final List<Measurement> queryMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(QUERY_SEARCH_PHASE_METRIC);
121123
assertEquals(1, queryMeasurements.size());
124+
assertAttributes(queryMeasurements, true, false);
122125
final List<Measurement> fetchMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(FETCH_SEARCH_PHASE_METRIC);
123126
assertEquals(1, fetchMeasurements.size());
124127
assertAttributes(fetchMeasurements, true, false);
@@ -369,6 +372,17 @@ public void testTimeRangeFilterAllResults() {
369372
});
370373
final List<Measurement> canMatchMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(CAN_MATCH_SEARCH_PHASE_METRIC);
371374
assertEquals(num_primaries, canMatchMeasurements.size());
375+
for (Measurement measurement : canMatchMeasurements) {
376+
Map<String, Object> attributes = measurement.attributes();
377+
assertEquals(5, attributes.size());
378+
assertEquals("user", attributes.get("target"));
379+
assertEquals("hits_only", attributes.get("query_type"));
380+
assertEquals("_score", attributes.get("sort"));
381+
assertEquals(false, attributes.get(SearchRequestAttributesExtractor.SYSTEM_THREAD_ATTRIBUTE_NAME));
382+
// the range query was rewritten to one without bounds: we do track the time range filter from value but we don't set
383+
// the time range filter field because no range query is executed at the shard level.
384+
assertEquals("older_than_14_days", attributes.get("time_range_filter_from"));
385+
}
372386
final List<Measurement> queryMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(QUERY_SEARCH_PHASE_METRIC);
373387
// the two docs are at most spread across two shards, other shards are empty and get filtered out
374388
assertThat(queryMeasurements.size(), Matchers.lessThanOrEqualTo(2));

0 commit comments

Comments
 (0)