Summary
When otel.propagators=b3multi (or b3, jaeger, ottrace) is configured in the Jenkins OpenTelemetry plugin, Jenkins startup fails:
io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException: Unrecognized value for otel.propagators: b3multi. Make sure the artifact including the propagator is on the classpath.
at PluginClassLoader for opentelemetry-api//io.opentelemetry.sdk.autoconfigure.PropagatorConfiguration.getPropagator(PropagatorConfiguration.java:70)
at PluginClassLoader for opentelemetry-api//io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder.build(...)
at PluginClassLoader for opentelemetry-api//io.jenkins.plugins.opentelemetry.api.ReconfigurableOpenTelemetry.configure(...)
at PluginClassLoader for opentelemetry//io.jenkins.plugins.opentelemetry.JenkinsOpenTelemetryPluginConfiguration.configureOpenTelemetrySdk(...)
Root cause
opentelemetry-extension-trace-propagators is currently bundled in opentelemetry-plugin (compile scope), but the SDK autoconfigure (AutoConfiguredOpenTelemetrySdkBuilder.build()) which calls ServiceLoader<ConfigurablePropagatorProvider> runs in opentelemetry-api-plugin's classloader.
Because Jenkins plugin classloaders are isolated and the dependency direction is opentelemetry → opentelemetry-api (not the reverse), the SPI lookup in opentelemetry-api-plugin cannot see resources in opentelemetry-plugin/WEB-INF/lib/.
Verification on a running Jenkins
$JENKINS_HOME/plugins/opentelemetry-api/WEB-INF/lib/:
opentelemetry-sdk-extension-autoconfigure-1.49.0.jar <- runs SPI lookup
(no opentelemetry-extension-trace-propagators)
$JENKINS_HOME/plugins/opentelemetry/WEB-INF/lib/:
opentelemetry-extension-trace-propagators-1.49.0.jar <- contains B3/Jaeger/OtTrace SPI registrations
The JAR is on disk but on the wrong plugin's classpath, so ServiceLoader running in the SDK never sees the SPI provider files inside it.
History
Proposed fix
Add the dependency to opentelemetry-api-plugin/pom.xml, alongside opentelemetry-sdk-extension-autoconfigure:
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-extension-trace-propagators</artifactId>
</dependency>
This places the artifact (and its META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider SPI file) on the same classloader as the SDK autoconfigure, restoring b3, b3multi, jaeger, and ottrace recognition.
The redundant declaration can also be removed from opentelemetry-plugin/pom.xml (separate PR), but adding it to opentelemetry-api-plugin is sufficient to fix the user-visible breakage.
Workaround until merged
Manual JAR copy on the Jenkins controller:
cp $JENKINS_HOME/plugins/opentelemetry/WEB-INF/lib/opentelemetry-extension-trace-propagators-1.49.0.jar \
$JENKINS_HOME/plugins/opentelemetry-api/WEB-INF/lib/
# restart Jenkins
Replaced on every plugin upgrade.
Environment
- Jenkins OpenTelemetry plugin: 3.1505.v69c4d7c9ee62 (also reproducible on 3.1523.v0b_3ce640987d)
- opentelemetry-api plugin: 1.49.0.x
- OpenTelemetry SDK bundled: 1.49.0
- Jenkins core: 2.504.3
- Jenkins is unable to start with
otel.propagators=b3multi set
Summary
When
otel.propagators=b3multi(orb3,jaeger,ottrace) is configured in the Jenkins OpenTelemetry plugin, Jenkins startup fails:Root cause
opentelemetry-extension-trace-propagatorsis currently bundled inopentelemetry-plugin(compile scope), but the SDK autoconfigure (AutoConfiguredOpenTelemetrySdkBuilder.build()) which callsServiceLoader<ConfigurablePropagatorProvider>runs inopentelemetry-api-plugin's classloader.Because Jenkins plugin classloaders are isolated and the dependency direction is
opentelemetry → opentelemetry-api(not the reverse), the SPI lookup inopentelemetry-api-plugincannot see resources inopentelemetry-plugin/WEB-INF/lib/.Verification on a running Jenkins
$JENKINS_HOME/plugins/opentelemetry-api/WEB-INF/lib/:$JENKINS_HOME/plugins/opentelemetry/WEB-INF/lib/:The JAR is on disk but on the wrong plugin's classpath, so
ServiceLoaderrunning in the SDK never sees the SPI provider files inside it.History
opentelemetry-extension-trace-propagatorsto the (then-single)opentelemetry-pluginpom and resolved Make otel.propagators=jaeger possible opentelemetry-plugin#657. Released asopentelemetry-2.14.0.opentelemetry-api-plugin(mid-2025): the SDK + autoconfigure artifacts moved, butopentelemetry-extension-trace-propagatorswas left behind inopentelemetry-plugin. This is a silent regression — the dependency continues to exist but is no longer reachable by the SPI lookup, so all non-W3C propagators stop working.Proposed fix
Add the dependency to
opentelemetry-api-plugin/pom.xml, alongsideopentelemetry-sdk-extension-autoconfigure:This places the artifact (and its
META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProviderSPI file) on the same classloader as the SDK autoconfigure, restoringb3,b3multi,jaeger, andottracerecognition.The redundant declaration can also be removed from
opentelemetry-plugin/pom.xml(separate PR), but adding it toopentelemetry-api-pluginis sufficient to fix the user-visible breakage.Workaround until merged
Manual JAR copy on the Jenkins controller:
Replaced on every plugin upgrade.
Environment
otel.propagators=b3multiset