diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b4c24237e..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 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..c9b2fad24e --- /dev/null +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSpanUtils.java @@ -0,0 +1,21 @@ +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 6db21ff797..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; @@ -12,6 +13,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; @@ -340,6 +342,9 @@ private void transferSpanDetails( setOtelSpanKind(span, sentryTransaction); transferSpanDetails(sentrySpanMaybe, sentryTransaction); + maybeTransferOtelAttribute(span, sentryTransaction, ThreadIncubatingAttributes.THREAD_ID); + maybeTransferOtelAttribute(span, sentryTransaction, ThreadIncubatingAttributes.THREAD_NAME); + scopesToUse.configureScope( ScopeType.CURRENT, scope -> attributesExtractor.extract(span, scope, scopesToUse.getOptions()));