diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java index bbb7b51bc9c5f9b7cdc5f8dd9afb375008f61264..19538ee4d3c7569e20405c98247c1b30f0eef2ba 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java @@ -79,6 +79,12 @@ public class TracingContext implements AbstractTracerContext { * LinkedList#getLast()} instead of {@link #pop()}, {@link #push(AbstractSpan)}, {@link #peek()} */ private LinkedList activeSpanStack = new LinkedList<>(); + /** + * @since 7.0.0 SkyWalking support lazy injection through {@link ExitTypeSpan#inject(ContextCarrier)}. Due to that, + * the {@link #activeSpanStack} could be blank by then, this is a pointer forever to the first span, even the main + * thread tracing has been finished. + */ + private AbstractSpan firstSpan = null; /** * A counter for the next span. @@ -636,6 +642,9 @@ public class TracingContext implements AbstractTracerContext { * @param span the {@code span} to push */ private AbstractSpan push(AbstractSpan span) { + if (firstSpan == null) { + firstSpan = span; + } activeSpanStack.addLast(span); return span; } @@ -651,7 +660,7 @@ public class TracingContext implements AbstractTracerContext { } private AbstractSpan first() { - return activeSpanStack.getFirst(); + return firstSpan; } private boolean isLimitMechanismWorking() {