From 5c31af365521d6ec0c79fa9a4d0f4de7334656b2 Mon Sep 17 00:00:00 2001 From: lcian Date: Fri, 6 Jun 2025 17:24:03 +0200 Subject: [PATCH 01/10] Set thread information on transaction from OTEL attributes --- .../sentry/opentelemetry/SentrySpanExporter.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java index 6db21ff797..aadb1f1af6 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java @@ -12,6 +12,7 @@ import io.opentelemetry.sdk.trace.export.SpanExporter; import io.opentelemetry.semconv.HttpAttributes; import io.opentelemetry.semconv.incubating.ProcessIncubatingAttributes; +import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import io.sentry.Baggage; import io.sentry.DateUtils; import io.sentry.DefaultSpanFactory; @@ -339,6 +340,7 @@ private void transferSpanDetails( setOtelInstrumentationInfo(span, sentryTransaction); setOtelSpanKind(span, sentryTransaction); transferSpanDetails(sentrySpanMaybe, sentryTransaction); + maybeTransferOtelThreadAttributes(span, sentryTransaction); scopesToUse.configureScope( ScopeType.CURRENT, @@ -347,6 +349,19 @@ private void transferSpanDetails( return sentryTransaction; } + private void maybeTransferOtelThreadAttributes( + final @NotNull SpanData span, final @NotNull ITransaction sentryTransaction) { + final @NotNull Attributes attributes = span.getAttributes(); + final @Nullable Long threadId = attributes.get(ThreadIncubatingAttributes.THREAD_ID); + if (threadId != null) { + sentryTransaction.setData(ThreadIncubatingAttributes.THREAD_ID.getKey(), threadId); + } + final @Nullable String threadName = attributes.get(ThreadIncubatingAttributes.THREAD_NAME); + if (threadName != null) { + sentryTransaction.setData(ThreadIncubatingAttributes.THREAD_NAME.getKey(), threadName); + } + } + private List findCompletedRootNodes(final @NotNull List grouped) { final @NotNull Predicate isRootPredicate = (node) -> { From b2e0f0b3d7335d058e474c1aefd03d10ba58ec9c Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Fri, 6 Jun 2025 15:54:55 +0000 Subject: [PATCH 02/10] Format code --- .../main/java/io/sentry/opentelemetry/SentrySpanExporter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java index aadb1f1af6..7252ab7fb1 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java @@ -354,11 +354,11 @@ private void maybeTransferOtelThreadAttributes( final @NotNull Attributes attributes = span.getAttributes(); final @Nullable Long threadId = attributes.get(ThreadIncubatingAttributes.THREAD_ID); if (threadId != null) { - sentryTransaction.setData(ThreadIncubatingAttributes.THREAD_ID.getKey(), threadId); + sentryTransaction.setData(ThreadIncubatingAttributes.THREAD_ID.getKey(), threadId); } final @Nullable String threadName = attributes.get(ThreadIncubatingAttributes.THREAD_NAME); if (threadName != null) { - sentryTransaction.setData(ThreadIncubatingAttributes.THREAD_NAME.getKey(), threadName); + sentryTransaction.setData(ThreadIncubatingAttributes.THREAD_NAME.getKey(), threadName); } } From 1f2312eff9130373c9b9390a3e36753a57aa2934 Mon Sep 17 00:00:00 2001 From: lcian Date: Fri, 6 Jun 2025 18:05:12 +0200 Subject: [PATCH 03/10] trigger CI From a11f49436f67237ae23f724ac0f441a8d047d56a Mon Sep 17 00:00:00 2001 From: lcian Date: Fri, 6 Jun 2025 18:06:47 +0200 Subject: [PATCH 04/10] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32cb4c8bf6..6db2411e5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - Session Replay: Do not capture current replay for cached events from the past ([#4474](https://github.com/getsentry/sentry-java/pull/4474)) - Session Replay: Correctly capture Dialogs and non full-sized windows ([#4354](https://github.com/getsentry/sentry-java/pull/4354)) - Session Replay: Fix inconsistent `segment_id` ([#4471](https://github.com/getsentry/sentry-java/pull/4471)) +- Set thread information on transaction from OTEL attributes ([#4478](https://github.com/getsentry/sentry-java/pull/4478)) ## 8.13.2 From 9ca2c5bfb5206425674e6a2c52107a6fe77d6ced Mon Sep 17 00:00:00 2001 From: lcian Date: Tue, 10 Jun 2025 15:28:56 +0200 Subject: [PATCH 05/10] trigger CI From c24e8570db117a1a6ad5f29eadc134561717ca53 Mon Sep 17 00:00:00 2001 From: Lorenzo Cian Date: Wed, 11 Jun 2025 14:34:08 +0200 Subject: [PATCH 06/10] Update CHANGELOG.md Co-authored-by: Alexander Dinauer --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6db2411e5a..3a9d456de4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ - Session Replay: Do not capture current replay for cached events from the past ([#4474](https://github.com/getsentry/sentry-java/pull/4474)) - Session Replay: Correctly capture Dialogs and non full-sized windows ([#4354](https://github.com/getsentry/sentry-java/pull/4354)) - Session Replay: Fix inconsistent `segment_id` ([#4471](https://github.com/getsentry/sentry-java/pull/4471)) -- Set thread information on transaction from OTEL attributes ([#4478](https://github.com/getsentry/sentry-java/pull/4478)) +- Set thread information on transaction from OpenTelemetry attributes ([#4478](https://github.com/getsentry/sentry-java/pull/4478)) ## 8.13.2 From 63abdafd9c1f167e535016414bb7f56a60d37455 Mon Sep 17 00:00:00 2001 From: lcian Date: Thu, 3 Jul 2025 13:35:28 +0200 Subject: [PATCH 07/10] improve --- .../api/sentry-opentelemetry-core.api | 5 +++++ .../sentry/opentelemetry/OtelSpanUtils.java | 19 +++++++++++++++++++ .../opentelemetry/SentrySpanExporter.java | 18 ++++-------------- .../opentelemetry/OpenTelemetryUtil.java | 6 ++---- 4 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/api/sentry-opentelemetry-core.api b/sentry-opentelemetry/sentry-opentelemetry-core/api/sentry-opentelemetry-core.api index f20ea0ab86..4c231317af 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/api/sentry-opentelemetry-core.api +++ b/sentry-opentelemetry/sentry-opentelemetry-core/api/sentry-opentelemetry-core.api @@ -50,6 +50,11 @@ public final class io/sentry/opentelemetry/OtelSpanInfo { public fun getTransactionNameSource ()Lio/sentry/protocol/TransactionNameSource; } +public final class io/sentry/opentelemetry/OtelSpanUtils { + public fun ()V + public static fun maybeTransferOtelAttribute (Lio/opentelemetry/sdk/trace/data/SpanData;Lio/sentry/ISpan;Lio/opentelemetry/api/common/AttributeKey;)V +} + public final class io/sentry/opentelemetry/OtelSpanWrapper : io/sentry/opentelemetry/IOtelSpanWrapper { public fun (Lio/opentelemetry/sdk/trace/ReadWriteSpan;Lio/sentry/IScopes;Lio/sentry/SentryDate;Lio/sentry/TracesSamplingDecision;Lio/sentry/opentelemetry/IOtelSpanWrapper;Lio/sentry/SpanId;Lio/sentry/Baggage;)V public fun finish ()V diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java new file mode 100644 index 0000000000..726994a2db --- /dev/null +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java @@ -0,0 +1,19 @@ +package io.sentry.opentelemetry; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.sentry.ISpan; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public final class OtelSpanUtils { + public static void maybeTransferOtelAttribute( + final @NotNull SpanData otelSpan, final @NotNull ISpan sentrySpan, final @NotNull AttributeKey key) { + final @NotNull Attributes attributes = otelSpan.getAttributes(); + final @Nullable T value = attributes.get(key); + if (value != null) { + sentrySpan.setData(key.getKey(), value); + } + } +} diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java index 7252ab7fb1..268b8231a8 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java @@ -3,6 +3,7 @@ import static io.sentry.TransactionContext.DEFAULT_TRANSACTION_NAME; import static io.sentry.opentelemetry.InternalSemanticAttributes.IS_REMOTE_PARENT; import static io.sentry.opentelemetry.OtelInternalSpanDetectionUtil.isSentryRequest; +import static io.sentry.opentelemetry.OtelSpanUtils.maybeTransferOtelAttribute; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.StatusCode; @@ -340,7 +341,9 @@ private void transferSpanDetails( setOtelInstrumentationInfo(span, sentryTransaction); setOtelSpanKind(span, sentryTransaction); transferSpanDetails(sentrySpanMaybe, sentryTransaction); - maybeTransferOtelThreadAttributes(span, sentryTransaction); + + maybeTransferOtelAttribute(span, sentryTransaction, ThreadIncubatingAttributes.THREAD_ID); + maybeTransferOtelAttribute(span, sentryTransaction, ThreadIncubatingAttributes.THREAD_NAME); scopesToUse.configureScope( ScopeType.CURRENT, @@ -349,19 +352,6 @@ private void transferSpanDetails( return sentryTransaction; } - private void maybeTransferOtelThreadAttributes( - final @NotNull SpanData span, final @NotNull ITransaction sentryTransaction) { - final @NotNull Attributes attributes = span.getAttributes(); - final @Nullable Long threadId = attributes.get(ThreadIncubatingAttributes.THREAD_ID); - if (threadId != null) { - sentryTransaction.setData(ThreadIncubatingAttributes.THREAD_ID.getKey(), threadId); - } - final @Nullable String threadName = attributes.get(ThreadIncubatingAttributes.THREAD_NAME); - if (threadName != null) { - sentryTransaction.setData(ThreadIncubatingAttributes.THREAD_NAME.getKey(), threadName); - } - } - private List findCompletedRootNodes(final @NotNull List grouped) { final @NotNull Predicate isRootPredicate = (node) -> { diff --git a/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java b/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java index 05dd7c76da..63c73b015b 100644 --- a/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java +++ b/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java @@ -1,9 +1,6 @@ package io.sentry.opentelemetry; -import io.sentry.NoOpLogger; -import io.sentry.SentryLevel; -import io.sentry.SentryOpenTelemetryMode; -import io.sentry.SentryOptions; +import io.sentry.*; import io.sentry.util.LoadClass; import io.sentry.util.Platform; import io.sentry.util.SpanUtils; @@ -11,6 +8,7 @@ import java.util.List; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; @ApiStatus.Internal public final class OpenTelemetryUtil { From d46d71297156085c803680d39efaaf477d5c0bd1 Mon Sep 17 00:00:00 2001 From: lcian Date: Thu, 3 Jul 2025 13:36:50 +0200 Subject: [PATCH 08/10] improve --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 241a6b34b8..8664c008b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Optimize scope when maxBreadcrumb is 0 ([#4504](https://github.com/getsentry/sentry-java/pull/4504)) - Fix javadoc on TransportResult ([#4528](https://github.com/getsentry/sentry-java/pull/4528)) +- Set thread information on transaction from OpenTelemetry attributes ([#4478](https://github.com/getsentry/sentry-java/pull/4478)) ### Internal @@ -163,7 +164,6 @@ - Session Replay: Do not capture current replay for cached events from the past ([#4474](https://github.com/getsentry/sentry-java/pull/4474)) - Session Replay: Correctly capture Dialogs and non full-sized windows ([#4354](https://github.com/getsentry/sentry-java/pull/4354)) - Session Replay: Fix inconsistent `segment_id` ([#4471](https://github.com/getsentry/sentry-java/pull/4471)) -- Set thread information on transaction from OpenTelemetry attributes ([#4478](https://github.com/getsentry/sentry-java/pull/4478)) - Session Replay: Fix crash on devices with the Unisoc/Spreadtrum T606 chipset ([#4477](https://github.com/getsentry/sentry-java/pull/4477)) ## 8.13.2 From 270e7a144ee87aed29dbdfd9cf7d3d0bb068f1b2 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Thu, 3 Jul 2025 11:37:25 +0000 Subject: [PATCH 09/10] Format code --- .../src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java | 4 +++- .../main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java index 726994a2db..c9b2fad24e 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java @@ -9,7 +9,9 @@ public final class OtelSpanUtils { public static void maybeTransferOtelAttribute( - final @NotNull SpanData otelSpan, final @NotNull ISpan sentrySpan, final @NotNull AttributeKey key) { + final @NotNull SpanData otelSpan, + final @NotNull ISpan sentrySpan, + final @NotNull AttributeKey key) { final @NotNull Attributes attributes = otelSpan.getAttributes(); final @Nullable T value = attributes.get(key); if (value != null) { diff --git a/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java b/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java index 63c73b015b..1a287a78ef 100644 --- a/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java +++ b/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java @@ -8,7 +8,6 @@ import java.util.List; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; @ApiStatus.Internal public final class OpenTelemetryUtil { From 2239dd90daeb8f3db2f3c16e8c0083c9da9ad306 Mon Sep 17 00:00:00 2001 From: lcian Date: Thu, 3 Jul 2025 13:38:01 +0200 Subject: [PATCH 10/10] improve --- .../main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java b/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java index 1a287a78ef..05dd7c76da 100644 --- a/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java +++ b/sentry/src/main/java/io/sentry/opentelemetry/OpenTelemetryUtil.java @@ -1,6 +1,9 @@ package io.sentry.opentelemetry; -import io.sentry.*; +import io.sentry.NoOpLogger; +import io.sentry.SentryLevel; +import io.sentry.SentryOpenTelemetryMode; +import io.sentry.SentryOptions; import io.sentry.util.LoadClass; import io.sentry.util.Platform; import io.sentry.util.SpanUtils;