Skip to content

Commit 7750759

Browse files
authored
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.
1 parent a2a6981 commit 7750759

1 file changed

Lines changed: 12 additions & 7 deletions

File tree

multi-stage-query/src/main/java/org/apache/druid/msq/exec/WorkerImpl.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -230,16 +230,21 @@ private void reportQueryMetrics(boolean success, long time)
230230
cpuTimeNs += tracker.totalCpu();
231231
}
232232

233+
final MSQMetricEventBuilder metricBuilder = new MSQMetricEventBuilder();
234+
233235
final Set<String> datasources = (Set<String>) queryMetricDimensions.get(DruidMetrics.DATASOURCE);
234-
final Set<Interval> intervals = (Set<Interval>) queryMetricDimensions.get(DruidMetrics.INTERVAL);
236+
if (datasources != null) {
237+
metricBuilder.setDimension(DruidMetrics.DATASOURCE, DefaultQueryMetrics.getTableNamesAsString(datasources));
238+
}
235239

236-
final MSQMetricEventBuilder metricBuilder = new MSQMetricEventBuilder();
237-
metricBuilder.setDimension(DruidMetrics.DATASOURCE, DefaultQueryMetrics.getTableNamesAsString(datasources))
238-
.setDimension(DruidMetrics.INTERVAL, DefaultQueryMetrics.getIntervalsAsStringArray(intervals))
239-
.setDimension(DruidMetrics.DURATION, BaseQuery.calculateDuration(intervals))
240-
.setDimension(DruidMetrics.SUCCESS, success)
241-
.setMetric("query/time", time);
240+
final Set<Interval> intervals = (Set<Interval>) queryMetricDimensions.get(DruidMetrics.INTERVAL);
241+
if (intervals != null) {
242+
metricBuilder.setDimension(DruidMetrics.INTERVAL, DefaultQueryMetrics.getIntervalsAsStringArray(intervals));
243+
metricBuilder.setDimension(DruidMetrics.DURATION, BaseQuery.calculateDuration(intervals));
244+
}
242245

246+
metricBuilder.setDimension(DruidMetrics.SUCCESS, success);
247+
metricBuilder.setMetric("query/time", time);
243248
context.emitMetric(metricBuilder);
244249

245250
metricBuilder.setMetric("query/cpu/time", TimeUnit.NANOSECONDS.toMicros(cpuTimeNs));

0 commit comments

Comments
 (0)