From 7bd038473b498f8f30b3156e293f6df4a373a88c Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 09:52:31 +0000 Subject: [PATCH 1/3] ref(core): Remove deprecated traceSampling option Remove SentryOptions.isTraceSampling/setTraceSampling and the io.sentry.traces.trace-sampling Android manifest key. The option has defaulted to true since 6.5.0 and was marked experimental and deprecated in favor of tracePropagationTargets. Trace context and baggage are now always produced when a transaction has baggage, and outgoing tracing headers are controlled by tracePropagationTargets alone. Co-Authored-By: Alexander Dinauer --- .../android/core/ManifestMetadataReader.java | 5 --- .../core/ManifestMetadataReaderTest.kt | 25 ------------- .../sentry/apollo/SentryApolloInterceptor.kt | 2 +- .../sentry/openfeign/SentryFeignClientTest.kt | 5 --- .../sentry/opentelemetry/OtelSpanWrapper.java | 20 ++++------ .../test/kotlin/OtelSentryPropagatorTest.kt | 37 ------------------- .../SentrySpanRestClientCustomizerTest.kt | 1 - .../SentrySpanRestTemplateCustomizerTest.kt | 1 - .../SentrySpanRestClientCustomizerTest.kt | 1 - .../SentrySpanRestTemplateCustomizerTest.kt | 1 - .../SentrySpanRestTemplateCustomizerTest.kt | 1 - sentry/api/sentry.api | 2 - sentry/src/main/java/io/sentry/ISpan.java | 4 +- .../main/java/io/sentry/SentryOptions.java | 33 ----------------- .../src/main/java/io/sentry/SentryTracer.java | 20 ++++------ .../java/io/sentry/util/TracingUtils.java | 2 +- .../test/java/io/sentry/SentryClientTest.kt | 1 - .../test/java/io/sentry/SentryTracerTest.kt | 8 +--- sentry/src/test/java/io/sentry/SpanTest.kt | 1 - .../java/io/sentry/util/TracingUtilsTest.kt | 32 ---------------- 20 files changed, 22 insertions(+), 180 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java index b6e802bbd5f..80ca35f8a98 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java @@ -24,7 +24,6 @@ import java.util.Locale; import java.util.Map; import java.util.Set; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -101,7 +100,6 @@ final class ManifestMetadataReader { static final String PROFILER_START_ON_APP_START = "io.sentry.traces.profiling.start-on-app-start"; - @ApiStatus.Experimental static final String TRACE_SAMPLING = "io.sentry.traces.trace-sampling"; static final String TRACE_PROPAGATION_TARGETS = "io.sentry.traces.trace-propagation-targets"; static final String ATTACH_THREADS = "io.sentry.attach-threads"; @@ -474,9 +472,6 @@ static void applyMetadata( } } - options.setTraceSampling( - readBool(metadata, logger, TRACE_SAMPLING, options.isTraceSampling())); - options.setEnableAutoActivityLifecycleTracing( readBool( metadata, diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt index 6684f8c617d..af61008eb85 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt @@ -1034,31 +1034,6 @@ class ManifestMetadataReaderTest { assertTrue(fixture.options.isEnableActivityLifecycleTracingAutoFinish) } - @Test - fun `applyMetadata reads traceSampling to options`() { - // Arrange - val bundle = bundleOf(ManifestMetadataReader.TRACE_SAMPLING to false) - val context = fixture.getContext(metaData = bundle) - - // Act - ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider) - - // Assert - assertFalse(fixture.options.isTraceSampling) - } - - @Test - fun `applyMetadata reads traceSampling to options and keeps default`() { - // Arrange - val context = fixture.getContext() - - // Act - ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider) - - // Assert - assertTrue(fixture.options.isTraceSampling) - } - @Test fun `applyMetadata reads profilesSampleRate from metadata`() { // Arrange diff --git a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt index 3524d32dc1f..cebce80c699 100644 --- a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt +++ b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt @@ -134,7 +134,7 @@ class SentryApolloInterceptor( private fun addTracingHeaders(request: InterceptorRequest, span: ISpan?): RequestHeaders { val requestHeaderBuilder = request.requestHeaders.toBuilder() - if (scopes.options.isTraceSampling && !isIgnored()) { + if (!isIgnored()) { // we have no access to URI, no way to verify tracing origins TracingUtils.trace( scopes, diff --git a/sentry-openfeign/src/test/kotlin/io/sentry/openfeign/SentryFeignClientTest.kt b/sentry-openfeign/src/test/kotlin/io/sentry/openfeign/SentryFeignClientTest.kt index 5771802c5b8..b556911f774 100644 --- a/sentry-openfeign/src/test/kotlin/io/sentry/openfeign/SentryFeignClientTest.kt +++ b/sentry-openfeign/src/test/kotlin/io/sentry/openfeign/SentryFeignClientTest.kt @@ -95,7 +95,6 @@ class SentryFeignClientTest { @Test fun `when there is an active span, adds sentry trace header to the request`() { - fixture.sentryOptions.isTraceSampling = true fixture.sentryOptions.dsn = "https://key@sentry.io/proj" val sut = fixture.getSut() sut.getOk() @@ -107,7 +106,6 @@ class SentryFeignClientTest { @Test fun `when there is an active span, existing baggage headers are merged with sentry baggage into single header`() { - fixture.sentryOptions.isTraceSampling = true fixture.sentryOptions.dsn = "https://key@sentry.io/proj" val sut = fixture.getSut() @@ -176,7 +174,6 @@ class SentryFeignClientTest { @Test fun `when request url not in tracing origins, does not add sentry trace header to the request`() { fixture.sentryOptions.setTracePropagationTargets(listOf("http://some-other-url.sentry.io")) - fixture.sentryOptions.isTraceSampling = true fixture.sentryOptions.dsn = "https://key@sentry.io/proj" val sut = fixture.getSut() sut.getOk() @@ -420,7 +417,6 @@ class SentryFeignClientTest { @Test fun `adds W3C traceparent header when propagateTraceparent is enabled`() { - fixture.sentryOptions.isTraceSampling = true fixture.sentryOptions.isPropagateTraceparent = true fixture.sentryOptions.dsn = "https://key@sentry.io/proj" val sut = fixture.getSut() @@ -433,7 +429,6 @@ class SentryFeignClientTest { @Test fun `does not add W3C traceparent header when propagateTraceparent is disabled`() { - fixture.sentryOptions.isTraceSampling = true fixture.sentryOptions.isPropagateTraceparent = false fixture.sentryOptions.dsn = "https://key@sentry.io/proj" val sut = fixture.getSut() diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java index 80da51f9db7..e502cf7f1f3 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java @@ -217,12 +217,10 @@ public OtelSpanWrapper( @Override public @Nullable TraceContext traceContext() { - if (scopes.getOptions().isTraceSampling()) { - final @Nullable Baggage baggage = context.getBaggage(); - if (baggage != null) { - updateBaggageValues(baggage); - return baggage.toTraceContext(); - } + final @Nullable Baggage baggage = context.getBaggage(); + if (baggage != null) { + updateBaggageValues(baggage); + return baggage.toTraceContext(); } return null; } @@ -249,12 +247,10 @@ private void updateBaggageValues(final @NotNull Baggage baggage) { @Override public @Nullable BaggageHeader toBaggageHeader(@Nullable List thirdPartyBaggageHeaders) { - if (scopes.getOptions().isTraceSampling()) { - final @Nullable Baggage baggage = context.getBaggage(); - if (baggage != null) { - updateBaggageValues(baggage); - return BaggageHeader.fromBaggageAndOutgoingHeader(baggage, thirdPartyBaggageHeaders); - } + final @Nullable Baggage baggage = context.getBaggage(); + if (baggage != null) { + updateBaggageValues(baggage); + return BaggageHeader.fromBaggageAndOutgoingHeader(baggage, thirdPartyBaggageHeaders); } return null; } diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/OtelSentryPropagatorTest.kt b/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/OtelSentryPropagatorTest.kt index 6b9e733157d..f935d71b329 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/OtelSentryPropagatorTest.kt +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/OtelSentryPropagatorTest.kt @@ -261,43 +261,6 @@ class OtelSentryPropagatorTest { assertNull(carrier["baggage"]) } - @Test - fun `does not inject headers if URL in span attributes with tracePropagationTargets set to same url but trace sampling disabled`() { - Sentry.init { options -> - options.dsn = "https://key@sentry.io/proj" - options.setTracePropagationTargets(listOf("sentry.io")) - options.isTraceSampling = false - } - val propagator = OtelSentryPropagator() - val carrier = mutableMapOf() - - val otelAttributes = Attributes.of(UrlAttributes.URL_FULL, "https://sentry.io/some/path") - val sentrySpan = mock() - whenever(sentrySpan.toSentryTrace()) - .thenReturn(SentryTraceHeader("f9118105af4a2d42b4124532cd1065ff-424cffc8f94feeee-1")) - whenever(sentrySpan.toBaggageHeader(anyOrNull())) - .thenReturn( - BaggageHeader( - "sentry-environment=production,sentry-public_key=502f25099c204a2fbf4cb16edc5975d1,sentry-sample_rand=0.456789,sentry-sample_rate=0.5,sentry-sampled=true,sentry-trace_id=df71f5972f754b4c85af13ff5c07017d" - ) - ) - whenever(sentrySpan.openTelemetrySpanAttributes).thenReturn(otelAttributes) - val otelSpanContext = - SpanContext.create( - "f9118105af4a2d42b4124532cd1065ff", - "424cffc8f94feeee", - TraceFlags.getSampled(), - TraceState.getDefault(), - ) - val otelSpan = Span.wrap(otelSpanContext) - spanStorage.storeSentrySpan(otelSpanContext, sentrySpan) - - propagator.inject(Context.root().with(otelSpan), carrier, MapSetter()) - - assertNull(carrier["sentry-trace"]) - assertNull(carrier["baggage"]) - } - @Test fun `does not inject headers if sentry span missing`() { val propagator = OtelSentryPropagator() diff --git a/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentrySpanRestClientCustomizerTest.kt b/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentrySpanRestClientCustomizerTest.kt index 7b50e923b1a..1287bea23b0 100644 --- a/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentrySpanRestClientCustomizerTest.kt +++ b/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentrySpanRestClientCustomizerTest.kt @@ -73,7 +73,6 @@ class SentrySpanRestClientCustomizerTest { } sentryOptions.dsn = "https://key@sentry.io/proj" - sentryOptions.isTraceSampling = true mockServer.enqueue( MockResponse().setBody("OK").setSocketPolicy(socketPolicy).setResponseCode(status.value()) diff --git a/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentrySpanRestTemplateCustomizerTest.kt b/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentrySpanRestTemplateCustomizerTest.kt index 988824465bb..5e57feaf1c9 100644 --- a/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentrySpanRestTemplateCustomizerTest.kt +++ b/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentrySpanRestTemplateCustomizerTest.kt @@ -77,7 +77,6 @@ class SentrySpanRestTemplateCustomizerTest { } sentryOptions.dsn = "https://key@sentry.io/proj" - sentryOptions.isTraceSampling = true mockServer.enqueue( MockResponse().setBody("OK").setSocketPolicy(socketPolicy).setResponseCode(status.value()) diff --git a/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestClientCustomizerTest.kt b/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestClientCustomizerTest.kt index 7a2e6a0ff4f..b689d5cdde7 100644 --- a/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestClientCustomizerTest.kt +++ b/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestClientCustomizerTest.kt @@ -73,7 +73,6 @@ class SentrySpanRestClientCustomizerTest { } sentryOptions.dsn = "https://key@sentry.io/proj" - sentryOptions.isTraceSampling = true mockServer.enqueue( MockResponse().setBody("OK").setSocketPolicy(socketPolicy).setResponseCode(status.value()) diff --git a/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestTemplateCustomizerTest.kt b/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestTemplateCustomizerTest.kt index c6c7707aab9..9cc7bc5af64 100644 --- a/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestTemplateCustomizerTest.kt +++ b/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestTemplateCustomizerTest.kt @@ -77,7 +77,6 @@ class SentrySpanRestTemplateCustomizerTest { } sentryOptions.dsn = "https://key@sentry.io/proj" - sentryOptions.isTraceSampling = true mockServer.enqueue( MockResponse().setBody("OK").setSocketPolicy(socketPolicy).setResponseCode(status.value()) diff --git a/sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentrySpanRestTemplateCustomizerTest.kt b/sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentrySpanRestTemplateCustomizerTest.kt index 29699f61022..5d2a2f1c0cf 100644 --- a/sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentrySpanRestTemplateCustomizerTest.kt +++ b/sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentrySpanRestTemplateCustomizerTest.kt @@ -77,7 +77,6 @@ class SentrySpanRestTemplateCustomizerTest { } sentryOptions.dsn = "https://key@sentry.io/proj" - sentryOptions.isTraceSampling = true mockServer.enqueue( MockResponse().setBody("OK").setSocketPolicy(socketPolicy).setResponseCode(status.value()) diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index a3a8997fb8c..997689a50e4 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -3652,7 +3652,6 @@ public class io/sentry/SentryOptions : io/sentry/transport/RateLimiterConfig { public fun isStartProfilerOnAppStart ()Z public fun isStrictTraceContinuation ()Z public fun isTraceOptionsRequests ()Z - public fun isTraceSampling ()Z public fun isTracingEnabled ()Z public fun merge (Lio/sentry/ExternalOptions;)V public fun setAppStartExtender (Lio/sentry/IAppStartExtender;)V @@ -3778,7 +3777,6 @@ public class io/sentry/SentryOptions : io/sentry/transport/RateLimiterConfig { public fun setTimerExecutorService (Lio/sentry/ISentryExecutorService;)V public fun setTraceOptionsRequests (Z)V public fun setTracePropagationTargets (Ljava/util/List;)V - public fun setTraceSampling (Z)V public fun setTracesSampleRate (Ljava/lang/Double;)V public fun setTracesSampler (Lio/sentry/SentryOptions$TracesSamplerCallback;)V public fun setTransactionProfiler (Lio/sentry/ITransactionProfiler;)V diff --git a/sentry/src/main/java/io/sentry/ISpan.java b/sentry/src/main/java/io/sentry/ISpan.java index 9c55cdc3201..418b9cdc62b 100644 --- a/sentry/src/main/java/io/sentry/ISpan.java +++ b/sentry/src/main/java/io/sentry/ISpan.java @@ -91,7 +91,7 @@ default ISpan startChild( /** * Returns the trace context. * - * @return a trace context or {@code null} if {@link SentryOptions#isTraceSampling()} is disabled. + * @return a trace context or {@code null} if there is no baggage. */ @Nullable @ApiStatus.Experimental @@ -100,7 +100,7 @@ default ISpan startChild( /** * Returns the baggage that can be sent as "baggage" header. * - * @return BaggageHeader or {@code null} if {@link SentryOptions#isTraceSampling()} is disabled. + * @return BaggageHeader or {@code null} if there is no baggage. */ @Nullable @ApiStatus.Experimental diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 08e2f408824..713930b5aac 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -411,12 +411,6 @@ public class SentryOptions implements RateLimiterConfig { */ private @NotNull RequestSize maxRequestBodySize = RequestSize.NONE; - /** - * Controls if the `baggage` header is attached to HTTP client integrations and if the `trace` - * header is attached to envelopes. - */ - private boolean traceSampling = true; - /** * Configures the profiles sample rate as a percentage of sampled transactions to be sent in the * range of 0.0 to 1.0. if 1.0 is set it means that 100% of sampled transactions will send a @@ -2142,33 +2136,6 @@ public void setMaxRequestBodySize(final @NotNull RequestSize maxRequestBodySize) this.maxRequestBodySize = maxRequestBodySize; } - /** - * Returns whether the `baggage` header is attached to HTTP client integrations and the `trace` - * header is attached to envelopes. - * - *

Note: this is an experimental API and will be removed without notice. - * - * @return true if enabled - */ - @ApiStatus.Experimental - public boolean isTraceSampling() { - return traceSampling; - } - - /** - * Controls if the `baggage` header is attached HTTP client integrations and if the `trace` header - * is attached to envelopes. Defaults to false. - * - *

Note: this is an experimental API and will be removed without notice. - * - * @deprecated please use {{@link SentryOptions#setTracePropagationTargets(List)}} instead - * @param traceSampling - if trace sampling should be enabled - */ - @Deprecated - public void setTraceSampling(boolean traceSampling) { - this.traceSampling = traceSampling; - } - /** * Returns the maximum trace file size for each envelope item in bytes. * diff --git a/sentry/src/main/java/io/sentry/SentryTracer.java b/sentry/src/main/java/io/sentry/SentryTracer.java index 781cf51417e..99cbf683659 100644 --- a/sentry/src/main/java/io/sentry/SentryTracer.java +++ b/sentry/src/main/java/io/sentry/SentryTracer.java @@ -720,12 +720,10 @@ public void finish(@Nullable SpanStatus status, @Nullable SentryDate finishDate) @Override public @Nullable TraceContext traceContext() { - if (scopes.getOptions().isTraceSampling()) { - final @Nullable Baggage baggage = getSpanContext().getBaggage(); - if (baggage != null) { - updateBaggageValues(baggage); - return baggage.toTraceContext(); - } + final @Nullable Baggage baggage = getSpanContext().getBaggage(); + if (baggage != null) { + updateBaggageValues(baggage); + return baggage.toTraceContext(); } return null; } @@ -752,12 +750,10 @@ private void updateBaggageValues(final @NotNull Baggage baggage) { @Override public @Nullable BaggageHeader toBaggageHeader(@Nullable List thirdPartyBaggageHeaders) { - if (scopes.getOptions().isTraceSampling()) { - final @Nullable Baggage baggage = getSpanContext().getBaggage(); - if (baggage != null) { - updateBaggageValues(baggage); - return BaggageHeader.fromBaggageAndOutgoingHeader(baggage, thirdPartyBaggageHeaders); - } + final @Nullable Baggage baggage = getSpanContext().getBaggage(); + if (baggage != null) { + updateBaggageValues(baggage); + return BaggageHeader.fromBaggageAndOutgoingHeader(baggage, thirdPartyBaggageHeaders); } return null; } diff --git a/sentry/src/main/java/io/sentry/util/TracingUtils.java b/sentry/src/main/java/io/sentry/util/TracingUtils.java index 9de7adec4be..d97f1442ac6 100644 --- a/sentry/src/main/java/io/sentry/util/TracingUtils.java +++ b/sentry/src/main/java/io/sentry/util/TracingUtils.java @@ -47,7 +47,7 @@ public static void setTrace( @Nullable List thirdPartyBaggageHeaders, final @Nullable ISpan span) { final @NotNull SentryOptions sentryOptions = scopes.getOptions(); - if (sentryOptions.isTraceSampling() && shouldAttachTracingHeaders(requestUrl, sentryOptions)) { + if (shouldAttachTracingHeaders(requestUrl, sentryOptions)) { return trace(scopes, thirdPartyBaggageHeaders, span); } diff --git a/sentry/src/test/java/io/sentry/SentryClientTest.kt b/sentry/src/test/java/io/sentry/SentryClientTest.kt index 926cf2d2884..259760e1f6b 100644 --- a/sentry/src/test/java/io/sentry/SentryClientTest.kt +++ b/sentry/src/test/java/io/sentry/SentryClientTest.kt @@ -108,7 +108,6 @@ class SentryClientTest { logs.setLoggerBatchProcessorFactory(loggerBatchProcessorFactory) metrics.setMetricsBatchProcessorFactory(metricsBatchProcessorFactory) release = "0.0.1" - isTraceSampling = true } init { diff --git a/sentry/src/test/java/io/sentry/SentryTracerTest.kt b/sentry/src/test/java/io/sentry/SentryTracerTest.kt index 95f19344243..257ec5390eb 100644 --- a/sentry/src/test/java/io/sentry/SentryTracerTest.kt +++ b/sentry/src/test/java/io/sentry/SentryTracerTest.kt @@ -912,7 +912,6 @@ class SentryTracerTest { fun `returns trace state`() { val transaction = fixture.getSut({ - it.isTraceSampling = true it.isSendDefaultPii = true }) fixture.scopes.setUser(User().apply { id = "user-id" }) @@ -931,7 +930,7 @@ class SentryTracerTest { @Test fun `returns trace state without userId if not send pii`() { - val transaction = fixture.getSut({ it.isTraceSampling = true }) + val transaction = fixture.getSut() fixture.scopes.setUser(User().apply { id = "user-id" }) val trace = transaction.traceContext() assertNotNull(trace) { @@ -946,7 +945,7 @@ class SentryTracerTest { @Test fun `trace state does not change once computed`() { - val transaction = fixture.getSut({ it.isTraceSampling = true }) + val transaction = fixture.getSut() val traceBeforeUserSet = transaction.traceContext() fixture.scopes.setUser(User().apply { id = "user-id" }) val traceAfterUserSet = transaction.traceContext() @@ -967,7 +966,6 @@ class SentryTracerTest { fun `returns baggage header`() { val transaction = fixture.getSut({ - it.isTraceSampling = true it.environment = "production" it.release = "1.0.99-rc.7" it.isSendDefaultPii = true @@ -996,7 +994,6 @@ class SentryTracerTest { fun `returns baggage header without userId if not send pii`() { val transaction = fixture.getSut({ - it.isTraceSampling = true it.environment = "production" it.release = "1.0.99-rc.7" }) @@ -1021,7 +1018,6 @@ class SentryTracerTest { fun `returns baggage header without userId if send pii and null user`() { val transaction = fixture.getSut({ - it.isTraceSampling = true it.environment = "production" it.release = "1.0.99-rc.7" it.isSendDefaultPii = true diff --git a/sentry/src/test/java/io/sentry/SpanTest.kt b/sentry/src/test/java/io/sentry/SpanTest.kt index b61e12ad87f..11a4efd5ff5 100644 --- a/sentry/src/test/java/io/sentry/SpanTest.kt +++ b/sentry/src/test/java/io/sentry/SpanTest.kt @@ -28,7 +28,6 @@ class SpanTest { .thenReturn( SentryOptions().apply { dsn = "https://key@sentry.io/proj" - isTraceSampling = true } ) } diff --git a/sentry/src/test/java/io/sentry/util/TracingUtilsTest.kt b/sentry/src/test/java/io/sentry/util/TracingUtilsTest.kt index edfcc361b08..d307f6c30ef 100644 --- a/sentry/src/test/java/io/sentry/util/TracingUtilsTest.kt +++ b/sentry/src/test/java/io/sentry/util/TracingUtilsTest.kt @@ -224,38 +224,6 @@ class TracingUtilsTest { assertTrue(headers.baggageHeader!!.value.contains("some-baggage-key=some-baggage-value")) } - @Test - fun `does not return headers if not trace sampling without span`() { - fixture.options.isTraceSampling = false - fixture.setup() - - val headers = - TracingUtils.traceIfAllowed( - fixture.scopes, - "https://sentry.io/hello", - fixture.preExistingBaggage, - null, - ) - - assertNull(headers) - } - - @Test - fun `does not return headers if not trace sampling from span`() { - fixture.options.isTraceSampling = false - fixture.setup() - - val headers = - TracingUtils.traceIfAllowed( - fixture.scopes, - "https://sentry.io/hello", - fixture.preExistingBaggage, - fixture.span, - ) - - assertNull(headers) - } - @Test fun `does not return headers if host is disallowed without span`() { fixture.options.setTracePropagationTargets(listOf("some-host-that-does-not-exist")) From 3c147981762983aac4f4c25fd8382c742de33014 Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 09:52:58 +0000 Subject: [PATCH 2/3] changelog Co-Authored-By: Alexander Dinauer --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b8ed0f2cd0..e9fccf23c43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Breaking Changes +- Remove the deprecated `traceSampling` option (`SentryOptions.setTraceSampling`/`isTraceSampling` and the `io.sentry.traces.trace-sampling` manifest key); use `tracePropagationTargets` to control which outgoing requests get tracing headers ([#6415](https://github.com/getsentry/sentry-java/pull/6415)) - Remove the deprecated user feedback APIs ([#6337](https://github.com/getsentry/sentry-java/pull/6337)) - `UserFeedback` and `Sentry.captureUserFeedback(...)`: use `Sentry.feedback().capture(...)` with `io.sentry.protocol.Feedback` instead - `Sentry.captureFeedback(...)`: use `Sentry.feedback().capture(...)` instead From b40802f87cb778b262b5671d9db1d924430056ba Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 10:03:16 +0000 Subject: [PATCH 3/3] test(core): Stub parsed DSN in OutboxSenderTest The mocked SentryOptions used to return false for isTraceSampling, which skipped baggage computation on transaction finish. With the option removed, SentryTracer always fills baggage values and needs a parsed DSN. --- sentry/src/test/java/io/sentry/OutboxSenderTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry/src/test/java/io/sentry/OutboxSenderTest.kt b/sentry/src/test/java/io/sentry/OutboxSenderTest.kt index 703f0823c00..f133bbb5a61 100644 --- a/sentry/src/test/java/io/sentry/OutboxSenderTest.kt +++ b/sentry/src/test/java/io/sentry/OutboxSenderTest.kt @@ -38,6 +38,7 @@ class OutboxSenderTest { init { whenever(options.dsn).thenReturn("https://key@sentry.io/proj") + whenever(options.retrieveParsedDsn()).thenReturn(Dsn("https://key@sentry.io/proj")) whenever(options.dateProvider).thenReturn(SentryNanotimeDateProvider()) whenever(options.threadChecker).thenReturn(NoOpThreadChecker.getInstance()) whenever(options.continuousProfiler).thenReturn(NoOpContinuousProfiler.getInstance())