From d2b5881176fb6e77e8065cc9beaa62273f509ca9 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 4 Jul 2024 13:11:07 +0200 Subject: [PATCH 1/2] Use parent span id from sentry-trace header --- .../sentry/opentelemetry/OtelSentrySpanProcessor.java | 11 +++++++++-- .../java/io/sentry/opentelemetry/SentrySampler.java | 1 + .../api/sentry-opentelemetry-extra.api | 4 ++-- .../java/io/sentry/opentelemetry/OtelSpanContext.java | 3 ++- .../java/io/sentry/opentelemetry/OtelSpanWrapper.java | 4 +++- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSentrySpanProcessor.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSentrySpanProcessor.java index 8dd4bd160aa..74399068681 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSentrySpanProcessor.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSentrySpanProcessor.java @@ -53,13 +53,14 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri TracesSamplingDecision samplingDecision = OtelSamplingUtil.extractSamplingDecisionOrDefault(otelSpan.toSpanData().getAttributes()); @Nullable Baggage baggage = null; + @Nullable SpanId sentryParentSpanId = null; otelSpan.setAttribute(IS_REMOTE_PARENT, otelSpan.getParentSpanContext().isRemote()); if (sentryParentSpan == null) { final @NotNull String traceId = otelSpan.getSpanContext().getTraceId(); final @NotNull String spanId = otelSpan.getSpanContext().getSpanId(); final @NotNull SpanId sentrySpanId = new SpanId(spanId); final @NotNull String parentSpanId = otelSpan.getParentSpanContext().getSpanId(); - final @Nullable SpanId sentryParentSpanId = + sentryParentSpanId = io.opentelemetry.api.trace.SpanId.isValid(parentSpanId) ? new SpanId(parentSpanId) : null; @Nullable @@ -99,7 +100,13 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri new SentryLongDate(otelSpan.toSpanData().getStartEpochNanos()); final @NotNull OtelSpanWrapper sentrySpan = new OtelSpanWrapper( - otelSpan, scopes, startTimestamp, samplingDecision, sentryParentSpan, baggage); + otelSpan, + scopes, + startTimestamp, + samplingDecision, + sentryParentSpan, + sentryParentSpanId, + baggage); sentrySpan.getSpanContext().setOrigin(SentrySpanExporter.TRACE_ORIGIN); spanStorage.storeSentrySpan(spanContext, sentrySpan); } diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySampler.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySampler.java index 37df216ebb5..6412badc262 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySampler.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySampler.java @@ -94,6 +94,7 @@ public SamplingResult shouldSample( .getOptions() .getInternalTracesSampler() .sample(new SamplingContext(transactionContext, null)); + // TODO [POTEL] if sampling decision = false, we should record it in client report return new SentrySamplingResult(sentryDecision); } diff --git a/sentry-opentelemetry/sentry-opentelemetry-extra/api/sentry-opentelemetry-extra.api b/sentry-opentelemetry/sentry-opentelemetry-extra/api/sentry-opentelemetry-extra.api index 83ca7461f6b..498ec31c4e6 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-extra/api/sentry-opentelemetry-extra.api +++ b/sentry-opentelemetry/sentry-opentelemetry-extra/api/sentry-opentelemetry-extra.api @@ -11,7 +11,7 @@ public final class io/sentry/opentelemetry/OtelContextScopesStorage : io/sentry/ } public final class io/sentry/opentelemetry/OtelSpanContext : io/sentry/SpanContext { - public fun (Lio/opentelemetry/sdk/trace/ReadWriteSpan;Lio/sentry/TracesSamplingDecision;Lio/sentry/opentelemetry/OtelSpanWrapper;Lio/sentry/Baggage;)V + public fun (Lio/opentelemetry/sdk/trace/ReadWriteSpan;Lio/sentry/TracesSamplingDecision;Lio/sentry/opentelemetry/OtelSpanWrapper;Lio/sentry/SpanId;Lio/sentry/Baggage;)V public fun getOperation ()Ljava/lang/String; public fun getStatus ()Lio/sentry/SpanStatus; public fun setOperation (Ljava/lang/String;)V @@ -27,7 +27,7 @@ public final class io/sentry/opentelemetry/OtelSpanFactory : io/sentry/ISpanFact } public final class io/sentry/opentelemetry/OtelSpanWrapper : io/sentry/ISpan { - public fun (Lio/opentelemetry/sdk/trace/ReadWriteSpan;Lio/sentry/IScopes;Lio/sentry/SentryDate;Lio/sentry/TracesSamplingDecision;Lio/sentry/opentelemetry/OtelSpanWrapper;Lio/sentry/Baggage;)V + public fun (Lio/opentelemetry/sdk/trace/ReadWriteSpan;Lio/sentry/IScopes;Lio/sentry/SentryDate;Lio/sentry/TracesSamplingDecision;Lio/sentry/opentelemetry/OtelSpanWrapper;Lio/sentry/SpanId;Lio/sentry/Baggage;)V public fun finish ()V public fun finish (Lio/sentry/SpanStatus;)V public fun finish (Lio/sentry/SpanStatus;Lio/sentry/SentryDate;)V diff --git a/sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanContext.java b/sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanContext.java index 7b279802c94..626b837c97f 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanContext.java +++ b/sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanContext.java @@ -30,11 +30,12 @@ public OtelSpanContext( final @NotNull ReadWriteSpan span, final @Nullable TracesSamplingDecision samplingDecision, final @Nullable OtelSpanWrapper parentSpan, + final @Nullable SpanId parentSpanId, final @Nullable Baggage baggage) { super( new SentryId(span.getSpanContext().getTraceId()), new SpanId(span.getSpanContext().getSpanId()), - parentSpan == null ? null : parentSpan.getSpanContext().getSpanId(), + parentSpan == null ? parentSpanId : parentSpan.getSpanContext().getSpanId(), span.getName(), null, samplingDecision != null diff --git a/sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java b/sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java index 9ab01d60bdb..a21c8310732 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java +++ b/sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java @@ -88,6 +88,7 @@ public OtelSpanWrapper( final @NotNull SentryDate startTimestamp, final @Nullable TracesSamplingDecision samplingDecision, final @Nullable OtelSpanWrapper parentSpan, + final @Nullable SpanId parentSpanId, final @Nullable Baggage baggage) { this.scopes = Objects.requireNonNull(scopes, "scopes are required"); this.span = new WeakReference<>(span); @@ -101,7 +102,8 @@ public OtelSpanWrapper( this.baggage = null; } - this.context = new OtelSpanContext(span, samplingDecision, parentSpan, this.baggage); + this.context = + new OtelSpanContext(span, samplingDecision, parentSpan, parentSpanId, this.baggage); } @Override From f66ae736476ff0594fd6edb8a22183e921660c7c Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Fri, 5 Jul 2024 15:15:23 +0200 Subject: [PATCH 2/2] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1b545c4784..26ffec8911c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ ### Fixes - Removed user segment ([#3512](https://github.com/getsentry/sentry-java/pull/3512)) +- Use span id of remote parent ([#3548](https://github.com/getsentry/sentry-java/pull/3548)) + - Traces were broken because on an incoming request, OtelSentrySpanProcessor did not set the parentSpanId on the span correctly. Traces were not referencing the actual parent span but some other (random) span ID which the server doesn't know. ## 8.0.0-alpha.3