From 93be07c1367ff4614db28990f7609672a7ebd838 Mon Sep 17 00:00:00 2001 From: Andrei Dan Date: Tue, 30 Sep 2025 16:39:27 +0100 Subject: [PATCH] Add search request attributes to the response count metric --- .../action/search/TransportSearchAction.java | 4 +- .../action/search/SearchResponseMetrics.java | 7 +++ .../SearchResponseCountTelemetryTests.java | 47 +++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index fd14f54371a5e..cd8c561a4ad75 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -2099,7 +2099,7 @@ public void onResponse(SearchResponse searchResponse) { } } } - searchResponseMetrics.incrementResponseCount(responseCountTotalStatus); + searchResponseMetrics.incrementResponseCount(responseCountTotalStatus, searchRequestAttributes); if (collectCCSTelemetry) { extractCCSTelemetry(searchResponse); @@ -2115,7 +2115,7 @@ public void onResponse(SearchResponse searchResponse) { @Override public void onFailure(Exception e) { - searchResponseMetrics.incrementResponseCount(SearchResponseMetrics.ResponseCountTotalStatus.FAILURE); + searchResponseMetrics.incrementResponseCount(SearchResponseMetrics.ResponseCountTotalStatus.FAILURE, searchRequestAttributes); if (collectCCSTelemetry) { usageBuilder.setFailure(e); recordTelemetry(); diff --git a/server/src/main/java/org/elasticsearch/rest/action/search/SearchResponseMetrics.java b/server/src/main/java/org/elasticsearch/rest/action/search/SearchResponseMetrics.java index 5df6153f766df..900ec9369e361 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/search/SearchResponseMetrics.java +++ b/server/src/main/java/org/elasticsearch/rest/action/search/SearchResponseMetrics.java @@ -14,6 +14,7 @@ import org.elasticsearch.telemetry.metric.LongHistogram; import org.elasticsearch.telemetry.metric.MeterRegistry; +import java.util.HashMap; import java.util.Map; /** @@ -83,4 +84,10 @@ public void incrementResponseCount(ResponseCountTotalStatus responseCountTotalSt Map.of(RESPONSE_COUNT_TOTAL_STATUS_ATTRIBUTE_NAME, responseCountTotalStatus.getDisplayName()) ); } + + public void incrementResponseCount(ResponseCountTotalStatus responseCountTotalStatus, Map attributes) { + Map attributesWithStatus = new HashMap<>(attributes); + attributesWithStatus.put(RESPONSE_COUNT_TOTAL_STATUS_ATTRIBUTE_NAME, responseCountTotalStatus.getDisplayName()); + responseCountTotalCounter.incrementBy(1L, attributesWithStatus); + } } diff --git a/server/src/test/java/org/elasticsearch/search/TelemetryMetrics/SearchResponseCountTelemetryTests.java b/server/src/test/java/org/elasticsearch/search/TelemetryMetrics/SearchResponseCountTelemetryTests.java index de7454a4e5d5b..2c176e04b70df 100644 --- a/server/src/test/java/org/elasticsearch/search/TelemetryMetrics/SearchResponseCountTelemetryTests.java +++ b/server/src/test/java/org/elasticsearch/search/TelemetryMetrics/SearchResponseCountTelemetryTests.java @@ -31,12 +31,15 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Map; import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE; import static org.elasticsearch.index.query.QueryBuilders.simpleQueryStringQuery; import static org.elasticsearch.rest.action.search.SearchResponseMetrics.RESPONSE_COUNT_TOTAL_COUNTER_NAME; import static org.elasticsearch.rest.action.search.SearchResponseMetrics.RESPONSE_COUNT_TOTAL_STATUS_ATTRIBUTE_NAME; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertScrollResponsesAndHitCount; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchHits; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchHitsWithoutFailures; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -239,4 +242,48 @@ public void testScrollWithAllShardsFail() throws Exception { ); }); } + + public void testAdditionalSearchAttributes() { + // target index attribute contains the system index name + createIndex(".kibana"); + { + SearchResponse searchResponse = client().prepareSearch(".kibana").setQuery(simpleQueryStringQuery("foo")).get(); + try { + assertNoFailures(searchResponse); + assertSearchHits(searchResponse); + } finally { + searchResponse.decRef(); + } + List measurements = getTestTelemetryPlugin().getLongCounterMeasurement(RESPONSE_COUNT_TOTAL_COUNTER_NAME); + assertEquals(1, measurements.size()); + Measurement measurement = measurements.getFirst(); + assertEquals(1, measurement.getLong()); + Map attributes = measurement.attributes(); + assertEquals(4, attributes.size()); + assertEquals(".kibana", attributes.get("target")); + assertEquals("hits_only", attributes.get("query_type")); + assertEquals("_score", attributes.get("sort")); + assertEquals("success", attributes.get(RESPONSE_COUNT_TOTAL_STATUS_ATTRIBUTE_NAME)); + } + // target index attribute should be "user" + createIndex("custom-index"); + { + SearchResponse searchResponse = client().prepareSearch("custom*").setQuery(simpleQueryStringQuery("foo")).get(); + try { + assertNoFailures(searchResponse); + assertSearchHits(searchResponse); + } finally { + searchResponse.decRef(); + } + List measurements = getTestTelemetryPlugin().getLongCounterMeasurement(RESPONSE_COUNT_TOTAL_COUNTER_NAME); + assertEquals(2, measurements.size()); + Measurement measurement = measurements.getLast(); + Map attributes = measurement.attributes(); + assertEquals(4, attributes.size()); + assertEquals("user", attributes.get("target")); + assertEquals("hits_only", attributes.get("query_type")); + assertEquals("_score", attributes.get("sort")); + assertEquals("success", attributes.get(RESPONSE_COUNT_TOTAL_STATUS_ATTRIBUTE_NAME)); + } + } }