From e0b8e9428f843f2087a3b0a57a4262cba4dac235 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Mon, 21 Jul 2025 09:22:53 +0200 Subject: [PATCH 1/4] Reduce scope forking in OpenTelemetry --- .../java/io/sentry/opentelemetry/SentryContextStorage.java | 5 +++++ .../java/io/sentry/opentelemetry/SentryContextWrapper.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextStorage.java b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextStorage.java index 4f3efa40c29..5a916a9ecab 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextStorage.java +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextStorage.java @@ -38,4 +38,9 @@ public Scope attach(Context toAttach) { public Context current() { return contextStorage.current(); } + + @Override + public Context root() { + return SentryContextWrapper.wrap(ContextStorage.super.root()); + } } diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextWrapper.java b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextWrapper.java index a0213bafe65..1b0581fc9e2 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextWrapper.java +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextWrapper.java @@ -32,7 +32,7 @@ public Context with(final @NotNull ContextKey contextKey, V v) { if (isOpentelemetrySpan(contextKey)) { return forkCurrentScope(modifiedContext); } else { - return modifiedContext; + return new SentryContextWrapper(modifiedContext); } } From 2df540cf3763e03b2bd5278ec7dc73f0f3c75f09 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Mon, 21 Jul 2025 07:31:27 +0000 Subject: [PATCH 2/4] Format code --- .../java/io/sentry/samples/console/Main.java | 16 ++++++++-------- .../systemtest/ConsoleApplicationSystemTest.kt | 4 ++-- .../io/sentry/systemtest/util/TestHelper.kt | 3 +-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/main/java/io/sentry/samples/console/Main.java b/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/main/java/io/sentry/samples/console/Main.java index d552968f315..8af939c32bf 100644 --- a/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/main/java/io/sentry/samples/console/Main.java +++ b/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/main/java/io/sentry/samples/console/Main.java @@ -4,7 +4,6 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.context.Scope; -import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.sentry.Breadcrumb; import io.sentry.EventProcessor; @@ -27,13 +26,14 @@ public class Main { public static void main(String[] args) throws InterruptedException { AutoConfiguredOpenTelemetrySdk.builder() .setResultAsGlobal() - .addPropertiesSupplier(() -> { - final Map properties = new HashMap<>(); - properties.put("otel.logs.exporter", "none"); - properties.put("otel.metrics.exporter", "none"); - properties.put("otel.traces.exporter", "none"); - return properties; - }) + .addPropertiesSupplier( + () -> { + final Map properties = new HashMap<>(); + properties.put("otel.logs.exporter", "none"); + properties.put("otel.metrics.exporter", "none"); + properties.put("otel.traces.exporter", "none"); + return properties; + }) .build(); Sentry.addBreadcrumb( diff --git a/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/test/kotlin/sentry/systemtest/ConsoleApplicationSystemTest.kt b/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/test/kotlin/sentry/systemtest/ConsoleApplicationSystemTest.kt index 40a34a78aee..04a5beeb8f9 100644 --- a/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/test/kotlin/sentry/systemtest/ConsoleApplicationSystemTest.kt +++ b/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/test/kotlin/sentry/systemtest/ConsoleApplicationSystemTest.kt @@ -24,7 +24,7 @@ class ConsoleApplicationSystemTest { jarFile, mapOf( "SENTRY_DSN" to testHelper.dsn, -// "SENTRY_AUTO_INIT" to "false", + // "SENTRY_AUTO_INIT" to "false", "SENTRY_TRACES_SAMPLE_RATE" to "1.0", "SENTRY_ENABLE_PRETTY_SERIALIZATION_OUTPUT" to "false", "SENTRY_DEBUG" to "true", @@ -32,7 +32,7 @@ class ConsoleApplicationSystemTest { "OTEL_LOGS_EXPORTER" to "none", "OTEL_TRACES_EXPORTER" to "none", ), - enableOtelAutoConfig = true + enableOtelAutoConfig = true, ) process.waitFor(30, TimeUnit.SECONDS) diff --git a/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/util/TestHelper.kt b/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/util/TestHelper.kt index 0117f66d38d..73b2acd2ae1 100644 --- a/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/util/TestHelper.kt +++ b/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/util/TestHelper.kt @@ -299,8 +299,7 @@ class TestHelper(backendUrl: String) { processBuilderList.add(jar.absolutePath) val processBuilder = - ProcessBuilder(processBuilderList) - .inheritIO() // forward i/o to current process + ProcessBuilder(processBuilderList).inheritIO() // forward i/o to current process processBuilder.environment().putAll(env) From cdcb4fca3c80b42a8e511d0546a29f7f0a62a21c Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 29 Jul 2025 15:56:54 +0200 Subject: [PATCH 3/4] api --- .../api/sentry-opentelemetry-bootstrap.api | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/api/sentry-opentelemetry-bootstrap.api b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/api/sentry-opentelemetry-bootstrap.api index 8e6b59b4be2..3a63bf04d98 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/api/sentry-opentelemetry-bootstrap.api +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/api/sentry-opentelemetry-bootstrap.api @@ -151,6 +151,7 @@ public final class io/sentry/opentelemetry/SentryContextStorage : io/opentelemet public fun (Lio/opentelemetry/context/ContextStorage;)V public fun attach (Lio/opentelemetry/context/Context;)Lio/opentelemetry/context/Scope; public fun current ()Lio/opentelemetry/context/Context; + public fun root ()Lio/opentelemetry/context/Context; } public final class io/sentry/opentelemetry/SentryContextStorageProvider : io/opentelemetry/context/ContextStorageProvider { From 3dc95feaf34887177dedd72a1d66dcac21acbdd4 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 29 Jul 2025 16:00:30 +0200 Subject: [PATCH 4/4] changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd255f9fb2e..e7c4fd9fc70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,9 @@ - This was causing Sentry SDK to log warnings: "Sentry Log is disabled and this 'logger' call is a no-op." - Do not use Sentry logging API in Log4j2 if logs are disabled ([#4573](https://github.com/getsentry/sentry-java/pull/4573)) - This was causing Sentry SDK to log warnings: "Sentry Log is disabled and this 'logger' call is a no-op." +- Reduce scope forking when using OpenTelemetry ([#4565](https://github.com/getsentry/sentry-java/pull/4565)) + - `Sentry.withScope` now has the correct current scope passed to the callback. Previously our OpenTelemetry integration forked scopes an additional. + - Overall the SDK is now forking scopes a bit less often. ## 8.17.0