{"record":{"id":"9db8fd983cb438e6","repo":"prestodb/presto","slug":"only-a-single-plugin-should-set-the-tracer-provide","errorCode":null,"errorMessage":"Only a single plugin should set the tracer provider ('%s').","messagePattern":"Only a single plugin should set the tracer provider \\('(.+?)'\\)\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/tracing/TracerProviderManager.java","lineNumber":52,"sourceCode":"\n        this.tracerType = config.getTracerType();\n        boolean enableDistributedTracing = config.getEnableDistributedTracing();\n        TracingConfig.DistributedTracingMode distributedTracingMode = config.getDistributedTracingMode();\n        this.systemTracingEnabled = enableDistributedTracing && distributedTracingMode.name().equalsIgnoreCase(TracingConfig.DistributedTracingMode.ALWAYS_TRACE.name());\n    }\n\n    public void addTracerProviderFactory(TracerProvider provider)\n    {\n        if (!tracerType.equals(provider.getTracerType())) {\n            throw new IllegalArgumentException(\n                    format(\n                            \"Plugin-configured tracer provider ('%s') does not match system-configured provider ('%s').\",\n                            provider.getName(),\n                            tracerType));\n        }\n        if (systemTracingEnabled) {\n            if (tracerProvider != null) {\n                throw new IllegalArgumentException(format(\"Only a single plugin should set the tracer provider ('%s').\", tracerProvider.getTracerType()));\n            }\n            tracerProvider = provider;\n        }\n    }\n\n    public void loadTracerProvider()\n    {\n        if (tracerProvider != null) {\n            return;\n        }\n        // open-telemetry plugin not used / tracer provider not specified or not matching system config / tracing disabled\n        // Check if SimpleTracer is configured and tracing is enabled\n        // Otherwise, use Noop implementation\n        if (tracerType.equals(TracingConfig.TracerType.SIMPLE) && systemTracingEnabled) {\n            tracerProvider = new SimpleTracerProvider();\n        }\n        else {\n            tracerProvider = new NoopTracerProvider();","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/tracing/TracerProviderManager.java#L34-L70","documentation":"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.","triggerScenarios":"Deploying two or more plugins that each register a TracerProvider via addTracerProviderFactory while distributed tracing is enabled (systemTracingEnabled == true).","commonSituations":"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.","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"],"exampleFix":"// before\nplugins/\n  presto-otel-tracer/\n  presto-jaeger-tracer/   // second provider -> error\n// after\nplugins/\n  presto-otel-tracer/     // single tracer provider","handlingStrategy":"validation","validationCode":"long tracerProviderPlugins = installedPlugins.stream()\n    .filter(p -> p.getTracerProvider().isPresent())\n    .count();\nif (systemTracingEnabled && tracerProviderPlugins > 1) {\n    throw new IllegalStateException(\"Exactly one tracer provider plugin is allowed when tracing is enabled\");\n}","typeGuard":"boolean allowsAnotherTracerProvider(boolean systemTracingEnabled, TracerProvider current) {\n    return !systemTracingEnabled || current == null;\n}","tryCatchPattern":"try {\n    tracerProviderManager.addTracerProviderFactory(provider);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"Only a single plugin should set the tracer provider\")) {\n        LOG.error(\"Multiple tracer provider plugins installed; remove all but one\");\n    } else {\n        throw e;\n    }\n}","preventionTips":["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"],"tags":["tracing","plugin","configuration","duplicate-registration"],"backgroundTag":"duplicate-plugin-registration","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}