diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java
index cbfb00460..02da5c3ec 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java
@@ -5,6 +5,9 @@ import java.util.List;
import org.skywalking.apm.agent.core.dictionary.DictionaryUtil;
/**
+ * The RemoteDownstreamConfig includes configurations from collector side.
+ * All of them initialized null, Null-Value or empty collection.
+ *
* @author wusheng
*/
public class RemoteDownstreamConfig {
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/AbstractTracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/AbstractTracerContext.java
index 4520d161e..8ac49fbb8 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/AbstractTracerContext.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/AbstractTracerContext.java
@@ -1,6 +1,9 @@
package org.skywalking.apm.agent.core.context;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.skywalking.apm.agent.core.context.trace.EntrySpan;
+import org.skywalking.apm.agent.core.context.trace.ExitSpan;
+import org.skywalking.apm.agent.core.context.trace.LocalSpan;
/**
* The AbstractTracerContext represents the tracer context manager.
@@ -8,23 +11,89 @@ import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
* @author wusheng
*/
public interface AbstractTracerContext {
+ /**
+ * Prepare for the cross-process propagation.
+ * How to initialize the carrier, depends on the implementation.
+ *
+ * @param carrier to carry the context for crossing process.
+ * @see {@link TracingContext} and {@link IgnoredTracerContext}
+ */
void inject(ContextCarrier carrier);
+ /**
+ * Build the reference between this segment and a cross-process segment.
+ * How to build, depends on the implementation.
+ *
+ * @param carrier carried the context from a cross-process segment.
+ * @see {@link TracingContext} and {@link IgnoredTracerContext}
+ */
void extract(ContextCarrier carrier);
+ /**
+ * Capture a snapshot for cross-thread propagation.
+ * It's a similar concept with ActiveSpan.Continuation in OpenTracing-java
+ * How to build, depends on the implementation.
+ *
+ * @return the {@link ContextSnapshot} , which includes the reference context.
+ * @see {@link TracingContext} and {@link IgnoredTracerContext}
+ */
ContextSnapshot capture();
+ /**
+ * Build the reference between this segment and a cross-thread segment.
+ * How to build, depends on the implementation.
+ *
+ * @param snapshot from {@link #capture()} in the parent thread.
+ * @see {@link TracingContext} and {@link IgnoredTracerContext}
+ */
void continued(ContextSnapshot snapshot);
+ /**
+ * Get the global trace id, if exist.
+ * How to build, depends on the implementation.
+ *
+ * @return the string represents the id.
+ * @see {@link TracingContext} and {@link IgnoredTracerContext}
+ */
String getGlobalTraceId();
+ /**
+ * Create an entry span
+ *
+ * @param operationName most likely a service name
+ * @return the span represents an entry point of this segment.
+ * @see {@link EntrySpan} if the implementation is {@link TracingContext}
+ */
AbstractSpan createEntrySpan(String operationName);
+ /**
+ * Create a local span
+ *
+ * @param operationName most likely a local method signature, or business name.
+ * @return the span represents a local logic block.
+ * @see {@link LocalSpan} if the implementation is {@link TracingContext}
+ */
AbstractSpan createLocalSpan(String operationName);
+ /**
+ * Create an exit span
+ *
+ * @param operationName most likely a service name of remote
+ * @param remotePeer the network id(ip:port, hostname:port or ip1:port1,ip2,port, etc.)
+ * @return the span represent an exit point of this segment.
+ * @see {@link ExitSpan} if the implementation is {@link TracingContext}
+ */
AbstractSpan createExitSpan(String operationName, String remotePeer);
+ /**
+ * @return the active span of current tracing context(stack)
+ */
AbstractSpan activeSpan();
+ /**
+ * Finish the given span, and the given span should be the active span of current tracing context(stack)
+ *
+ * @param span to finish
+ */
void stopSpan(AbstractSpan span);
}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextManager.java
index a26a777f6..082609b8e 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextManager.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextManager.java
@@ -108,25 +108,11 @@ public class ContextManager implements TracingContextListener, BootService, Igno
}
public static void inject(ContextCarrier contextCarrier) {
- AbstractSpan span = activeSpan();
- if (span instanceof AbstractTracingSpan) {
- if (span.isExit()) {
- get().inject(contextCarrier);
- } else {
- throw new IllegalStateException("Can't do inject when the active span isn't an exit span");
- }
- }
+ get().inject(contextCarrier);
}
public static void extract(ContextCarrier contextCarrier) {
- AbstractSpan span = activeSpan();
- if (span instanceof AbstractTracingSpan) {
- if (span.isEntry()) {
- get().extract(contextCarrier);
- } else {
- throw new IllegalStateException("Can't do extract when the active span isn't an entry span");
- }
- }
+ get().extract(contextCarrier);
}
public ContextSnapshot capture() {
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java
index 2b2ee2446..763b72dbf 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java
@@ -16,11 +16,29 @@ import org.skywalking.apm.agent.core.dictionary.PossibleFound;
import org.skywalking.apm.agent.core.sampling.SamplingService;
/**
+ * The TracingContext represents a core tracing logic controller.
+ * It build the final {@link TracingContext}, by the stack mechanism,
+ * which is similar with the codes work.
+ *
+ * In opentracing concept, it means, all spans in a segment tracing context(thread)
+ * are CHILD_OF relationship, but no FOLLOW_OF.
+ *
+ * In skywalking core concept, FOLLOW_OF is an abstract concept
+ * when cross-process MQ or cross-thread async/batch tasks happen,
+ * we used {@link TraceSegmentRef} for these scenarios.
+ * Check {@link TraceSegmentRef} which is from {@link ContextCarrier} or {@link ContextSnapshot}.
+ *
* @author wusheng
*/
public class TracingContext implements AbstractTracerContext {
+ /**
+ * @see {@link SamplingService}
+ */
private SamplingService samplingService;
+ /**
+ * The final {@link TraceSegment}, which includes all finished spans.
+ */
private TraceSegment segment;
/**
@@ -32,8 +50,14 @@ public class TracingContext implements AbstractTracerContext {
*/
private LinkedList activeSpanStack = new LinkedList();
+ /**
+ * A counter for the next span.
+ */
private int spanIdGenerator;
+ /**
+ * Initialize all fields with default value.
+ */
TracingContext() {
this.segment = new TraceSegment();
this.spanIdGenerator = 0;
@@ -42,6 +66,13 @@ public class TracingContext implements AbstractTracerContext {
}
}
+ /**
+ * Inject the context into the given carrier, only when the active span is an exit one.
+ *
+ * @param carrier to carry the context for crossing process.
+ * @see {@link AbstractTracerContext#inject(ContextCarrier)}
+ * @throws IllegalStateException, if the active span isn't an exit one.
+ */
@Override
public void inject(ContextCarrier carrier) {
AbstractTracingSpan span = this.activeSpan();