|
1 | 1 | package io.sentry.opentelemetry; |
2 | 2 |
|
| 3 | +import io.opentelemetry.api.common.Attributes; |
| 4 | +import io.opentelemetry.api.trace.Span; |
3 | 5 | import io.opentelemetry.api.trace.SpanContext; |
4 | 6 | import io.opentelemetry.context.internal.shaded.WeakConcurrentMap; |
5 | 7 | import io.sentry.ISentryLifecycleToken; |
@@ -46,12 +48,33 @@ private SentryWeakSpanStorage() {} |
46 | 48 |
|
47 | 49 | public void storeSentrySpan( |
48 | 50 | final @NotNull SpanContext otelSpan, final @NotNull IOtelSpanWrapper sentrySpan) { |
| 51 | + System.out.println("storing span: " + sentrySpan.getOperation()); |
49 | 52 | this.sentrySpans.put(otelSpan, sentrySpan); |
50 | | - if (sentrySpan.isRoot()) { |
| 53 | + if (shouldStoreSpanAsRootSpan(sentrySpan)) { |
| 54 | + System.out.println("storing span as last known root: " + sentrySpan.getOperation()); |
51 | 55 | lastKnownRootSpan = new WeakReference<>(sentrySpan); |
52 | 56 | } |
53 | 57 | } |
54 | 58 |
|
| 59 | + private boolean shouldStoreSpanAsRootSpan(final @NotNull IOtelSpanWrapper sentrySpan) { |
| 60 | + if (!sentrySpan.isRoot()) { |
| 61 | + return false; |
| 62 | + } |
| 63 | + |
| 64 | + final @Nullable IOtelSpanWrapper previousRootSpan = getLastKnownUnfinishedRootSpan(); |
| 65 | + if (previousRootSpan == null) { |
| 66 | + return true; |
| 67 | + } |
| 68 | + |
| 69 | + final @Nullable Attributes attributes = previousRootSpan.getOpenTelemetrySpanAttributes(); |
| 70 | + if (attributes == null) { |
| 71 | + return true; |
| 72 | + } |
| 73 | + |
| 74 | + final @Nullable Boolean isCreatedViaSentryApi = attributes.get(InternalSemanticAttributes.CREATED_VIA_SENTRY_API); |
| 75 | + return isCreatedViaSentryApi == true; |
| 76 | + } |
| 77 | + |
55 | 78 | public @Nullable IOtelSpanWrapper getLastKnownUnfinishedRootSpan() { |
56 | 79 | final @Nullable IOtelSpanWrapper span = lastKnownRootSpan.get(); |
57 | 80 | if (span != null && !span.isFinished()) { |
|
0 commit comments