diff --git a/processing/src/main/java/org/apache/druid/query/DefaultQueryMetrics.java b/processing/src/main/java/org/apache/druid/query/DefaultQueryMetrics.java index 2509520aadc3..a351eeb29ed6 100644 --- a/processing/src/main/java/org/apache/druid/query/DefaultQueryMetrics.java +++ b/processing/src/main/java/org/apache/druid/query/DefaultQueryMetrics.java @@ -89,6 +89,7 @@ public void query(QueryType query) queryId(query); subQueryId(query); sqlQueryId(query); + context(query); } @Override diff --git a/processing/src/main/java/org/apache/druid/query/DruidMetrics.java b/processing/src/main/java/org/apache/druid/query/DruidMetrics.java index b1e49af02bf1..4ecb69cc9f35 100644 --- a/processing/src/main/java/org/apache/druid/query/DruidMetrics.java +++ b/processing/src/main/java/org/apache/druid/query/DruidMetrics.java @@ -66,7 +66,6 @@ public static QueryMetrics makeRequestMetrics( } else { queryMetrics = queryMetricsFactory.makeMetrics(query); } - queryMetrics.context(query); queryMetrics.remoteAddress(remoteAddr); return queryMetrics; } diff --git a/processing/src/main/java/org/apache/druid/query/QueryMetrics.java b/processing/src/main/java/org/apache/druid/query/QueryMetrics.java index 279c7075e1a5..9457fbd75f59 100644 --- a/processing/src/main/java/org/apache/druid/query/QueryMetrics.java +++ b/processing/src/main/java/org/apache/druid/query/QueryMetrics.java @@ -123,8 +123,8 @@ * implement extra methods from SegmentMetadataQueryMetrics interfaces with empty bodies, AND DELEGATE ALL OTHER * METHODS TO A QueryMetrics OBJECT, provided as a sole parameter in DefaultSegmentMetadataQueryMetrics constructor. * - * NOTE: query(), dataSource(), queryType(), interval(), hasFilters(), duration(), queryId() and sqlQueryId() methods - * or any "pre-query-execution-time" methods should either have a empty body or throw exception. + * NOTE: query(), dataSource(), queryType(), interval(), hasFilters(), duration(), queryId(), sqlQueryId(), and + * context() methods or any "pre-query-execution-time" methods should either have a empty body or throw exception. * * 3. Create `interface SegmentMetadataQueryMetricsFactory` with a single method * `SegmentMetadataQueryMetrics makeMetrics(SegmentMetadataQuery query);`. @@ -217,6 +217,7 @@ public interface QueryMetrics> /** * Sets {@link Query#getContext()} of the given query as dimension. */ + @PublicApi void context(QueryType query); void server(String host); diff --git a/processing/src/main/java/org/apache/druid/query/search/DefaultSearchQueryMetrics.java b/processing/src/main/java/org/apache/druid/query/search/DefaultSearchQueryMetrics.java index ebbe648cd73c..dd52bf5a7ffb 100644 --- a/processing/src/main/java/org/apache/druid/query/search/DefaultSearchQueryMetrics.java +++ b/processing/src/main/java/org/apache/druid/query/search/DefaultSearchQueryMetrics.java @@ -108,7 +108,7 @@ public void granularity(SearchQuery query) @Override public void context(SearchQuery query) { - delegateQueryMetrics.context(query); + throw new ISE("Unsupported method in default query metrics implementation."); } @Override diff --git a/processing/src/test/java/org/apache/druid/query/DefaultQueryMetricsTest.java b/processing/src/test/java/org/apache/druid/query/DefaultQueryMetricsTest.java index c463dc4052ea..e0fe0b4a70da 100644 --- a/processing/src/test/java/org/apache/druid/query/DefaultQueryMetricsTest.java +++ b/processing/src/test/java/org/apache/druid/query/DefaultQueryMetricsTest.java @@ -19,6 +19,7 @@ package org.apache.druid.query; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import org.apache.druid.java.util.common.granularity.Granularities; import org.apache.druid.java.util.emitter.service.ServiceEmitter; @@ -62,11 +63,12 @@ public void testDefaultQueryMetricsQuery() .aggregators(new CountAggregatorFactory("count")) .threshold(5) .filters(new SelectorDimFilter("tags", "t3", null)) + .context(ImmutableMap.of("testKey", "testValue")) .build(); queryMetrics.query(query); queryMetrics.reportQueryTime(0).emit(serviceEmitter); Map actualEvent = cachingEmitter.getLastEmittedEvent().toMap(); - Assert.assertEquals(12, actualEvent.size()); + Assert.assertEquals(13, actualEvent.size()); Assert.assertTrue(actualEvent.containsKey("feed")); Assert.assertTrue(actualEvent.containsKey("timestamp")); Assert.assertEquals("", actualEvent.get("host")); @@ -82,6 +84,7 @@ public void testDefaultQueryMetricsQuery() Assert.assertEquals("", actualEvent.get(DruidMetrics.ID)); Assert.assertEquals("query/time", actualEvent.get("metric")); Assert.assertEquals(0L, actualEvent.get("value")); + Assert.assertEquals(ImmutableMap.of("testKey", "testValue"), actualEvent.get("context")); } @Test diff --git a/processing/src/test/java/org/apache/druid/query/groupby/DefaultGroupByQueryMetricsTest.java b/processing/src/test/java/org/apache/druid/query/groupby/DefaultGroupByQueryMetricsTest.java index 8378f51f357a..9e8d4aef9bd7 100644 --- a/processing/src/test/java/org/apache/druid/query/groupby/DefaultGroupByQueryMetricsTest.java +++ b/processing/src/test/java/org/apache/druid/query/groupby/DefaultGroupByQueryMetricsTest.java @@ -75,7 +75,7 @@ public void testDefaultGroupByQueryMetricsQuery() queryMetrics.reportQueryTime(0).emit(serviceEmitter); Map actualEvent = cachingEmitter.getLastEmittedEvent().toMap(); - Assert.assertEquals(15, actualEvent.size()); + Assert.assertEquals(16, actualEvent.size()); Assert.assertTrue(actualEvent.containsKey("feed")); Assert.assertTrue(actualEvent.containsKey("timestamp")); Assert.assertEquals("", actualEvent.get("host")); @@ -87,6 +87,7 @@ public void testDefaultGroupByQueryMetricsQuery() Assert.assertEquals("true", actualEvent.get("hasFilters")); Assert.assertEquals(expectedInterval.toDuration().toString(), actualEvent.get("duration")); Assert.assertEquals("", actualEvent.get(DruidMetrics.ID)); + Assert.assertEquals(ImmutableMap.of("bySegment", true), actualEvent.get("context")); // GroupBy-specific dimensions Assert.assertEquals("1", actualEvent.get("numDimensions")); diff --git a/processing/src/test/java/org/apache/druid/query/search/DefaultSearchQueryMetricsTest.java b/processing/src/test/java/org/apache/druid/query/search/DefaultSearchQueryMetricsTest.java index e729a9cd3175..ae666e390229 100644 --- a/processing/src/test/java/org/apache/druid/query/search/DefaultSearchQueryMetricsTest.java +++ b/processing/src/test/java/org/apache/druid/query/search/DefaultSearchQueryMetricsTest.java @@ -19,6 +19,7 @@ package org.apache.druid.query.search; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import org.apache.druid.java.util.emitter.service.ServiceEmitter; import org.apache.druid.query.CachingEmitter; @@ -57,6 +58,7 @@ public void testDefaultSearchQueryMetricsQuery() ImmutableSet.of("t3"), null )) + .context(ImmutableMap.of("testKey", "testValue")) .build(); SearchQueryMetrics queryMetrics = DefaultSearchQueryMetricsFactory.instance().makeMetrics(query); @@ -65,7 +67,7 @@ public void testDefaultSearchQueryMetricsQuery() queryMetrics.reportQueryTime(0).emit(serviceEmitter); Map actualEvent = cachingEmitter.getLastEmittedEvent().toMap(); - Assert.assertEquals(12, actualEvent.size()); + Assert.assertEquals(13, actualEvent.size()); Assert.assertTrue(actualEvent.containsKey("feed")); Assert.assertTrue(actualEvent.containsKey("timestamp")); Assert.assertEquals("", actualEvent.get("host")); @@ -79,6 +81,7 @@ public void testDefaultSearchQueryMetricsQuery() Assert.assertEquals("false", actualEvent.get("hasFilters")); Assert.assertEquals(expectedIntervals.get(0).toDuration().toString(), actualEvent.get("duration")); Assert.assertEquals("", actualEvent.get(DruidMetrics.ID)); + Assert.assertEquals(ImmutableMap.of("testKey", "testValue"), actualEvent.get("context")); // Metric Assert.assertEquals("query/time", actualEvent.get("metric")); diff --git a/processing/src/test/java/org/apache/druid/query/timeseries/DefaultTimeseriesQueryMetricsTest.java b/processing/src/test/java/org/apache/druid/query/timeseries/DefaultTimeseriesQueryMetricsTest.java index d3410eeb4e38..6f2c45027cf1 100644 --- a/processing/src/test/java/org/apache/druid/query/timeseries/DefaultTimeseriesQueryMetricsTest.java +++ b/processing/src/test/java/org/apache/druid/query/timeseries/DefaultTimeseriesQueryMetricsTest.java @@ -19,6 +19,7 @@ package org.apache.druid.query.timeseries; +import com.google.common.collect.ImmutableMap; import org.apache.druid.java.util.emitter.service.ServiceEmitter; import org.apache.druid.query.CachingEmitter; import org.apache.druid.query.DefaultQueryMetricsTest; @@ -54,12 +55,13 @@ public void testDefaultTimeseriesQueryMetricsQuery() .aggregators(QueryRunnerTestHelper.ROWS_COUNT, QueryRunnerTestHelper.INDEX_DOUBLE_SUM) .postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT) .descending(true) + .context(ImmutableMap.of("testKey", "testValue")) .build(); queryMetrics.query(query); queryMetrics.reportQueryTime(0).emit(serviceEmitter); Map actualEvent = cachingEmitter.getLastEmittedEvent().toMap(); - Assert.assertEquals(15, actualEvent.size()); + Assert.assertEquals(16, actualEvent.size()); Assert.assertTrue(actualEvent.containsKey("feed")); Assert.assertTrue(actualEvent.containsKey("timestamp")); Assert.assertEquals("", actualEvent.get("host")); @@ -73,6 +75,7 @@ public void testDefaultTimeseriesQueryMetricsQuery() Assert.assertEquals("false", actualEvent.get("hasFilters")); Assert.assertEquals(expectedIntervals.get(0).toDuration().toString(), actualEvent.get("duration")); Assert.assertEquals("", actualEvent.get(DruidMetrics.ID)); + Assert.assertEquals(ImmutableMap.of("testKey", "testValue"), actualEvent.get("context")); // Timeseries-specific dimensions Assert.assertEquals("2", actualEvent.get("numMetrics")); diff --git a/processing/src/test/java/org/apache/druid/query/topn/DefaultTopNQueryMetricsTest.java b/processing/src/test/java/org/apache/druid/query/topn/DefaultTopNQueryMetricsTest.java index 115f55d34e60..19f561afe445 100644 --- a/processing/src/test/java/org/apache/druid/query/topn/DefaultTopNQueryMetricsTest.java +++ b/processing/src/test/java/org/apache/druid/query/topn/DefaultTopNQueryMetricsTest.java @@ -19,6 +19,7 @@ package org.apache.druid.query.topn; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import org.apache.druid.java.util.common.granularity.Granularities; import org.apache.druid.java.util.emitter.service.ServiceEmitter; @@ -64,12 +65,13 @@ public void testDefaultTopNQueryMetricsQuery() .aggregators(new CountAggregatorFactory("count")) .threshold(5) .filters(new SelectorDimFilter("tags", "t3", null)) + .context(ImmutableMap.of("testKey", "testValue")) .build(); queryMetrics.query(query); queryMetrics.reportQueryTime(0).emit(serviceEmitter); Map actualEvent = cachingEmitter.getLastEmittedEvent().toMap(); - Assert.assertEquals(16, actualEvent.size()); + Assert.assertEquals(17, actualEvent.size()); Assert.assertTrue(actualEvent.containsKey("feed")); Assert.assertTrue(actualEvent.containsKey("timestamp")); Assert.assertEquals("", actualEvent.get("host")); @@ -83,6 +85,7 @@ public void testDefaultTopNQueryMetricsQuery() Assert.assertEquals("true", actualEvent.get("hasFilters")); Assert.assertEquals(expectedIntervals.get(0).toDuration().toString(), actualEvent.get("duration")); Assert.assertEquals("", actualEvent.get(DruidMetrics.ID)); + Assert.assertEquals(ImmutableMap.of("testKey", "testValue"), actualEvent.get("context")); // TopN-specific dimensions Assert.assertEquals("5", actualEvent.get("threshold"));