Skip to content

Commit f498992

Browse files
authored
Merge 3e608f3 into 35fc4ab
2 parents 35fc4ab + 3e608f3 commit f498992

File tree

3 files changed

+26
-16
lines changed

3 files changed

+26
-16
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@
2121
- `SentryAttribute.stringAttribute()` takes a `String` value
2222
- We opted for handling parameters via `SentryLogParameters` to avoid creating tons of overloads that are ambiguous.
2323

24+
### Fixes
25+
26+
- Isolation scope is now forked in `OtelSentrySpanProcessor` instead of `OtelSentryPropagator` ([#4434](https://github.com/getsentry/sentry-java/pull/4434))
27+
- Since propagator may never be invoked we moved the location where isolation scope is forked.
28+
- Not invoking `OtelSentryPropagator.extract` or having a `sentry-trace` header that failed to parse would cause isolation scope not to be forked.
29+
- This in turn caused data to bleed between scopes, e.g. from one request into another
30+
2431
## 8.12.0
2532

2633
### Features

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

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package io.sentry.opentelemetry;
22

3-
import static io.sentry.opentelemetry.SentryOtelKeys.SENTRY_SCOPES_KEY;
4-
53
import io.opentelemetry.api.common.Attributes;
64
import io.opentelemetry.api.trace.Span;
75
import io.opentelemetry.api.trace.SpanContext;
@@ -15,7 +13,6 @@
1513
import io.sentry.BaggageHeader;
1614
import io.sentry.IScopes;
1715
import io.sentry.ScopesAdapter;
18-
import io.sentry.Sentry;
1916
import io.sentry.SentryLevel;
2017
import io.sentry.SentryOptions;
2118
import io.sentry.SentryTraceHeader;
@@ -105,16 +102,10 @@ public <C> void inject(final Context context, final C carrier, final TextMapSett
105102
@Override
106103
public <C> Context extract(
107104
final Context context, final C carrier, final TextMapGetter<C> getter) {
108-
final @Nullable IScopes scopesFromParentContext = context.get(SENTRY_SCOPES_KEY);
109-
final @NotNull IScopes scopesToUse =
110-
scopesFromParentContext != null
111-
? scopesFromParentContext.forkedScopes("propagator")
112-
: Sentry.forkedRootScopes("propagator");
113-
114105
final @Nullable String sentryTraceString =
115106
getter.get(carrier, SentryTraceHeader.SENTRY_TRACE_HEADER);
116107
if (sentryTraceString == null) {
117-
return context.with(SENTRY_SCOPES_KEY, scopesToUse);
108+
return context;
118109
}
119110

120111
try {
@@ -136,7 +127,6 @@ public <C> Context extract(
136127
final @NotNull Context modifiedContext =
137128
context
138129
.with(wrappedSpan)
139-
.with(SENTRY_SCOPES_KEY, scopesToUse)
140130
.with(SentryOtelKeys.SENTRY_TRACE_KEY, sentryTraceHeader)
141131
.with(SentryOtelKeys.SENTRY_BAGGAGE_KEY, baggage);
142132

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.opentelemetry.sdk.trace.SpanProcessor;
1111
import io.opentelemetry.sdk.trace.data.EventData;
1212
import io.opentelemetry.sdk.trace.data.ExceptionEventData;
13+
import io.opentelemetry.sdk.trace.data.SpanData;
1314
import io.sentry.Baggage;
1415
import io.sentry.DateUtils;
1516
import io.sentry.IScopes;
@@ -48,11 +49,7 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri
4849
return;
4950
}
5051

51-
final @Nullable IScopes scopesFromContext = parentContext.get(SENTRY_SCOPES_KEY);
52-
final @NotNull IScopes scopes =
53-
scopesFromContext != null
54-
? scopesFromContext.forkedCurrentScope("spanprocessor")
55-
: Sentry.forkedRootScopes("spanprocessor");
52+
final @NotNull IScopes scopes = forkScopes(parentContext, otelSpan.toSpanData());
5653

5754
final @Nullable IOtelSpanWrapper sentryParentSpan =
5855
spanStorage.getSentrySpan(otelSpan.getParentSpanContext());
@@ -111,6 +108,22 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri
111108
spanStorage.storeSentrySpan(spanContext, sentrySpan);
112109
}
113110

111+
private IScopes forkScopes(final @NotNull Context context, final @NotNull SpanData span) {
112+
final @Nullable IScopes scopesFromContext = context.get(SENTRY_SCOPES_KEY);
113+
if (scopesFromContext == null) {
114+
return Sentry.forkedRootScopes("spanprocessor.new");
115+
}
116+
if (isRootSpan(span)) {
117+
return scopesFromContext.forkedScopes("spanprocessor.rootspan");
118+
}
119+
120+
return scopesFromContext.forkedCurrentScope("spanprocessor.nonrootspan");
121+
}
122+
123+
private boolean isRootSpan(SpanData otelSpan) {
124+
return !otelSpan.getParentSpanContext().isValid() || otelSpan.getParentSpanContext().isRemote();
125+
}
126+
114127
private @Nullable Boolean isSampled(
115128
final @NotNull ReadWriteSpan otelSpan,
116129
final @Nullable TracesSamplingDecision samplingDecision) {

0 commit comments

Comments
 (0)