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 9f9f6c1aab0415c18c2a4d11a52c4982e2452c11..63e257f42ae715432ed221cc1abaeaabcb4ac8e4 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 @@ -16,7 +16,6 @@ * */ - package org.apache.skywalking.apm.agent.core.context; import java.util.LinkedList; @@ -50,6 +49,7 @@ import org.apache.skywalking.apm.agent.core.sampling.SamplingService; * ContextCarrier} or {@link ContextSnapshot}. * * @author wusheng + * @author zhang xin */ public class TracingContext implements AbstractTracerContext { /** @@ -159,7 +159,7 @@ public class TracingContext implements AbstractTracerContext { this.segment.relatedGlobalTraces(carrier.getDistributedTraceId()); AbstractSpan span = this.activeSpan(); if (span instanceof EntrySpan) { - ((EntrySpan)span).ref(ref); + span.ref(ref); } } @@ -213,7 +213,9 @@ public class TracingContext implements AbstractTracerContext { */ @Override public void continued(ContextSnapshot snapshot) { - this.segment.ref(new TraceSegmentRef(snapshot)); + TraceSegmentRef segmentRef = new TraceSegmentRef(snapshot); + this.segment.ref(segmentRef); + this.activeSpan().ref(segmentRef); this.segment.relatedGlobalTraces(snapshot.getDistributedTraceId()); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractSpan.java index 7e0b757125dfbd273ee4bec6300d70834bddce22..ada06d3d0be03200d433225dc6919bf526fd3c9b 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractSpan.java @@ -16,7 +16,6 @@ * */ - package org.apache.skywalking.apm.agent.core.context.trace; import java.util.Map; @@ -110,4 +109,11 @@ public interface AbstractSpan { String getOperationName(); AbstractSpan setOperationId(int operationId); + + /** + * Reference other trace segment. + * + * @param ref segment ref + */ + void ref(TraceSegmentRef ref); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java index 6277aea116a9bfb9f110513606b1e503683184b4..7e39cff4e729cd5450afc987a6a82b5765ea3da0 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java @@ -64,6 +64,13 @@ public abstract class AbstractTracingSpan implements AbstractSpan { */ protected List logs; + /** + * The refs of parent trace segments, except the primary one. For most RPC call, {@link #refs} contains only one + * element, but if this segment is a start span of batch process, the segment faces multi parents, at this moment, + * we use this {@link #refs} to link them. + */ + protected List refs; + protected AbstractTracingSpan(int spanId, int parentSpanId, String operationName) { this.operationName = operationName; this.operationId = DictionaryUtil.nullValue(); @@ -276,4 +283,13 @@ public abstract class AbstractTracingSpan implements AbstractSpan { return spanBuilder; } + + @Override public void ref(TraceSegmentRef ref) { + if (refs == null) { + refs = new LinkedList(); + } + if (!refs.contains(ref)) { + refs.add(ref); + } + } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/EntrySpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/EntrySpan.java index 1e47cba55f7fbfdcea4e077a6dda586007effbf0..cae1c6e3e13c86c7d6842037b8eedb53f022dc2c 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/EntrySpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/EntrySpan.java @@ -38,12 +38,6 @@ import org.apache.skywalking.apm.network.trace.component.Component; * @author wusheng */ public class EntrySpan extends StackBasedTracingSpan { - /** - * The refs of parent trace segments, except the primary one. For most RPC call, {@link #refs} contains only one - * element, but if this segment is a start span of batch process, the segment faces multi parents, at this moment, - * we use this {@link #refs} to link them. - */ - private List refs; private int currentMaxDepth; @@ -146,15 +140,6 @@ public class EntrySpan extends StackBasedTracingSpan { return builder; } - public void ref(TraceSegmentRef ref) { - if (refs == null) { - refs = new LinkedList(); - } - if (!refs.contains(ref)) { - refs.add(ref); - } - } - private void clearWhenRestart() { this.componentId = DictionaryUtil.nullValue(); this.componentName = null; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopSpan.java index 4a6d0b0922053b59e85ee2e6e6fcf27dee118719..4be30d1b7967dd25adb7bcbcbdab30bbb600a5fb 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopSpan.java @@ -99,4 +99,7 @@ public class NoopSpan implements AbstractSpan { @Override public AbstractSpan setOperationId(int operationId) { return this; } + + @Override public void ref(TraceSegmentRef ref) { + } }