Skip to content

Commit 46d0f03

Browse files
authored
POTEL 32 - Attach active span to scope when using OpenTelemetry (#3549)
* Use parent span id from sentry-trace header * attach active span to scope * changelog
1 parent 30fd3cf commit 46d0f03

File tree

14 files changed

+82
-12
lines changed

14 files changed

+82
-12
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
- Removed user segment ([#3512](https://github.com/getsentry/sentry-java/pull/3512))
88
- Use span id of remote parent ([#3548](https://github.com/getsentry/sentry-java/pull/3548))
99
- 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.
10+
- Attach active span to scope when using OpenTelemetry ([#3549](https://github.com/getsentry/sentry-java/pull/3549))
11+
- Errors weren't linked to traces correctly due to parts of the SDK not knowing the current span
1012

1113
## 8.0.0-alpha.3
1214

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

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,39 +41,44 @@ private <V> boolean isOpentelemetrySpan(final @NotNull ContextKey<V> contextKey)
4141
}
4242

4343
private static @NotNull Context forkCurrentScope(final @NotNull Context context) {
44+
final @Nullable OtelSpanWrapper sentrySpan = getCurrentSpanFromGlobalStorage(context);
45+
final @Nullable IScopes spanScopes = sentrySpan == null ? null : sentrySpan.getScopes();
46+
final @NotNull IScopes forkedScopes = forkCurrentScopeInternal(context, spanScopes);
47+
if (sentrySpan != null) {
48+
forkedScopes.setActiveSpan(sentrySpan);
49+
}
50+
return context.with(SENTRY_SCOPES_KEY, forkedScopes);
51+
}
52+
53+
private static @NotNull IScopes forkCurrentScopeInternal(
54+
final @NotNull Context context, final @Nullable IScopes spanScopes) {
4455
final @Nullable IScopes scopesInContext = context.get(SENTRY_SCOPES_KEY);
45-
final @Nullable IScopes spanScopes = getCurrentSpanScopesFromGlobalStorage(context);
4656

4757
if (scopesInContext != null && spanScopes != null) {
4858
if (scopesInContext.isAncestorOf(spanScopes)) {
49-
return context.with(
50-
SENTRY_SCOPES_KEY, spanScopes.forkedCurrentScope("contextwrapper.spanancestor"));
59+
return spanScopes.forkedCurrentScope("contextwrapper.spanancestor");
5160
}
5261
}
5362

5463
if (scopesInContext != null) {
55-
return context.with(
56-
SENTRY_SCOPES_KEY, scopesInContext.forkedCurrentScope("contextwrapper.scopeincontext"));
64+
return scopesInContext.forkedCurrentScope("contextwrapper.scopeincontext");
5765
}
5866

5967
if (spanScopes != null) {
60-
return context.with(
61-
SENTRY_SCOPES_KEY, spanScopes.forkedCurrentScope("contextwrapper.spanscope"));
68+
return spanScopes.forkedCurrentScope("contextwrapper.spanscope");
6269
}
6370

64-
return context.with(SENTRY_SCOPES_KEY, Sentry.forkedRootScopes("contextwrapper.fallback"));
71+
return Sentry.forkedRootScopes("contextwrapper.fallback");
6572
}
6673

67-
private static @Nullable IScopes getCurrentSpanScopesFromGlobalStorage(
74+
private static @Nullable OtelSpanWrapper getCurrentSpanFromGlobalStorage(
6875
final @NotNull Context context) {
6976
@Nullable final Span span = Span.fromContextOrNull(context);
7077

7178
if (span != null) {
7279
final @Nullable OtelSpanWrapper sentrySpan =
7380
SentryWeakSpanStorage.getInstance().getSentrySpan(span.getSpanContext());
74-
if (sentrySpan != null) {
75-
return sentrySpan.getScopes();
76-
}
81+
return sentrySpan;
7782
}
7883

7984
return null;

sentry/api/sentry.api

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ public final class io/sentry/CombinedScopeView : io/sentry/IScope {
276276
public fun removeExtra (Ljava/lang/String;)V
277277
public fun removeTag (Ljava/lang/String;)V
278278
public fun replaceOptions (Lio/sentry/SentryOptions;)V
279+
public fun setActiveSpan (Lio/sentry/ISpan;)V
279280
public fun setContexts (Ljava/lang/String;Ljava/lang/Boolean;)V
280281
public fun setContexts (Ljava/lang/String;Ljava/lang/Character;)V
281282
public fun setContexts (Ljava/lang/String;Ljava/lang/Number;)V
@@ -577,6 +578,7 @@ public final class io/sentry/HubAdapter : io/sentry/IHub {
577578
public fun removeExtra (Ljava/lang/String;)V
578579
public fun removeTag (Ljava/lang/String;)V
579580
public fun reportFullyDisplayed ()V
581+
public fun setActiveSpan (Lio/sentry/ISpan;)V
580582
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
581583
public fun setFingerprint (Ljava/util/List;)V
582584
public fun setLevel (Lio/sentry/SentryLevel;)V
@@ -641,6 +643,7 @@ public final class io/sentry/HubScopesWrapper : io/sentry/IHub {
641643
public fun removeExtra (Ljava/lang/String;)V
642644
public fun removeTag (Ljava/lang/String;)V
643645
public fun reportFullyDisplayed ()V
646+
public fun setActiveSpan (Lio/sentry/ISpan;)V
644647
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
645648
public fun setFingerprint (Ljava/util/List;)V
646649
public fun setLevel (Lio/sentry/SentryLevel;)V
@@ -767,6 +770,7 @@ public abstract interface class io/sentry/IScope {
767770
public abstract fun removeExtra (Ljava/lang/String;)V
768771
public abstract fun removeTag (Ljava/lang/String;)V
769772
public abstract fun replaceOptions (Lio/sentry/SentryOptions;)V
773+
public abstract fun setActiveSpan (Lio/sentry/ISpan;)V
770774
public abstract fun setContexts (Ljava/lang/String;Ljava/lang/Boolean;)V
771775
public abstract fun setContexts (Ljava/lang/String;Ljava/lang/Character;)V
772776
public abstract fun setContexts (Ljava/lang/String;Ljava/lang/Number;)V
@@ -873,6 +877,7 @@ public abstract interface class io/sentry/IScopes {
873877
public abstract fun removeTag (Ljava/lang/String;)V
874878
public fun reportFullDisplayed ()V
875879
public abstract fun reportFullyDisplayed ()V
880+
public abstract fun setActiveSpan (Lio/sentry/ISpan;)V
876881
public abstract fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
877882
public abstract fun setFingerprint (Ljava/util/List;)V
878883
public abstract fun setLevel (Lio/sentry/SentryLevel;)V
@@ -1382,6 +1387,7 @@ public final class io/sentry/NoOpHub : io/sentry/IHub {
13821387
public fun removeExtra (Ljava/lang/String;)V
13831388
public fun removeTag (Ljava/lang/String;)V
13841389
public fun reportFullyDisplayed ()V
1390+
public fun setActiveSpan (Lio/sentry/ISpan;)V
13851391
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
13861392
public fun setFingerprint (Ljava/util/List;)V
13871393
public fun setLevel (Lio/sentry/SentryLevel;)V
@@ -1444,6 +1450,7 @@ public final class io/sentry/NoOpScope : io/sentry/IScope {
14441450
public fun removeExtra (Ljava/lang/String;)V
14451451
public fun removeTag (Ljava/lang/String;)V
14461452
public fun replaceOptions (Lio/sentry/SentryOptions;)V
1453+
public fun setActiveSpan (Lio/sentry/ISpan;)V
14471454
public fun setContexts (Ljava/lang/String;Ljava/lang/Boolean;)V
14481455
public fun setContexts (Ljava/lang/String;Ljava/lang/Character;)V
14491456
public fun setContexts (Ljava/lang/String;Ljava/lang/Number;)V
@@ -1520,6 +1527,7 @@ public final class io/sentry/NoOpScopes : io/sentry/IScopes {
15201527
public fun removeExtra (Ljava/lang/String;)V
15211528
public fun removeTag (Ljava/lang/String;)V
15221529
public fun reportFullyDisplayed ()V
1530+
public fun setActiveSpan (Lio/sentry/ISpan;)V
15231531
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
15241532
public fun setFingerprint (Ljava/util/List;)V
15251533
public fun setLevel (Lio/sentry/SentryLevel;)V
@@ -1916,6 +1924,7 @@ public final class io/sentry/Scope : io/sentry/IScope {
19161924
public fun removeExtra (Ljava/lang/String;)V
19171925
public fun removeTag (Ljava/lang/String;)V
19181926
public fun replaceOptions (Lio/sentry/SentryOptions;)V
1927+
public fun setActiveSpan (Lio/sentry/ISpan;)V
19191928
public fun setContexts (Ljava/lang/String;Ljava/lang/Boolean;)V
19201929
public fun setContexts (Ljava/lang/String;Ljava/lang/Character;)V
19211930
public fun setContexts (Ljava/lang/String;Ljava/lang/Number;)V
@@ -2035,6 +2044,7 @@ public final class io/sentry/Scopes : io/sentry/IScopes, io/sentry/metrics/Metri
20352044
public fun removeExtra (Ljava/lang/String;)V
20362045
public fun removeTag (Ljava/lang/String;)V
20372046
public fun reportFullyDisplayed ()V
2047+
public fun setActiveSpan (Lio/sentry/ISpan;)V
20382048
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
20392049
public fun setFingerprint (Ljava/util/List;)V
20402050
public fun setLevel (Lio/sentry/SentryLevel;)V
@@ -2100,6 +2110,7 @@ public final class io/sentry/ScopesAdapter : io/sentry/IScopes {
21002110
public fun removeExtra (Ljava/lang/String;)V
21012111
public fun removeTag (Ljava/lang/String;)V
21022112
public fun reportFullyDisplayed ()V
2113+
public fun setActiveSpan (Lio/sentry/ISpan;)V
21032114
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
21042115
public fun setFingerprint (Ljava/util/List;)V
21052116
public fun setLevel (Lio/sentry/SentryLevel;)V

sentry/src/main/java/io/sentry/CombinedScopeView.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ public void setTransaction(@NotNull String transaction) {
8484
return globalScope.getSpan();
8585
}
8686

87+
@Override
88+
public void setActiveSpan(final @Nullable ISpan span) {
89+
scope.setActiveSpan(span);
90+
}
91+
8792
@Override
8893
public void setTransaction(@Nullable ITransaction transaction) {
8994
getDefaultWriteScope().setTransaction(transaction);

sentry/src/main/java/io/sentry/HubAdapter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,11 @@ public void setSpanContext(
297297
return Sentry.getCurrentScopes().getSpan();
298298
}
299299

300+
@Override
301+
public void setActiveSpan(final @Nullable ISpan span) {
302+
Sentry.getCurrentScopes().setActiveSpan(span);
303+
}
304+
300305
@Override
301306
@ApiStatus.Internal
302307
public @Nullable ITransaction getTransaction() {

sentry/src/main/java/io/sentry/HubScopesWrapper.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,11 @@ public void setSpanContext(
290290
return scopes.getSpan();
291291
}
292292

293+
@Override
294+
public void setActiveSpan(final @Nullable ISpan span) {
295+
scopes.setActiveSpan(span);
296+
}
297+
293298
@ApiStatus.Internal
294299
@Override
295300
public @Nullable ITransaction getTransaction() {

sentry/src/main/java/io/sentry/IScope.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ public interface IScope {
4747
@Nullable
4848
ISpan getSpan();
4949

50+
@ApiStatus.Internal
51+
void setActiveSpan(@Nullable ISpan span);
52+
5053
/**
5154
* Sets the current active transaction
5255
*

sentry/src/main/java/io/sentry/IScopes.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,9 @@ void setSpanContext(
614614
@Nullable
615615
ISpan getSpan();
616616

617+
@ApiStatus.Internal
618+
void setActiveSpan(@Nullable ISpan span);
619+
617620
/**
618621
* Returns the transaction.
619622
*

sentry/src/main/java/io/sentry/NoOpHub.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,9 @@ public void setSpanContext(
260260
return null;
261261
}
262262

263+
@Override
264+
public void setActiveSpan(final @Nullable ISpan span) {}
265+
263266
@Override
264267
public @Nullable ITransaction getTransaction() {
265268
return null;

sentry/src/main/java/io/sentry/NoOpScope.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ public void setTransaction(@NotNull String transaction) {}
4949
return null;
5050
}
5151

52+
@Override
53+
public void setActiveSpan(final @Nullable ISpan span) {}
54+
5255
@Override
5356
public void setTransaction(@Nullable ITransaction transaction) {}
5457

0 commit comments

Comments
 (0)