Skip to content

Commit 30fd3cf

Browse files
authored
POTEL 31 - Use span id of remote parent (#3548)
* Use parent span id from sentry-trace header * changelog
1 parent db61a7b commit 30fd3cf

File tree

6 files changed

+19
-6
lines changed

6 files changed

+19
-6
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
### Fixes
66

77
- Removed user segment ([#3512](https://github.com/getsentry/sentry-java/pull/3512))
8+
- Use span id of remote parent ([#3548](https://github.com/getsentry/sentry-java/pull/3548))
9+
- 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.
810

911
## 8.0.0-alpha.3
1012

sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSentrySpanProcessor.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,14 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri
5353
TracesSamplingDecision samplingDecision =
5454
OtelSamplingUtil.extractSamplingDecisionOrDefault(otelSpan.toSpanData().getAttributes());
5555
@Nullable Baggage baggage = null;
56+
@Nullable SpanId sentryParentSpanId = null;
5657
otelSpan.setAttribute(IS_REMOTE_PARENT, otelSpan.getParentSpanContext().isRemote());
5758
if (sentryParentSpan == null) {
5859
final @NotNull String traceId = otelSpan.getSpanContext().getTraceId();
5960
final @NotNull String spanId = otelSpan.getSpanContext().getSpanId();
6061
final @NotNull SpanId sentrySpanId = new SpanId(spanId);
6162
final @NotNull String parentSpanId = otelSpan.getParentSpanContext().getSpanId();
62-
final @Nullable SpanId sentryParentSpanId =
63+
sentryParentSpanId =
6364
io.opentelemetry.api.trace.SpanId.isValid(parentSpanId) ? new SpanId(parentSpanId) : null;
6465

6566
@Nullable
@@ -99,7 +100,13 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri
99100
new SentryLongDate(otelSpan.toSpanData().getStartEpochNanos());
100101
final @NotNull OtelSpanWrapper sentrySpan =
101102
new OtelSpanWrapper(
102-
otelSpan, scopes, startTimestamp, samplingDecision, sentryParentSpan, baggage);
103+
otelSpan,
104+
scopes,
105+
startTimestamp,
106+
samplingDecision,
107+
sentryParentSpan,
108+
sentryParentSpanId,
109+
baggage);
103110
sentrySpan.getSpanContext().setOrigin(SentrySpanExporter.TRACE_ORIGIN);
104111
spanStorage.storeSentrySpan(spanContext, sentrySpan);
105112
}

sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySampler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public SamplingResult shouldSample(
9494
.getOptions()
9595
.getInternalTracesSampler()
9696
.sample(new SamplingContext(transactionContext, null));
97+
// TODO [POTEL] if sampling decision = false, we should record it in client report
9798
return new SentrySamplingResult(sentryDecision);
9899
}
99100

sentry-opentelemetry/sentry-opentelemetry-extra/api/sentry-opentelemetry-extra.api

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public final class io/sentry/opentelemetry/OtelContextScopesStorage : io/sentry/
1111
}
1212

1313
public final class io/sentry/opentelemetry/OtelSpanContext : io/sentry/SpanContext {
14-
public fun <init> (Lio/opentelemetry/sdk/trace/ReadWriteSpan;Lio/sentry/TracesSamplingDecision;Lio/sentry/opentelemetry/OtelSpanWrapper;Lio/sentry/Baggage;)V
14+
public fun <init> (Lio/opentelemetry/sdk/trace/ReadWriteSpan;Lio/sentry/TracesSamplingDecision;Lio/sentry/opentelemetry/OtelSpanWrapper;Lio/sentry/SpanId;Lio/sentry/Baggage;)V
1515
public fun getOperation ()Ljava/lang/String;
1616
public fun getStatus ()Lio/sentry/SpanStatus;
1717
public fun setOperation (Ljava/lang/String;)V
@@ -27,7 +27,7 @@ public final class io/sentry/opentelemetry/OtelSpanFactory : io/sentry/ISpanFact
2727
}
2828

2929
public final class io/sentry/opentelemetry/OtelSpanWrapper : io/sentry/ISpan {
30-
public fun <init> (Lio/opentelemetry/sdk/trace/ReadWriteSpan;Lio/sentry/IScopes;Lio/sentry/SentryDate;Lio/sentry/TracesSamplingDecision;Lio/sentry/opentelemetry/OtelSpanWrapper;Lio/sentry/Baggage;)V
30+
public fun <init> (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
3131
public fun finish ()V
3232
public fun finish (Lio/sentry/SpanStatus;)V
3333
public fun finish (Lio/sentry/SpanStatus;Lio/sentry/SentryDate;)V

sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanContext.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@ public OtelSpanContext(
3030
final @NotNull ReadWriteSpan span,
3131
final @Nullable TracesSamplingDecision samplingDecision,
3232
final @Nullable OtelSpanWrapper parentSpan,
33+
final @Nullable SpanId parentSpanId,
3334
final @Nullable Baggage baggage) {
3435
super(
3536
new SentryId(span.getSpanContext().getTraceId()),
3637
new SpanId(span.getSpanContext().getSpanId()),
37-
parentSpan == null ? null : parentSpan.getSpanContext().getSpanId(),
38+
parentSpan == null ? parentSpanId : parentSpan.getSpanContext().getSpanId(),
3839
span.getName(),
3940
null,
4041
samplingDecision != null

sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public OtelSpanWrapper(
8888
final @NotNull SentryDate startTimestamp,
8989
final @Nullable TracesSamplingDecision samplingDecision,
9090
final @Nullable OtelSpanWrapper parentSpan,
91+
final @Nullable SpanId parentSpanId,
9192
final @Nullable Baggage baggage) {
9293
this.scopes = Objects.requireNonNull(scopes, "scopes are required");
9394
this.span = new WeakReference<>(span);
@@ -101,7 +102,8 @@ public OtelSpanWrapper(
101102
this.baggage = null;
102103
}
103104

104-
this.context = new OtelSpanContext(span, samplingDecision, parentSpan, this.baggage);
105+
this.context =
106+
new OtelSpanContext(span, samplingDecision, parentSpan, parentSpanId, this.baggage);
105107
}
106108

107109
@Override

0 commit comments

Comments
 (0)