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
- Set druid.monitoring.monitorScheduler=org.apache.druid.server.metrics.ThreadPoolTaskMonitorScheduler (the standard value)
- Verify the class name spelling and that the class exists in your Druid version
- Remove the property entirely to use the default scheduler
- 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
- Copy monitorScheduler values only from the docs of your exact Druid version
- Prefer omitting the property to accept the default scheduler
- Validate runtime.properties values at deploy time with config linting
- Grep your Druid jars for the class name to confirm it exists before configuring it
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
- At least one of baseDir or files should be specified
- bucketSize must be a power of two (from 1 up to 128) but…
- Cannot delete all segment files since Azure Deep Storage…
- Cannot delete all segment from S3 Deep Storage since…
- Cannot have a null/empty columns
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();
}
@ProvidesView on GitHub (pinned to 9b90983fd2)