prestodb/presto · error · IllegalArgumentException
Only a single plugin should set the tracer provider ('%s').
Error message
Only a single plugin should set the tracer provider ('%s'). What it means
When system tracing is enabled, TracerProviderManager accepts exactly one plugin-provided tracer provider. If a second plugin attempts addTracerProviderFactory while tracerProvider is already set, the manager throws IllegalArgumentException, because two competing tracer providers would make tracer selection ambiguous.
Source
Thrown at presto-main-base/src/main/java/com/facebook/presto/tracing/TracerProviderManager.java:52
this.tracerType = config.getTracerType();
boolean enableDistributedTracing = config.getEnableDistributedTracing();
TracingConfig.DistributedTracingMode distributedTracingMode = config.getDistributedTracingMode();
this.systemTracingEnabled = enableDistributedTracing && distributedTracingMode.name().equalsIgnoreCase(TracingConfig.DistributedTracingMode.ALWAYS_TRACE.name());
}
public void addTracerProviderFactory(TracerProvider provider)
{
if (!tracerType.equals(provider.getTracerType())) {
throw new IllegalArgumentException(
format(
"Plugin-configured tracer provider ('%s') does not match system-configured provider ('%s').",
provider.getName(),
tracerType));
}
if (systemTracingEnabled) {
if (tracerProvider != null) {
throw new IllegalArgumentException(format("Only a single plugin should set the tracer provider ('%s').", tracerProvider.getTracerType()));
}
tracerProvider = provider;
}
}
public void loadTracerProvider()
{
if (tracerProvider != null) {
return;
}
// open-telemetry plugin not used / tracer provider not specified or not matching system config / tracing disabled
// Check if SimpleTracer is configured and tracing is enabled
// Otherwise, use Noop implementation
if (tracerType.equals(TracingConfig.TracerType.SIMPLE) && systemTracingEnabled) {
tracerProvider = new SimpleTracerProvider();
}
else {
tracerProvider = new NoopTracerProvider();View on GitHub (pinned to 55bb57d202)
Solutions
- Remove the redundant tracer plugin so only one provider is installed
- Keep exactly one tracer provider plugin in the plugin directory and delete duplicate JARs
- Set the tracer type to a non-plugin (built-in) option if multiple plugins must remain installed
- Audit installed plugins for tracing SPI registrations after upgrades
Example fix
// before plugins/ presto-otel-tracer/ presto-jaeger-tracer/ // second provider -> error // after plugins/ presto-otel-tracer/ // single tracer provider
Defensive patterns
Strategy: validation
Validate before calling
long tracerProviderPlugins = installedPlugins.stream()
.filter(p -> p.getTracerProvider().isPresent())
.count();
if (systemTracingEnabled && tracerProviderPlugins > 1) {
throw new IllegalStateException("Exactly one tracer provider plugin is allowed when tracing is enabled");
} Type guard
boolean allowsAnotherTracerProvider(boolean systemTracingEnabled, TracerProvider current) {
return !systemTracingEnabled || current == null;
} Try / catch
try {
tracerProviderManager.addTracerProviderFactory(provider);
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("Only a single plugin should set the tracer provider")) {
LOG.error("Multiple tracer provider plugins installed; remove all but one");
} else {
throw e;
}
} Prevention
- Install exactly one tracer provider plugin per cluster
- After upgrades, purge stale plugin directories and duplicate JARs
- Disable system distributed tracing if multiple plugins must coexist
- Audit SPI registrations in plugin JARs before deployment
When it happens
Trigger: Deploying two or more plugins that each register a TracerProvider via addTracerProviderFactory while distributed tracing is enabled (systemTracingEnabled == true).
Common situations: Installing both an OTel tracer plugin and another tracing plugin; a plugin directory containing duplicate/leftover JARs that both register tracer providers; re-deploying an updated plugin without removing the old version.
Related errors
- Plugin-configured tracer provider ('%s') does not match syst
- DISTRIBUTED_TRACING_ERROR
- Query Prerequisites '%s' is already registered
- Node ttl fetcher factory '%s' is already registered
- RuntimeException(e)
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/9db8fd983cb438e6.
Report an issue: GitHub.