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 be855e76e..25158b527 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
@@ -77,10 +77,11 @@ public class TracingContext implements AbstractTracerContext {
@Override
public AbstractSpan createEntrySpan(final String operationName) {
+ AbstractTracingSpan entrySpan;
AbstractTracingSpan parentSpan = peek();
final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId();
if (parentSpan == null) {
- AbstractTracingSpan span = (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection()
+ entrySpan = (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection()
.find(segment.getApplicationId(), operationName)
.doInCondition(new PossibleFound.FoundAndObtain() {
@Override public Object doProcess(int operationId) {
@@ -91,9 +92,10 @@ public class TracingContext implements AbstractTracerContext {
return new EntrySpan(spanIdGenerator++, parentSpanId, operationName);
}
});
- return push(span);
+ entrySpan.start();
+ return push(entrySpan);
} else if (parentSpan.isEntry()) {
- return parentSpan;
+ return parentSpan.start();
} else {
throw new IllegalStateException("The Entry Span can't be the child of Non-Entry Span");
}
@@ -116,17 +118,19 @@ public class TracingContext implements AbstractTracerContext {
return new LocalSpan(spanIdGenerator++, parentSpanId, operationName);
}
});
+ span.start();
return push(span);
}
@Override
public AbstractSpan createExitSpan(final String operationName, final String remotePeer) {
+ AbstractTracingSpan exitSpan;
AbstractTracingSpan parentSpan = peek();
if (parentSpan != null && parentSpan.isExit()) {
- return parentSpan;
+ exitSpan = parentSpan;
} else {
final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId();
- AbstractTracingSpan span = (AbstractTracingSpan)DictionaryManager.findApplicationCodeSection()
+ exitSpan = (AbstractTracingSpan)DictionaryManager.findApplicationCodeSection()
.find(remotePeer).doInCondition(
new PossibleFound.FoundAndObtain() {
@Override
@@ -153,8 +157,10 @@ public class TracingContext implements AbstractTracerContext {
return new ExitSpan(spanIdGenerator++, parentSpanId, operationName, remotePeer);
}
});
- return push(span);
+ exitSpan.start();
+ push(exitSpan);
}
+ return exitSpan;
}
@Override
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/EntrySpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/EntrySpan.java
index ef6cdd223..aae12a8a3 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/EntrySpan.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/EntrySpan.java
@@ -1,5 +1,8 @@
package org.skywalking.apm.agent.core.context.trace;
+import org.skywalking.apm.agent.core.dictionary.DictionaryUtil;
+import org.skywalking.apm.network.trace.component.Component;
+
/**
* The EntrySpan represents a service provider point, such as Tomcat server entrance.
*
@@ -46,6 +49,33 @@ public class EntrySpan extends AbstractTracingSpan {
return this;
}
+ @Override
+ public AbstractSpan setLayer(SpanLayer layer) {
+ if (stackDepth == currentMaxDepth) {
+ return super.setLayer(layer);
+ } else {
+ return this;
+ }
+ }
+
+ @Override
+ public AbstractSpan setComponent(Component component) {
+ if (stackDepth == currentMaxDepth) {
+ return super.setComponent(component);
+ } else {
+ return this;
+ }
+ }
+
+ @Override
+ public AbstractSpan setComponent(String componentName) {
+ if (stackDepth == currentMaxDepth) {
+ return super.setComponent(componentName);
+ } else {
+ return this;
+ }
+ }
+
@Override
public boolean finish(TraceSegment owner) {
if (--stackDepth == 0) {
@@ -74,6 +104,9 @@ public class EntrySpan extends AbstractTracingSpan {
}
private void clearWhenRestart() {
+ this.componentId = DictionaryUtil.nullValue();
+ this.componentName = null;
+ this.layer = null;
this.logs = null;
this.tags = null;
}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/ExitSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/ExitSpan.java
index 63a765261..640e71842 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/ExitSpan.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/ExitSpan.java
@@ -1,6 +1,7 @@
package org.skywalking.apm.agent.core.context.trace;
import org.skywalking.apm.agent.core.dictionary.DictionaryUtil;
+import org.skywalking.apm.network.trace.component.Component;
/**
* The ExitSpan represents a service consumer point, such as Feign, Okhttp discovery for a Http service.
@@ -66,6 +67,33 @@ public class ExitSpan extends AbstractTracingSpan {
}
}
+ @Override
+ public AbstractSpan setLayer(SpanLayer layer) {
+ if (stackDepth == 1) {
+ return super.setLayer(layer);
+ } else {
+ return this;
+ }
+ }
+
+ @Override
+ public AbstractSpan setComponent(Component component) {
+ if (stackDepth == 1) {
+ return super.setComponent(component);
+ } else {
+ return this;
+ }
+ }
+
+ @Override
+ public AbstractSpan setComponent(String componentName) {
+ if (stackDepth == 1) {
+ return super.setComponent(componentName);
+ } else {
+ return this;
+ }
+ }
+
@Override
public ExitSpan log(Throwable t) {
if (stackDepth == 1) {
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java
index 5da2aebcb..78c7045c3 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java
@@ -31,6 +31,11 @@ public class TraceSegmentRef {
*/
private List distributedTraceIds;
+ /**
+ * Transform a {@link ContextCarrier} to the TraceSegmentRef
+ *
+ * @param carrier the valid cross-process propagation format.
+ */
public TraceSegmentRef(ContextCarrier carrier) {
this.traceSegmentId = carrier.getTraceSegmentId();
this.spanId = carrier.getSpanId();