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

  1. Remove the redundant tracer plugin so only one provider is installed
  2. Keep exactly one tracer provider plugin in the plugin directory and delete duplicate JARs
  3. Set the tracer type to a non-plugin (built-in) option if multiple plugins must remain installed
  4. 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

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


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/9db8fd983cb438e6. Report an issue: GitHub.