From 03f6624643be6c979d9a5fe5842398b630c1b337 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Fri, 13 Nov 2026 05:51:50 +0100 Subject: [PATCH 1/5] build(deps): Bump OpenTelemetry to 2.33.1 Align the OpenTelemetry instrumentation and Java agent with SDK 1.67.0. Update tests for the SDK optimization that returns non-recording spans when no span processor is configured. Co-Authored-By: Claude --- gradle/libs.versions.toml | 8 ++--- .../src/test/kotlin/SentrySamplerTest.kt | 32 ++++++++++++------- .../test/kotlin/OtelSentryPropagatorTest.kt | 12 +++++-- .../src/test/kotlin/OtlpEndToEndTest.kt | 10 +++++- 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d6a55ba3d56..d012f5bd8b9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,10 +29,10 @@ nopen = "1.0.1" # see https://developer.android.com/jetpack/androidx/releases/compose-kotlin okhttp = "5.5.1" openfeature = "1.18.2" -otel = "1.63.0" -otelAlpha = "1.63.0-alpha" -otelInstrumentation = "2.29.0" -otelInstrumentationAlpha = "2.29.0-alpha" +otel = "1.67.0" +otelAlpha = "1.67.0-alpha" +otelInstrumentation = "2.33.1" +otelInstrumentationAlpha = "2.33.1-alpha" # check https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/dependencyManagement/build.gradle.kts#L49 for release version above to find a compatible version otelSemanticConventions = "1.42.0" otelSemanticConventionsAlpha = "1.42.0-alpha" diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SentrySamplerTest.kt b/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SentrySamplerTest.kt index 8a8ec0c8e0d..242b1cb35a6 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SentrySamplerTest.kt +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SentrySamplerTest.kt @@ -9,6 +9,8 @@ import io.opentelemetry.api.trace.TraceFlags import io.opentelemetry.api.trace.TraceState import io.opentelemetry.context.Context import io.opentelemetry.sdk.trace.SdkTracerProvider +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor +import io.opentelemetry.sdk.trace.export.SpanExporter import io.opentelemetry.sdk.trace.samplers.Sampler import io.opentelemetry.sdk.trace.samplers.SamplingDecision import io.sentry.DataCategory @@ -138,18 +140,24 @@ class SentrySamplerTest { verify(onDiscard).execute(DiscardReason.CALLBACK_ERROR, DataCategory.Span, 1) verifyNoMoreInteractions(onDiscard) val recordingSampler = mock(defaultAnswer = delegatesTo(sampler)) - SdkTracerProvider.builder().setSampler(recordingSampler).build().use { provider -> - val openTelemetry = - mock().also { - whenever(it.tracerProvider).thenReturn(provider) - } - OtelSpanFactory(openTelemetry).createTransaction(context, scopes, TransactionOptions(), null) - val attributes = argumentCaptor() - verify(recordingSampler).shouldSample(any(), any(), any(), any(), attributes.capture(), any()) - val restored = OtelSamplingUtil.extractSamplingDecision(attributes.firstValue)!! - assertThat(restored.sampled).isFalse() - assertThat(restored.profileSampled).isFalse() - } + SdkTracerProvider.builder() + .setSampler(recordingSampler) + .addSpanProcessor(SimpleSpanProcessor.create(SpanExporter.composite())) + .build() + .use { provider -> + val openTelemetry = + mock().also { + whenever(it.tracerProvider).thenReturn(provider) + } + OtelSpanFactory(openTelemetry) + .createTransaction(context, scopes, TransactionOptions(), null) + val attributes = argumentCaptor() + verify(recordingSampler) + .shouldSample(any(), any(), any(), any(), attributes.capture(), any()) + val restored = OtelSamplingUtil.extractSamplingDecision(attributes.firstValue)!! + assertThat(restored.sampled).isFalse() + assertThat(restored.profileSampled).isFalse() + } verifyNoMoreInteractions(onDiscard) } diff --git a/sentry-opentelemetry/sentry-opentelemetry-otlp/src/test/kotlin/OtelSentryPropagatorTest.kt b/sentry-opentelemetry/sentry-opentelemetry-otlp/src/test/kotlin/OtelSentryPropagatorTest.kt index afa728c7ff0..d0220daf952 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-otlp/src/test/kotlin/OtelSentryPropagatorTest.kt +++ b/sentry-opentelemetry/sentry-opentelemetry-otlp/src/test/kotlin/OtelSentryPropagatorTest.kt @@ -8,6 +8,8 @@ import io.opentelemetry.context.Context import io.opentelemetry.context.propagation.TextMapGetter import io.opentelemetry.context.propagation.TextMapSetter import io.opentelemetry.sdk.trace.SdkTracerProvider +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor +import io.opentelemetry.sdk.trace.export.SpanExporter import io.sentry.Baggage import io.sentry.Sentry import kotlin.test.AfterTest @@ -180,7 +182,10 @@ class OpenTelemetryOtlpPropagatorTest { } val propagator = OpenTelemetryOtlpPropagator() val carrier = mutableMapOf() - val tracerProvider = SdkTracerProvider.builder().build() + val tracerProvider = + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(SpanExporter.composite())) + .build() val otelSpan = tracerProvider .get("test") @@ -220,7 +225,10 @@ class OpenTelemetryOtlpPropagatorTest { } val propagator = OpenTelemetryOtlpPropagator() val carrier = mutableMapOf() - val tracerProvider = SdkTracerProvider.builder().build() + val tracerProvider = + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(SpanExporter.composite())) + .build() val otelSpan = tracerProvider .get("test") diff --git a/sentry-opentelemetry/sentry-opentelemetry-otlp/src/test/kotlin/OtlpEndToEndTest.kt b/sentry-opentelemetry/sentry-opentelemetry-otlp/src/test/kotlin/OtlpEndToEndTest.kt index fb3db9731e8..ca94bc1fad3 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-otlp/src/test/kotlin/OtlpEndToEndTest.kt +++ b/sentry-opentelemetry/sentry-opentelemetry-otlp/src/test/kotlin/OtlpEndToEndTest.kt @@ -3,6 +3,8 @@ package io.sentry.opentelemetry.otlp import com.google.common.truth.Truth.assertThat import io.opentelemetry.sdk.OpenTelemetrySdk import io.opentelemetry.sdk.trace.SdkTracerProvider +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor +import io.opentelemetry.sdk.trace.export.SpanExporter import io.sentry.Sentry import io.sentry.test.MockSentryServer import io.sentry.test.event @@ -20,7 +22,13 @@ import kotlin.test.Test class OtlpEndToEndTest { private val server = MockSentryServer() private val openTelemetry = - OpenTelemetrySdk.builder().setTracerProvider(SdkTracerProvider.builder().build()).build() + OpenTelemetrySdk.builder() + .setTracerProvider( + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(SpanExporter.composite())) + .build() + ) + .build() @AfterTest fun teardown() { From 850d968e9b4becf415b689ff497de8e787c1c461 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Fri, 13 Nov 2026 05:52:43 +0100 Subject: [PATCH 2/5] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 604b95a9e8f..02414d4ac5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ - Android: Count deep sleep in breadcrumb, screenshot and view hierarchy debounce windows, so the first low-memory or battery breadcrumb after a long Doze is no longer dropped ([#6590](https://github.com/getsentry/sentry-java/pull/6590)) +### Dependencies + +- Bump OpenTelemetry from 1.63.0 / 2.29.0 to 1.67.0 / 2.33.1 ([#6602](https://github.com/getsentry/sentry-java/pull/6602)) + ## 8.64.0 ### Breaking Changes From f5e9fd2a46813dae464d3171b8475dd7822f0428 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Fri, 13 Nov 2026 12:03:14 +0100 Subject: [PATCH 3/5] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02414d4ac5f..7d299a41e64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ ### Dependencies - Bump OpenTelemetry from 1.63.0 / 2.29.0 to 1.67.0 / 2.33.1 ([#6602](https://github.com/getsentry/sentry-java/pull/6602)) + - OpenTelemetry 1.67 creates no-op spans when no `SpanProcessor` is configured. If you construct the OpenTelemetry SDK manually while using `sentry-opentelemetry-otlp` classes directly, configure a span processor so outgoing span attributes remain available. Standard OTLP exporter, Sentry Java agent, and agentless setups already configure one. ## 8.64.0 From ec736a9ba40ffb8fdb4653a3ccf0d293a6b2c6c9 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Fri, 13 Nov 2026 12:09:10 +0100 Subject: [PATCH 4/5] build(deps): Align OpenTelemetry semantic conventions Use the semantic convention versions tested with OpenTelemetry Java instrumentation 2.33.1. Co-Authored-By: Claude --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d012f5bd8b9..bc506ca8666 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,8 +34,8 @@ otelAlpha = "1.67.0-alpha" otelInstrumentation = "2.33.1" otelInstrumentationAlpha = "2.33.1-alpha" # check https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/dependencyManagement/build.gradle.kts#L49 for release version above to find a compatible version -otelSemanticConventions = "1.42.0" -otelSemanticConventionsAlpha = "1.42.0-alpha" +otelSemanticConventions = "1.44.0" +otelSemanticConventionsAlpha = "1.44.0-alpha" retrofit = "3.0.0" room2 = "2.8.5" room3 = "3.0.0-rc01" From 4e3264b0d18ffe45072057768d89b953b7d02ada Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Fri, 13 Nov 2026 12:47:05 +0100 Subject: [PATCH 5/5] docs(changelog): Clarify OpenTelemetry dependency bump List the semantic convention upgrades and explain how missing span processors affect outgoing Sentry trace headers. Co-Authored-By: Claude --- CHANGELOG.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d299a41e64..97698bd17a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,8 +17,13 @@ ### Dependencies -- Bump OpenTelemetry from 1.63.0 / 2.29.0 to 1.67.0 / 2.33.1 ([#6602](https://github.com/getsentry/sentry-java/pull/6602)) - - OpenTelemetry 1.67 creates no-op spans when no `SpanProcessor` is configured. If you construct the OpenTelemetry SDK manually while using `sentry-opentelemetry-otlp` classes directly, configure a span processor so outgoing span attributes remain available. Standard OTLP exporter, Sentry Java agent, and agentless setups already configure one. +- Bump OpenTelemetry ([#6602](https://github.com/getsentry/sentry-java/pull/6602)) + - OpenTelemetry to 1.67.0 (was 1.63.0) + - OpenTelemetry Instrumentation to 2.33.1 (was 2.29.0) + - OpenTelemetry Instrumentation Alpha to 2.33.1-alpha (was 2.29.0-alpha) + - OpenTelemetry Semantic Conventions to 1.44.0 (was 1.42.0) + - OpenTelemetry Semantic Conventions Alpha to 1.44.0-alpha (was 1.42.0-alpha) + - OpenTelemetry 1.67 creates no-op spans when no `SpanProcessor` is configured. If you construct the OpenTelemetry SDK manually while using `sentry-opentelemetry-otlp` classes directly, configure a span processor. Without one, Sentry cannot inspect outgoing request URLs and may inject `sentry-trace` and `baggage` headers into destinations excluded by `tracePropagationTargets`. Standard OTLP exporter, Sentry Java agent, and agentless setups already configure one. ## 8.64.0