Skip to content

Commit cb2907a

Browse files
DFS search phase per shard duration APM metric (#135652)
* Adds a per shard duration APM metric for the DFS search phase called es.search.shards.phases.query.duration.histogram
1 parent abd101d commit cb2907a

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

docs/changelog/135652.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 135652
2+
summary: DFS search phase per shard duration APM metric
3+
area: Search
4+
type: enhancement
5+
issues: []

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,20 @@
2222

2323
public final class ShardSearchPhaseAPMMetrics implements SearchOperationListener {
2424

25+
public static final String DFS_SEARCH_PHASE_METRIC = "es.search.shards.phases.dfs.duration.histogram";
2526
public static final String QUERY_SEARCH_PHASE_METRIC = "es.search.shards.phases.query.duration.histogram";
2627
public static final String FETCH_SEARCH_PHASE_METRIC = "es.search.shards.phases.fetch.duration.histogram";
2728

29+
private final LongHistogram dfsPhaseMetric;
2830
private final LongHistogram queryPhaseMetric;
2931
private final LongHistogram fetchPhaseMetric;
3032

3133
public ShardSearchPhaseAPMMetrics(MeterRegistry meterRegistry) {
34+
this.dfsPhaseMetric = meterRegistry.registerLongHistogram(
35+
DFS_SEARCH_PHASE_METRIC,
36+
"DFS search phase execution times at the shard level, expressed as a histogram",
37+
"ms"
38+
);
3239
this.queryPhaseMetric = meterRegistry.registerLongHistogram(
3340
QUERY_SEARCH_PHASE_METRIC,
3441
"Query search phase execution times at the shard level, expressed as a histogram",
@@ -41,6 +48,11 @@ public ShardSearchPhaseAPMMetrics(MeterRegistry meterRegistry) {
4148
);
4249
}
4350

51+
@Override
52+
public void onDfsPhase(SearchContext searchContext, long tookInNanos) {
53+
recordPhaseLatency(dfsPhaseMetric, tookInNanos);
54+
}
55+
4456
@Override
4557
public void onQueryPhase(SearchContext searchContext, long tookInNanos) {
4658
SearchExecutionContext searchExecutionContext = searchContext.getSearchExecutionContext();
@@ -55,6 +67,10 @@ public void onFetchPhase(SearchContext searchContext, long tookInNanos) {
5567
recordPhaseLatency(fetchPhaseMetric, tookInNanos, searchContext.request(), rangeTimestampFrom);
5668
}
5769

70+
private static void recordPhaseLatency(LongHistogram histogramMetric, long tookInNanos) {
71+
histogramMetric.record(TimeUnit.NANOSECONDS.toMillis(tookInNanos));
72+
}
73+
5874
private static void recordPhaseLatency(
5975
LongHistogram histogramMetric,
6076
long tookInNanos,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE;
3636
import static org.elasticsearch.index.query.QueryBuilders.simpleQueryStringQuery;
37+
import static org.elasticsearch.index.search.stats.ShardSearchPhaseAPMMetrics.DFS_SEARCH_PHASE_METRIC;
3738
import static org.elasticsearch.index.search.stats.ShardSearchPhaseAPMMetrics.FETCH_SEARCH_PHASE_METRIC;
3839
import static org.elasticsearch.index.search.stats.ShardSearchPhaseAPMMetrics.QUERY_SEARCH_PHASE_METRIC;
3940
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
@@ -92,6 +93,8 @@ public void testMetricsDfsQueryThenFetch() {
9293
client().prepareSearch(indexName).setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(simpleQueryStringQuery("doc1")),
9394
"1"
9495
);
96+
final List<Measurement> dfsMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(DFS_SEARCH_PHASE_METRIC);
97+
assertEquals(num_primaries, dfsMeasurements.size());
9598
final List<Measurement> queryMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(QUERY_SEARCH_PHASE_METRIC);
9699
assertEquals(num_primaries, queryMeasurements.size());
97100
final List<Measurement> fetchMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(FETCH_SEARCH_PHASE_METRIC);
@@ -106,6 +109,8 @@ public void testMetricsDfsQueryThenFetchSystem() {
106109
.setQuery(simpleQueryStringQuery("doc1")),
107110
"1"
108111
);
112+
final List<Measurement> dfsMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(DFS_SEARCH_PHASE_METRIC);
113+
assertEquals(0, dfsMeasurements.size()); // DFS phase not done for index with single shard
109114
final List<Measurement> queryMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(QUERY_SEARCH_PHASE_METRIC);
110115
assertEquals(1, queryMeasurements.size());
111116
final List<Measurement> fetchMeasurements = getTestTelemetryPlugin().getLongHistogramMeasurement(FETCH_SEARCH_PHASE_METRIC);

0 commit comments

Comments
 (0)