This is an automated email from the ASF dual-hosted git repository.
jtuglu1 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new aa54413e452 feat: emit identity dimension on router query/time metric
(#19342)
aa54413e452 is described below
commit aa54413e45201c5fcef2a58eb38002d1fb11d262
Author: jtuglu1 <[email protected]>
AuthorDate: Fri Apr 17 12:23:06 2026 -0700
feat: emit identity dimension on router query/time metric (#19342)
We currently don't emit identity in query metrics on the router. This fixes
that.
---
.../druid/server/AsyncQueryForwardingServlet.java | 12 +++---
.../server/AsyncQueryForwardingServletTest.java | 47 ++++++++++++++++++++--
2 files changed, 51 insertions(+), 8 deletions(-)
diff --git
a/services/src/main/java/org/apache/druid/server/AsyncQueryForwardingServlet.java
b/services/src/main/java/org/apache/druid/server/AsyncQueryForwardingServlet.java
index 97272cba2e8..4054e6249b1 100644
---
a/services/src/main/java/org/apache/druid/server/AsyncQueryForwardingServlet.java
+++
b/services/src/main/java/org/apache/druid/server/AsyncQueryForwardingServlet.java
@@ -770,12 +770,12 @@ public class AsyncQueryForwardingServlet extends
AsyncProxyServlet implements Qu
failedQueryCount.incrementAndGet();
}
+ AuthenticationResult authenticationResult =
AuthorizationUtils.authenticationResultFromRequest(req);
+
// As router is simply a proxy, we don't make an effort to construct the
error code from the exception ourselves.
// We rely on broker to set this for us if the error occurs downstream.
// Otherwise, if there's a router/client error, we log this as an
unknown error.
- emitQueryTime(requestTimeNs, success, sqlQueryId, queryId, statusCode);
-
- AuthenticationResult authenticationResult =
AuthorizationUtils.authenticationResultFromRequest(req);
+ emitQueryTime(requestTimeNs, success, sqlQueryId, queryId, statusCode,
authenticationResult);
//noinspection VariableNotUsedInsideIf
if (sqlQueryId != null) {
@@ -863,8 +863,8 @@ public class AsyncQueryForwardingServlet extends
AsyncProxyServlet implements Qu
// We rely on broker to set this for us if the error occurs downstream.
// Otherwise, if there's a router/client error, we log this as an
unknown error.
final int statusCode = determineStatusCode(false, response.getStatus());
- emitQueryTime(requestTimeNs, false, sqlQueryId, queryId, statusCode);
AuthenticationResult authenticationResult =
AuthorizationUtils.authenticationResultFromRequest(req);
+ emitQueryTime(requestTimeNs, false, sqlQueryId, queryId, statusCode,
authenticationResult);
//noinspection VariableNotUsedInsideIf
if (sqlQueryId != null) {
@@ -940,7 +940,8 @@ public class AsyncQueryForwardingServlet extends
AsyncProxyServlet implements Qu
boolean success,
@Nullable String sqlQueryId,
@Nullable String queryId,
- int statusCode
+ int statusCode,
+ AuthenticationResult authenticationResult
)
{
QueryMetrics queryMetrics;
@@ -962,6 +963,7 @@ public class AsyncQueryForwardingServlet extends
AsyncProxyServlet implements Qu
}
queryMetrics.success(success);
queryMetrics.statusCode(statusCode);
+ queryMetrics.identity(authenticationResult.getIdentity());
queryMetrics.reportQueryTime(requestTimeNs).emit(emitter);
}
}
diff --git
a/services/src/test/java/org/apache/druid/server/AsyncQueryForwardingServletTest.java
b/services/src/test/java/org/apache/druid/server/AsyncQueryForwardingServletTest.java
index f79e239d586..c3b50514e82 100644
---
a/services/src/test/java/org/apache/druid/server/AsyncQueryForwardingServletTest.java
+++
b/services/src/test/java/org/apache/druid/server/AsyncQueryForwardingServletTest.java
@@ -51,11 +51,14 @@ import
org.apache.druid.java.util.common.jackson.JacksonUtils;
import org.apache.druid.java.util.common.lifecycle.Lifecycle;
import org.apache.druid.java.util.metrics.StubServiceEmitter;
import org.apache.druid.query.DefaultGenericQueryMetricsFactory;
+import org.apache.druid.query.DefaultQueryMetrics;
import org.apache.druid.query.DruidMetrics;
import org.apache.druid.query.Druids;
+import org.apache.druid.query.GenericQueryMetricsFactory;
import org.apache.druid.query.MapQueryToolChestWarehouse;
import org.apache.druid.query.Query;
import org.apache.druid.query.QueryException;
+import org.apache.druid.query.QueryMetrics;
import org.apache.druid.query.aggregation.FilteredAggregatorFactory;
import org.apache.druid.query.aggregation.any.StringAnyAggregatorFactory;
import org.apache.druid.query.filter.SelectorDimFilter;
@@ -467,6 +470,41 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
verifyServletCallsForQuery(query, true, false, hostFinder, properties,
true);
}
+ /**
+ * A {@link GenericQueryMetricsFactory} that overrides no-op dimensions
(e.g. identity) so tests can assert on them.
+ */
+ private static GenericQueryMetricsFactory
makeRouterTestOverrideEmittingFactory()
+ {
+ return new GenericQueryMetricsFactory()
+ {
+ private DefaultQueryMetrics makeOverridingMetrics()
+ {
+ return new DefaultQueryMetrics()
+ {
+ @Override
+ public void identity(String identity)
+ {
+ setDimension("identity", identity);
+ }
+ };
+ }
+
+ @Override
+ public QueryMetrics<Query<?>> makeMetrics(Query<?> query)
+ {
+ DefaultQueryMetrics metrics = makeOverridingMetrics();
+ metrics.query(query);
+ return metrics;
+ }
+
+ @Override
+ public QueryMetrics<Query<?>> makeMetrics()
+ {
+ return makeOverridingMetrics();
+ }
+ };
+ }
+
@Test
public void testMetricsEmittedWithErrorStatusCodeButNoResultException()
{
@@ -510,7 +548,7 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
null,
stubServiceEmitter,
NoopRequestLogger.instance(),
- new DefaultGenericQueryMetricsFactory(),
+ makeRouterTestOverrideEmittingFactory(),
new AuthenticatorMapper(ImmutableMap.of()),
new Properties(),
new ServerConfig()
@@ -529,6 +567,7 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
stubServiceEmitter.getMetricEvents("query/time").get(0).toMap().get(DruidMetrics.STATUS_CODE)
);
Assert.assertEquals("false",
stubServiceEmitter.getMetricEvents("query/time").get(0).toMap().get("success"));
+ Assert.assertEquals("testUser",
stubServiceEmitter.getMetricEvents("query/time").get(0).toMap().get("identity"));
}
@Test
@@ -581,7 +620,7 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
null,
stubServiceEmitter,
NoopRequestLogger.instance(),
- new DefaultGenericQueryMetricsFactory(),
+ makeRouterTestOverrideEmittingFactory(),
new AuthenticatorMapper(ImmutableMap.of()),
new Properties(),
new ServerConfig()
@@ -600,6 +639,7 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
stubServiceEmitter.getMetricEvents("query/time").get(0).toMap().get(DruidMetrics.STATUS_CODE)
);
Assert.assertEquals("false",
stubServiceEmitter.getMetricEvents("query/time").get(0).toMap().get("success"));
+ Assert.assertEquals("testUser",
stubServiceEmitter.getMetricEvents("query/time").get(0).toMap().get("identity"));
}
@Test
@@ -634,7 +674,7 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
null,
stubServiceEmitter,
NoopRequestLogger.instance(),
- new DefaultGenericQueryMetricsFactory(),
+ makeRouterTestOverrideEmittingFactory(),
new AuthenticatorMapper(ImmutableMap.of()),
new Properties(),
new ServerConfig()
@@ -654,6 +694,7 @@ public class AsyncQueryForwardingServletTest extends
BaseJettyTest
stubServiceEmitter.getMetricEvents("query/time").get(0).toMap().get(DruidMetrics.STATUS_CODE)
);
Assert.assertEquals("false",
stubServiceEmitter.getMetricEvents("query/time").get(0).toMap().get("success"));
+ Assert.assertEquals("testUser",
stubServiceEmitter.getMetricEvents("query/time").get(0).toMap().get("identity"));
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]