Skip to content

Commit cc0b9e6

Browse files
can match coordinator metric
1 parent a2d71ef commit cc0b9e6

File tree

7 files changed

+39
-15
lines changed

7 files changed

+39
-15
lines changed

server/src/main/java/org/elasticsearch/action/search/CanMatchPreFilterSearchPhase.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.elasticsearch.core.Nullable;
2020
import org.elasticsearch.index.query.CoordinatorRewriteContext;
2121
import org.elasticsearch.index.query.CoordinatorRewriteContextProvider;
22+
import org.elasticsearch.rest.action.search.SearchResponseMetrics;
2223
import org.elasticsearch.search.CanMatchShardResponse;
2324
import org.elasticsearch.search.SearchService;
2425
import org.elasticsearch.search.SearchShardTarget;
@@ -76,6 +77,8 @@ final class CanMatchPreFilterSearchPhase {
7677
private final MinAndMax<?>[] minAndMaxes;
7778
private int numPossibleMatches;
7879
private final CoordinatorRewriteContextProvider coordinatorRewriteContextProvider;
80+
private final SearchResponseMetrics searchResponseMetrics;
81+
private long phaseStartTimeInNanos;
7982

8083
private CanMatchPreFilterSearchPhase(
8184
Logger logger,
@@ -90,7 +93,8 @@ private CanMatchPreFilterSearchPhase(
9093
SearchTask task,
9194
boolean requireAtLeastOneMatch,
9295
CoordinatorRewriteContextProvider coordinatorRewriteContextProvider,
93-
ActionListener<List<SearchShardIterator>> listener
96+
ActionListener<List<SearchShardIterator>> listener,
97+
SearchResponseMetrics searchResponseMetrics
9498
) {
9599
this.logger = logger;
96100
this.searchTransportService = searchTransportService;
@@ -122,6 +126,7 @@ private CanMatchPreFilterSearchPhase(
122126
shardItIndexMap.put(naturalOrder[j], j);
123127
}
124128
this.shardItIndexMap = shardItIndexMap;
129+
this.searchResponseMetrics = searchResponseMetrics;
125130
}
126131

127132
public static SubscribableListener<List<SearchShardIterator>> execute(
@@ -136,7 +141,8 @@ public static SubscribableListener<List<SearchShardIterator>> execute(
136141
TransportSearchAction.SearchTimeProvider timeProvider,
137142
SearchTask task,
138143
boolean requireAtLeastOneMatch,
139-
CoordinatorRewriteContextProvider coordinatorRewriteContextProvider
144+
CoordinatorRewriteContextProvider coordinatorRewriteContextProvider,
145+
SearchResponseMetrics searchResponseMetrics
140146
) {
141147
if (shardsIts.isEmpty()) {
142148
return SubscribableListener.newSucceeded(List.of());
@@ -168,7 +174,8 @@ protected void doRun() {
168174
task,
169175
requireAtLeastOneMatch,
170176
coordinatorRewriteContextProvider,
171-
listener
177+
listener,
178+
searchResponseMetrics
172179
).runCoordinatorRewritePhase();
173180
}
174181
});
@@ -184,6 +191,7 @@ private static boolean assertSearchCoordinationThread() {
184191
private void runCoordinatorRewritePhase() {
185192
// TODO: the index filter (i.e, `_index:patten`) should be prefiltered on the coordinator
186193
assert assertSearchCoordinationThread();
194+
phaseStartTimeInNanos = System.nanoTime();
187195
final List<SearchShardIterator> matchedShardLevelRequests = new ArrayList<>();
188196
for (SearchShardIterator searchShardIterator : shardsIts) {
189197
final CanMatchNodeRequest canMatchNodeRequest = new CanMatchNodeRequest(
@@ -223,6 +231,10 @@ private void runCoordinatorRewritePhase() {
223231
checkNoMissingShards(matchedShardLevelRequests);
224232
new Round(matchedShardLevelRequests).run();
225233
}
234+
// this could be null in the case where this phase is running in a remote cluster
235+
if (searchResponseMetrics != null) {
236+
searchResponseMetrics.recordSearchPhaseDuration("can_match", System.nanoTime() - phaseStartTimeInNanos);
237+
}
226238
}
227239

228240
private void consumeResult(boolean canMatch, ShardSearchRequest request) {

server/src/main/java/org/elasticsearch/action/search/TransportOpenPointInTimeAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ public void runNewSearchPhase(
184184
timeProvider,
185185
task,
186186
false,
187-
searchService.getCoordinatorRewriteContextProvider(timeProvider::absoluteStartMillis)
187+
searchService.getCoordinatorRewriteContextProvider(timeProvider::absoluteStartMillis),
188+
searchResponseMetrics
188189
)
189190
.addListener(
190191
listener.delegateFailureAndWrap(

server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1635,7 +1635,8 @@ public void runNewSearchPhase(
16351635
timeProvider,
16361636
task,
16371637
requireAtLeastOneMatch,
1638-
searchService.getCoordinatorRewriteContextProvider(timeProvider::absoluteStartMillis)
1638+
searchService.getCoordinatorRewriteContextProvider(timeProvider::absoluteStartMillis),
1639+
searchResponseMetrics
16391640
)
16401641
.addListener(
16411642
listener.delegateFailureAndWrap(

server/src/main/java/org/elasticsearch/action/search/TransportSearchShardsAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ public void searchShards(Task task, SearchShardsRequest searchShardsRequest, Act
175175
timeProvider,
176176
(SearchTask) task,
177177
false,
178-
searchService.getCoordinatorRewriteContextProvider(timeProvider::absoluteStartMillis)
178+
searchService.getCoordinatorRewriteContextProvider(timeProvider::absoluteStartMillis),
179+
null // do not record a phase duration for can_match in search_shards
179180
)
180181
.addListener(
181182
delegate.map(

server/src/main/java/org/elasticsearch/rest/action/search/SearchResponseMetrics.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ public SearchResponseMetrics(MeterRegistry meterRegistry) {
6666
);
6767

6868
phaseNameToDurationHistogram = Map.of(
69+
"can_match",
70+
meterRegistry.registerLongHistogram(
71+
String.format(Locale.ROOT, SEARCH_PHASE_METRIC_FORMAT, "can_match"),
72+
"The search phase can_match duration in milliseconds at the coordinator, expressed as a histogram",
73+
"millis"
74+
),
6975
"dfs",
7076
meterRegistry.registerLongHistogram(
7177
String.format(Locale.ROOT, SEARCH_PHASE_METRIC_FORMAT, "dfs"),

server/src/test/java/org/elasticsearch/action/search/CanMatchPreFilterSearchPhaseTests.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ public void sendCanMatch(
161161
timeProvider,
162162
null,
163163
true,
164-
EMPTY_CONTEXT_PROVIDER
164+
EMPTY_CONTEXT_PROVIDER,
165+
null
165166
).addListener(ActionTestUtils.assertNoFailureListener(iter -> {
166167
result.set(iter);
167168
latch.countDown();
@@ -256,7 +257,8 @@ public void sendCanMatch(
256257
timeProvider,
257258
null,
258259
true,
259-
EMPTY_CONTEXT_PROVIDER
260+
EMPTY_CONTEXT_PROVIDER,
261+
null
260262
).addListener(ActionTestUtils.assertNoFailureListener(iter -> {
261263
result.set(iter);
262264
latch.countDown();
@@ -347,7 +349,8 @@ public void sendCanMatch(
347349
timeProvider,
348350
null,
349351
true,
350-
EMPTY_CONTEXT_PROVIDER
352+
EMPTY_CONTEXT_PROVIDER,
353+
null
351354
).addListener(ActionTestUtils.assertNoFailureListener(iter -> {
352355
result.set(iter);
353356
latch.countDown();
@@ -446,7 +449,8 @@ public void sendCanMatch(
446449
timeProvider,
447450
null,
448451
shardsIter.size() > shardToSkip.size(),
449-
EMPTY_CONTEXT_PROVIDER
452+
EMPTY_CONTEXT_PROVIDER,
453+
null
450454
).addListener(ActionTestUtils.assertNoFailureListener(iter -> {
451455
result.set(iter);
452456
latch.countDown();
@@ -1418,7 +1422,8 @@ public void sendCanMatch(
14181422
timeProvider,
14191423
null,
14201424
true,
1421-
contextProvider
1425+
contextProvider,
1426+
null
14221427
),
14231428
requests
14241429
);

server/src/test/java/org/elasticsearch/rest/action/search/SearchPhaseCoordinatorAPMMetricsTests.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,9 @@ public void testCanMatchSearch() {
122122
"1"
123123
);
124124

125-
assertMeasurements(
126-
List.of(CAN_MATCH_SEARCH_PHASE_METRIC, FETCH_SEARCH_PHASE_METRIC, QUERY_SEARCH_PHASE_METRIC)
127-
);
128-
125+
assertMeasurements(List.of(CAN_MATCH_SEARCH_PHASE_METRIC, FETCH_SEARCH_PHASE_METRIC, QUERY_SEARCH_PHASE_METRIC));
129126
}
127+
130128
private void resetMeter() {
131129
getTestTelemetryPlugin().resetMeter();
132130
}

0 commit comments

Comments
 (0)