apache/druid · error · IllegalArgumentException

Unknown monitor scheduler

Error message

Unknown monitor scheduler[%s]

What it means

MetricsModule.getMonitorScheduler() throws this IllegalArgumentException when the configured druid.monitoring.monitorScheduler class name is not one of the known scheduler implementations (ThreadPoolTaskMonitorScheduler or a legacy 'monitorScheduler' value). The config value is mapped to a scheduler; anything unrecognized is rejected at injector creation.

Solutions

  1. Set druid.monitoring.monitorScheduler=org.apache.druid.server.metrics.ThreadPoolTaskMonitorScheduler (the standard value)
  2. Verify the class name spelling and that the class exists in your Druid version
  3. Remove the property entirely to use the default scheduler
  4. Check the Druid docs for your version for valid monitorScheduler values

Example fix

// before
druid.monitoring.monitorScheduler=org.apache.druid.server.metrics.MonitorScheduler
// after
druid.monitoring.monitorScheduler=org.apache.druid.server.metrics.ThreadPoolTaskMonitorScheduler
Defensive patterns

Strategy: validation

Validate before calling

Set.of("org.apache.druid.server.metrics.ThreadPoolTaskMonitorScheduler").contains(config.getSchedulerClassName())

Prevention

When it happens

Trigger: Setting druid.monitoring.monitorScheduler to a misspelled or nonexistent class name in runtime.properties, e.g. org.apache.druid.server.metrics.SomeScheduler instead of org.apache.druid.server.metrics.ThreadPoolTaskMonitorScheduler.

Common situations: Copy-pasting scheduler class names from old docs or other projects, typos in runtime.properties, upgrading Druid and the old default class name being removed or renamed.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/c7ee0dae0e0b2bbd. Report an issue: GitHub.

Appendix: source

Thrown at server/src/main/java/org/apache/druid/server/metrics/MetricsModule.java:148

    }

    if (ClockDriftSafeMonitorScheduler.class.getName().equals(config.get().getSchedulerClassName())) {
      return new ClockDriftSafeMonitorScheduler(
          config.get(),
          emitter,
          monitors,
          CronScheduler.newBuilder(Duration.ofSeconds(1L)).setThreadName("MonitorScheduler").build(),
          Execs.singleThreaded("MonitorRunner")
      );
    } else if (BasicMonitorScheduler.class.getName().equals(config.get().getSchedulerClassName())) {
      return new BasicMonitorScheduler(
          config.get(),
          emitter,
          monitors,
          Execs.scheduledSingleThreaded("MonitorScheduler-%s")
      );
    } else {
      throw new IAE("Unknown monitor scheduler[%s]", config.get().getSchedulerClassName());
    }
  }

  @Provides
  @ManageLifecycle
  public JvmMonitor getJvmMonitor()
  {
    return new JvmMonitor();
  }

  @Provides
  @ManageLifecycle
  public JvmCpuMonitor getJvmCpuMonitor()
  {
    return new JvmCpuMonitor();
  }

  @Provides

View on GitHub (pinned to 9b90983fd2)