feat(trace): support runtime sampler updates - #8716
Conversation
|
|
Pull request dashboard statusWaiting on the author · refreshed 2026-08-10 12:23 UTC Investigate required status check failures. Status above doesn't look right?
|
There was a problem hiding this comment.
Pull request overview
This PR adds support for updating the SdkTracerProvider sampler at runtime so that new spans (including those created from previously obtained Tracer instances) observe the updated sampler.
Changes:
- Introduces
SdkTracerProvider.setSampler(Sampler)and corresponding test coverage for runtime updates and null rejection. - Makes the shared sampler reference mutable (
volatile) so new span creation uses the latest sampler. - Adds a test verifying sampler updates affect spans started from an existing
Tracer.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProvider.java | Adds public runtime sampler setter and keeps sampler accessible via getSampler(). |
| sdk/trace/src/main/java/io/opentelemetry/sdk/trace/TracerSharedState.java | Makes sampler mutable to allow runtime updates for span creation. |
| sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderTest.java | Adds tests for sampler updates, null rejection, and existing tracer behavior. |
Suppressed comments (1)
sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProvider.java:125
getSampler()now returns the current sampler (it can change at runtime), but its Javadoc still says "configured" which reads like an immutable build-time value.
/** Returns the configured {@link Sampler}. */
public Sampler getSampler() {
return sharedState.getSampler();
}
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| void setSampler(Sampler sampler) { | ||
| this.sampler = sampler; | ||
| } |
| /** | ||
| * Updates the sampler used for new spans. | ||
| * | ||
| * @param sampler the sampler to use for sampling new spans. | ||
| */ |
There was a problem hiding this comment.
Follow-up: added sampler lifecycle handling so replaced samplers are shut down, and samplers set after provider shutdown are immediately shut down. Added tests covering both cases. :sdk:trace:test passes.
Summary
Add runtime sampler updates to
SdkTracerProviderso a sampler can be changed after the provider is built.Changes
SdkTracerProvider.setSampler(Sampler)Verification
./gradlew :sdk:trace:test --tests io.opentelemetry.sdk.trace.SdkTracerProviderTest./gradlew :sdk:trace:test./gradlew spotlessApplygit diff --check