{"record":{"id":"949bb60d8488d1aa","repo":"apache/druid","slug":"cpu-time-must-enabled","errorCode":null,"errorMessage":"Cpu time must enabled","messagePattern":"Cpu time must enabled","errorType":"exception","errorClass":"ISE","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/CPUTimeMetricQueryRunner.java","lineNumber":50,"sourceCode":"\npublic class CPUTimeMetricQueryRunner<T> implements QueryRunner<T>\n{\n  private final QueryRunner<T> delegate;\n  private final QueryToolChest<T, ? extends Query<T>> queryToolChest;\n  private final ServiceEmitter emitter;\n  private final AtomicLong cpuTimeAccumulator;\n  private final boolean report;\n\n  private CPUTimeMetricQueryRunner(\n      QueryRunner<T> delegate,\n      QueryToolChest<T, ? extends Query<T>> queryToolChest,\n      ServiceEmitter emitter,\n      AtomicLong cpuTimeAccumulator,\n      boolean report\n  )\n  {\n    if (!JvmUtils.isThreadCpuTimeEnabled()) {\n      throw new ISE(\"Cpu time must enabled\");\n    }\n    this.delegate = delegate;\n    this.queryToolChest = queryToolChest;\n    this.emitter = emitter;\n    this.cpuTimeAccumulator = cpuTimeAccumulator == null ? new AtomicLong(0L) : cpuTimeAccumulator;\n    this.report = report;\n  }\n\n  @Override\n  public Sequence<T> run(final QueryPlus<T> queryPlus, final ResponseContext responseContext)\n  {\n    final long startRun = JvmUtils.getCurrentThreadCpuTime();\n    final QueryPlus<T> queryWithMetrics = queryPlus.withQueryMetrics(queryToolChest);\n    final Sequence<T> baseSequence = delegate.run(queryWithMetrics, responseContext);\n\n    cpuTimeAccumulator.addAndGet(JvmUtils.getCurrentThreadCpuTime() - startRun);\n\n    return Sequences.wrap(","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/CPUTimeMetricQueryRunner.java#L32-L68","documentation":"CPUTimeMetricQueryRunner's constructor requires JVM thread CPU-time measurement to be enabled, because it uses ThreadMXBean.getCurrentThreadCpuTime() to accumulate CPU-time metrics. If JvmUtils.isThreadCpuTimeEnabled() is false (ThreadMXBean null or CPU time unsupported), it throws an IllegalStateException rather than silently emitting no CPU metrics.","triggerScenarios":"Building a CPUTimeMetricQueryRunner (typically via QueryToolChest.wrap / mergeResults wiring) on a JVM where thread CPU time is unavailable: -XX:-UseThreadPriorities-style disabling, JREs without com.sun.management.ThreadMXBean support, or JVMs where isThreadCpuTimeEnabled() returns false at startup.","commonSituations":"Running Druid on minimal/JVM variants lacking HotSpot ThreadMXBean CPU-time support; unusual runtime environments (some containers or alternate JVM vendors) where getCurrentThreadCpuTime is unsupported; misconfigured JVM flags disabling CPU-time measurement.","solutions":["Run Druid on a supported HotSpot/OpenJDK JVM that supports thread CPU-time measurement, and don't disable CPU-time accounting via JVM flags.","Set the query context flag so the CPU-time runner isn't wired in when metrics aren't needed (e.g. disable cpuTime metrics / use default query runner wrapping).","If you build the runner yourself, guard with JvmUtils.isThreadCpuTimeEnabled() and fall back to the delegate runner without CPU metrics.","Verify with a quick diagnostic that ManagementFactory.getThreadMXBean().isThreadCpuTimeEnabled() is true in your runtime before enabling the feature."],"exampleFix":"// before\nQueryRunner<T> runner = new CPUTimeMetricQueryRunner<>(delegate, chest, emitter, acc, true);\n// after\nif (JvmUtils.isThreadCpuTimeEnabled()) {\n  runner = new CPUTimeMetricQueryRunner<>(delegate, chest, emitter, acc, true);\n} else {\n  runner = delegate;\n}","handlingStrategy":"validation","validationCode":"if (!JvmUtils.isThreadCpuTimeEnabled()) {\n  // skip CPU-time wrapping\n  runner = delegate;\n} else {\n  runner = new CPUTimeMetricQueryRunner<>(delegate, chest, emitter, acc, report);\n}","typeGuard":"boolean cpuTimeAvailable() {\n  java.lang.management.ThreadMXBean bean = java.lang.management.ManagementFactory.getThreadMXBean();\n  return bean instanceof com.sun.management.ThreadMXBean && bean.isThreadCpuTimeSupported() && bean.isThreadCpuTimeEnabled();\n}","tryCatchPattern":"try {\n  return new CPUTimeMetricQueryRunner<>(delegate, chest, emitter, acc, report);\n} catch (IllegalStateException e) {\n  if (e.getMessage().contains(\"Cpu time must enabled\")) {\n    return delegate; // proceed without CPU metrics\n  }\n  throw e;\n}","preventionTips":["Deploy on standard HotSpot/OpenJDK JVMs that support thread CPU time.","Avoid JVM flags or restricted environments that disable ThreadMXBean CPU-time accounting.","Check JvmUtils.isThreadCpuTimeEnabled() once at service startup and configure metric wiring accordingly."],"tags":["jvm","metrics","cpu-time","query-runner"],"backgroundTag":"feature-not-enabled","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}