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]

Reply via email to