diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AbstractTracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AbstractTracerContext.java index e9e1ed0d8..4b3cd2d68 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AbstractTracerContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AbstractTracerContext.java @@ -98,8 +98,9 @@ public interface AbstractTracerContext { * Finish the given span, and the given span should be the active span of current tracing context(stack) * * @param span to finish + * @return true when context should be clear. */ - void stopSpan(AbstractSpan span); + boolean stopSpan(AbstractSpan span); /** * Notify this context, current span is going to be finished async in another thread. diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AsyncSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AsyncSpan.java index 8b3e81dd7..8e2483e23 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AsyncSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AsyncSpan.java @@ -33,7 +33,7 @@ public interface AsyncSpan { * called. * * This method must be called - * + * * 1. In original thread(tracing context). * 2. Current span is active span. * diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java index 378602b9b..2dbdb3574 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java @@ -36,7 +36,7 @@ import org.apache.skywalking.apm.util.StringUtil; * * @author wusheng */ -public class ContextManager implements TracingContextListener, BootService, IgnoreTracerContextListener { +public class ContextManager implements BootService { private static final ILog logger = LogManager.getLogger(ContextManager.class); private static ThreadLocal CONTEXT = new ThreadLocal(); private static ThreadLocal RUNTIME_CONTEXT = new ThreadLocal(); @@ -166,7 +166,9 @@ public class ContextManager implements TracingContextListener, BootService, Igno } public static void stopSpan(AbstractSpan span) { - get().stopSpan(span); + if (get().stopSpan(span)) { + CONTEXT.remove(); + } } @Override @@ -176,8 +178,6 @@ public class ContextManager implements TracingContextListener, BootService, Igno @Override public void boot() { - ContextManagerExtendService service = ServiceManager.INSTANCE.findService(ContextManagerExtendService.class); - service.registerListeners(this); } @Override @@ -189,16 +189,6 @@ public class ContextManager implements TracingContextListener, BootService, Igno } - @Override - public void afterFinished(TraceSegment traceSegment) { - CONTEXT.remove(); - } - - @Override - public void afterFinished(IgnoredTracerContext traceSegment) { - CONTEXT.remove(); - } - public static boolean isActive() { return get() != null; } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManagerExtendService.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManagerExtendService.java index f97853af8..d25e915f0 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManagerExtendService.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManagerExtendService.java @@ -18,9 +18,7 @@ package org.apache.skywalking.apm.agent.core.context; -import org.apache.skywalking.apm.agent.core.boot.BootService; -import org.apache.skywalking.apm.agent.core.boot.DefaultImplementor; -import org.apache.skywalking.apm.agent.core.boot.ServiceManager; +import org.apache.skywalking.apm.agent.core.boot.*; import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.sampling.SamplingService; @@ -45,11 +43,6 @@ public class ContextManagerExtendService implements BootService { } - public void registerListeners(ContextManager manager) { - TracingContext.ListenerManager.add(manager); - IgnoredTracerContext.ListenerManager.add(manager); - } - public AbstractTracerContext createTraceContext(String operationName, boolean forceSampling) { AbstractTracerContext context; int suffixIdx = operationName.lastIndexOf("."); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java index cef591eec..59bc05cd4 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java @@ -16,17 +16,14 @@ * */ - package org.apache.skywalking.apm.agent.core.context; -import java.util.LinkedList; -import java.util.List; -import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.apache.skywalking.apm.agent.core.context.trace.NoopSpan; +import java.util.*; +import org.apache.skywalking.apm.agent.core.context.trace.*; /** - * The IgnoredTracerContext represent a context should be ignored. - * So it just maintains the stack with an integer depth field. + * The IgnoredTracerContext represent a context should be ignored. So it just maintains the stack with an + * integer depth field. * * All operations through this will be ignored, and keep the memory and gc cost as low as possible. * @@ -88,11 +85,12 @@ public class IgnoredTracerContext implements AbstractTracerContext { } @Override - public void stopSpan(AbstractSpan span) { + public boolean stopSpan(AbstractSpan span) { stackDepth--; if (stackDepth == 0) { ListenerManager.notifyFinish(this); } + return stackDepth == 0; } @Override public AbstractTracerContext awaitFinishAsync() { 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 66f90cc94..773907339 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 @@ -391,7 +391,7 @@ public class TracingContext implements AbstractTracerContext { * @param span to finish */ @Override - public void stopSpan(AbstractSpan span) { + public boolean stopSpan(AbstractSpan span) { AbstractSpan lastSpan = peek(); if (lastSpan == span) { if (lastSpan instanceof AbstractTracingSpan) { @@ -409,6 +409,8 @@ public class TracingContext implements AbstractTracerContext { if (checkFinishConditions()) { finish(); } + + return activeSpanStack.isEmpty(); } @Override public AbstractTracerContext awaitFinishAsync() {