This is an automated email from the ASF dual-hosted git repository.

gian 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 7750759e2ac WorkerImpl: Skip null dimensions when emitting metrics. 
(#19079)
7750759e2ac is described below

commit 7750759e2ac6f6a56ccf9d31997bc891bb698c9e
Author: Gian Merlino <[email protected]>
AuthorDate: Tue Mar 3 15:35:33 2026 -0800

    WorkerImpl: Skip null dimensions when emitting metrics. (#19079)
    
    If a query ends without a worker ever receiving a work order (perhaps
    due to failure), the call to DefaultQueryMetrics.getTableNamesAsString
    would throw a NullPointerException.
    
    This patch updates metric emitting logic to skip dimensions that
    are not available at the time the query completes.
---
 .../java/org/apache/druid/msq/exec/WorkerImpl.java    | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git 
a/multi-stage-query/src/main/java/org/apache/druid/msq/exec/WorkerImpl.java 
b/multi-stage-query/src/main/java/org/apache/druid/msq/exec/WorkerImpl.java
index e0a64fd5bba..c639b1d7003 100644
--- a/multi-stage-query/src/main/java/org/apache/druid/msq/exec/WorkerImpl.java
+++ b/multi-stage-query/src/main/java/org/apache/druid/msq/exec/WorkerImpl.java
@@ -230,16 +230,21 @@ public class WorkerImpl implements Worker
       cpuTimeNs += tracker.totalCpu();
     }
 
+    final MSQMetricEventBuilder metricBuilder = new MSQMetricEventBuilder();
+
     final Set<String> datasources = (Set<String>) 
queryMetricDimensions.get(DruidMetrics.DATASOURCE);
-    final Set<Interval> intervals = (Set<Interval>) 
queryMetricDimensions.get(DruidMetrics.INTERVAL);
+    if (datasources != null) {
+      metricBuilder.setDimension(DruidMetrics.DATASOURCE, 
DefaultQueryMetrics.getTableNamesAsString(datasources));
+    }
 
-    final MSQMetricEventBuilder metricBuilder = new MSQMetricEventBuilder();
-    metricBuilder.setDimension(DruidMetrics.DATASOURCE, 
DefaultQueryMetrics.getTableNamesAsString(datasources))
-                 .setDimension(DruidMetrics.INTERVAL, 
DefaultQueryMetrics.getIntervalsAsStringArray(intervals))
-                 .setDimension(DruidMetrics.DURATION, 
BaseQuery.calculateDuration(intervals))
-                 .setDimension(DruidMetrics.SUCCESS, success)
-                 .setMetric("query/time", time);
+    final Set<Interval> intervals = (Set<Interval>) 
queryMetricDimensions.get(DruidMetrics.INTERVAL);
+    if (intervals != null) {
+      metricBuilder.setDimension(DruidMetrics.INTERVAL, 
DefaultQueryMetrics.getIntervalsAsStringArray(intervals));
+      metricBuilder.setDimension(DruidMetrics.DURATION, 
BaseQuery.calculateDuration(intervals));
+    }
 
+    metricBuilder.setDimension(DruidMetrics.SUCCESS, success);
+    metricBuilder.setMetric("query/time", time);
     context.emitMetric(metricBuilder);
 
     metricBuilder.setMetric("query/cpu/time", 
TimeUnit.NANOSECONDS.toMicros(cpuTimeNs));


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to