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 cf01a40d0..9235a7994 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,7 +1,6 @@
package org.skywalking.apm.agent.core.context;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
-import org.skywalking.apm.agent.core.context.trace.SpanType;
/**
* The AbstractTracerContext represents the tracer context manager.
@@ -15,9 +14,11 @@ public interface AbstractTracerContext {
String getGlobalTraceId();
- AbstractSpan createSpan(String operationName, SpanType spanType);
+ AbstractSpan createEntrySpan(String operationName);
- AbstractSpan createSpan(String operationName, SpanType spanType, Injectable injectable);
+ AbstractSpan createLocalSpan(String operationName);
+
+ AbstractSpan createExitSpan(String operationName, String remotePeer);
AbstractSpan activeSpan();
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 202a36258..87c9b7b17 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
@@ -5,7 +5,6 @@ import org.skywalking.apm.agent.core.boot.ServiceManager;
import org.skywalking.apm.agent.core.conf.Config;
import org.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
-import org.skywalking.apm.agent.core.context.trace.SpanType;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
import org.skywalking.apm.agent.core.dictionary.DictionaryUtil;
import org.skywalking.apm.agent.core.sampling.SamplingService;
@@ -77,7 +76,7 @@ public class ContextManager implements TracingContextListener, BootService, Igno
}
}
- public static AbstractSpan createSpan(String operationName, ContextCarrier carrier) {
+ public static AbstractSpan createEntrySpan(String operationName, ContextCarrier carrier) {
if (carrier == null) {
throw new IllegalArgumentException("ContextCarrier can't be null.");
}
@@ -90,21 +89,21 @@ public class ContextManager implements TracingContextListener, BootService, Igno
} else {
context = getOrCreate(operationName, false);
}
- return context.createSpan(operationName, SpanType.ENTRY);
+ return context.createEntrySpan(operationName);
}
- public static AbstractSpan createSpan(String operationName) {
+ public static AbstractSpan createLocalSpan(String operationName) {
AbstractTracerContext context = getOrCreate(operationName, false);
- return context.createSpan(operationName, SpanType.LOCAL);
+ return context.createLocalSpan(operationName);
}
- public static AbstractSpan createSpan(String operationName, Injectable injectable) {
- if (injectable == null) {
- throw new IllegalArgumentException("Injectable can't be null.");
+ public static AbstractSpan createExitSpan(String operationName, ContextCarrier carrier, String remotePeer) {
+ if (carrier == null) {
+ throw new IllegalArgumentException("ContextCarrier can't be null.");
}
AbstractTracerContext context = getOrCreate(operationName, false);
- AbstractSpan span = context.createSpan(operationName, SpanType.EXIT);
- context.inject(injectable.getCarrier());
+ AbstractSpan span = context.createExitSpan(operationName, remotePeer);
+ context.inject(carrier);
return span;
}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoredTracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoredTracerContext.java
index a07fdebbe..c09229e99 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoredTracerContext.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoredTracerContext.java
@@ -4,7 +4,6 @@ import java.util.LinkedList;
import java.util.List;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
import org.skywalking.apm.agent.core.context.trace.NoopSpan;
-import org.skywalking.apm.agent.core.context.trace.SpanType;
/**
* The IgnoredTracerContext represent a context should be ignored.
@@ -38,12 +37,19 @@ public class IgnoredTracerContext implements AbstractTracerContext {
}
@Override
- public AbstractSpan createSpan(String operationName, SpanType spanType) {
- return createSpan(operationName, spanType, null);
+ public AbstractSpan createEntrySpan(String operationName) {
+ stackDepth++;
+ return NOOP_SPAN;
}
@Override
- public AbstractSpan createSpan(String operationName, SpanType spanType, Injectable injectable) {
+ public AbstractSpan createLocalSpan(String operationName) {
+ stackDepth++;
+ return NOOP_SPAN;
+ }
+
+ @Override
+ public AbstractSpan createExitSpan(String operationName, String remotePeer) {
stackDepth++;
return NOOP_SPAN;
}
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 2d274a48d..e10f66b65 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
@@ -8,7 +8,6 @@ import org.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
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;
-import org.skywalking.apm.agent.core.context.trace.SpanType;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
import org.skywalking.apm.agent.core.context.trace.TraceSegmentRef;
import org.skywalking.apm.agent.core.dictionary.DictionaryManager;
@@ -77,88 +76,81 @@ public class TracingContext implements AbstractTracerContext {
}
@Override
- public AbstractSpan createSpan(String operationName, SpanType spanType) {
- return createSpan(operationName, spanType, null);
+ public AbstractSpan createEntrySpan(final String operationName) {
+ AbstractTracingSpan parentSpan = peek();
+ final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId();
+ if (parentSpan == null) {
+ return (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection()
+ .find(segment.getApplicationId(), operationName)
+ .doInCondition(new PossibleFound.FoundAndObtain() {
+ @Override public Object doProcess(int operationId) {
+ return new EntrySpan(spanIdGenerator++, parentSpanId, operationId);
+ }
+ }, new PossibleFound.NotFoundAndObtain() {
+ @Override public Object doProcess() {
+ return new EntrySpan(spanIdGenerator++, parentSpanId, operationName);
+ }
+ });
+ } else if (parentSpan.isEntry()) {
+ return parentSpan;
+ } else {
+ throw new IllegalStateException("The Entry Span can't be the child of Non-Entry Span");
+ }
}
@Override
- public AbstractSpan createSpan(String operationName, SpanType spanType, Injectable injectable) {
+ public AbstractSpan createLocalSpan(final String operationName) {
AbstractTracingSpan parentSpan = peek();
- AbstractTracingSpan span = createByType(spanIdGenerator++, -1, operationName,
- spanType, injectable.getPeer(), parentSpan);
- return span.start();
+ final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId();
+ return (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection()
+ .find(segment.getApplicationId(), operationName)
+ .doInCondition(new PossibleFound.FoundAndObtain() {
+ @Override
+ public Object doProcess(int operationId) {
+ return new LocalSpan(spanIdGenerator++, parentSpanId, operationId);
+ }
+ }, new PossibleFound.NotFoundAndObtain() {
+ @Override
+ public Object doProcess() {
+ return new LocalSpan(spanIdGenerator++, parentSpanId, operationName);
+ }
+ });
}
- private AbstractTracingSpan createByType(final int spanId, final int parentSpanId,
- final String operationName, SpanType spanType,
- final String peerHost, AbstractTracingSpan parentSpan) {
- switch (spanType) {
- case LOCAL:
- return (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection()
- .find(segment.getApplicationId(), operationName)
- .doInCondition(new PossibleFound.FoundAndObtain() {
+ @Override
+ public AbstractSpan createExitSpan(final String operationName, final String remotePeer) {
+ AbstractTracingSpan parentSpan = peek();
+ if (parentSpan != null && parentSpan.isExit()) {
+ return parentSpan;
+ } else {
+ final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId();
+ return (AbstractTracingSpan)DictionaryManager.findApplicationCodeSection()
+ .find(remotePeer).doInCondition(
+ new PossibleFound.FoundAndObtain() {
@Override
- public Object doProcess(int operationId) {
- return new LocalSpan(spanId, parentSpanId, operationId);
+ public Object doProcess(final int applicationId) {
+ return DictionaryManager.findOperationNameCodeSection()
+ .find(applicationId, operationName)
+ .doInCondition(
+ new PossibleFound.FoundAndObtain() {
+ @Override
+ public Object doProcess(int peerId) {
+ return new ExitSpan(spanIdGenerator++, parentSpanId, applicationId, peerId);
+ }
+ }, new PossibleFound.NotFoundAndObtain() {
+ @Override
+ public Object doProcess() {
+ return new ExitSpan(spanIdGenerator++, parentSpanId, applicationId, remotePeer);
+ }
+ });
}
- }, new PossibleFound.NotFoundAndObtain() {
+ },
+ new PossibleFound.NotFoundAndObtain() {
@Override
public Object doProcess() {
- return new LocalSpan(spanId, parentSpanId, operationName);
+ return new ExitSpan(spanIdGenerator++, parentSpanId, operationName, remotePeer);
}
});
- case EXIT:
- if (parentSpan != null && parentSpan.isExit()) {
- return parentSpan;
- } else {
- return (AbstractTracingSpan)DictionaryManager.findApplicationCodeSection()
- .find(peerHost).doInCondition(
- new PossibleFound.FoundAndObtain() {
- @Override
- public Object doProcess(final int applicationId) {
- return DictionaryManager.findOperationNameCodeSection()
- .find(applicationId, operationName)
- .doInCondition(
- new PossibleFound.FoundAndObtain() {
- @Override
- public Object doProcess(int peerId) {
- return new ExitSpan(spanId, parentSpanId, applicationId, peerId);
- }
- }, new PossibleFound.NotFoundAndObtain() {
- @Override
- public Object doProcess() {
- return new ExitSpan(spanId, parentSpanId, applicationId, peerHost);
- }
- });
- }
- },
- new PossibleFound.NotFoundAndObtain() {
- @Override
- public Object doProcess() {
- return new ExitSpan(spanId, parentSpanId, operationName, peerHost);
- }
- });
- }
- case ENTRY:
- if (parentSpan.isEntry()) {
- return parentSpan;
- } else if (parentSpan == null) {
- return (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection()
- .find(segment.getApplicationId(), operationName)
- .doInCondition(new PossibleFound.FoundAndObtain() {
- @Override public Object doProcess(int operationId) {
- return new EntrySpan(spanId, parentSpanId, operationId);
- }
- }, new PossibleFound.NotFoundAndObtain() {
- @Override public Object doProcess() {
- return new EntrySpan(spanId, parentSpanId, operationName);
- }
- });
- } else {
- throw new IllegalStateException("The Entry Span can't be the child of Non-Entry Span");
- }
- default:
- throw new IllegalStateException("Unsupported Span type:" + spanType);
}
}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/SpanType.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/SpanType.java
deleted file mode 100644
index a73e6962e..000000000
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/SpanType.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.skywalking.apm.agent.core.context.trace;
-
-/**
- * @author wusheng
- */
-public enum SpanType {
- ENTRY,
- EXIT,
- LOCAL
-}