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 10efeb9b4..9f87dbc15 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
@@ -3,6 +3,7 @@ package org.skywalking.apm.agent.core.context;
import java.util.LinkedList;
import java.util.List;
import org.skywalking.apm.agent.core.boot.ServiceManager;
+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.AbstractTracingSpan;
import org.skywalking.apm.agent.core.context.trace.EntrySpan;
@@ -290,19 +291,19 @@ public class TracingContext implements AbstractTracerContext {
.find(remotePeer).doInCondition(
new PossibleFound.FoundAndObtain() {
@Override
- public Object doProcess(final int applicationId) {
+ public Object doProcess(final int peerId) {
return DictionaryManager.findOperationNameCodeSection()
- .findOrPrepare4Register(applicationId, operationName)
+ .findOnly(RemoteDownstreamConfig.Agent.APPLICATION_ID, operationName)
.doInCondition(
new PossibleFound.FoundAndObtain() {
@Override
public Object doProcess(int operationId) {
- return new ExitSpan(spanIdGenerator++, parentSpanId, operationId, applicationId);
+ return new ExitSpan(spanIdGenerator++, parentSpanId, operationId, peerId);
}
}, new PossibleFound.NotFoundAndObtain() {
@Override
public Object doProcess() {
- return new ExitSpan(spanIdGenerator++, parentSpanId, operationName, remotePeer);
+ return new ExitSpan(spanIdGenerator++, parentSpanId, operationName, peerId);
}
});
}
@@ -310,7 +311,20 @@ public class TracingContext implements AbstractTracerContext {
new PossibleFound.NotFoundAndObtain() {
@Override
public Object doProcess() {
- return new ExitSpan(spanIdGenerator++, parentSpanId, operationName, remotePeer);
+ return DictionaryManager.findOperationNameCodeSection()
+ .findOnly(RemoteDownstreamConfig.Agent.APPLICATION_ID, operationName)
+ .doInCondition(
+ new PossibleFound.FoundAndObtain() {
+ @Override
+ public Object doProcess(int operationId) {
+ return new ExitSpan(spanIdGenerator++, parentSpanId, operationId, remotePeer);
+ }
+ }, new PossibleFound.NotFoundAndObtain() {
+ @Override
+ public Object doProcess() {
+ return new ExitSpan(spanIdGenerator++, parentSpanId, operationName, remotePeer);
+ }
+ });
}
});
push(exitSpan);
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 4b2d69cfc..13ebe887e 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,8 +1,6 @@
package org.skywalking.apm.agent.core.context.trace;
-import org.skywalking.apm.agent.core.dictionary.DictionaryManager;
import org.skywalking.apm.agent.core.dictionary.DictionaryUtil;
-import org.skywalking.apm.agent.core.dictionary.PossibleFound;
import org.skywalking.apm.network.trace.component.Component;
/**
@@ -18,19 +16,16 @@ import org.skywalking.apm.network.trace.component.Component;
*
* @author wusheng
*/
-public class EntrySpan extends AbstractTracingSpan {
- private int stackDepth;
+public class EntrySpan extends StackBasedTracingSpan {
private int currentMaxDepth;
public EntrySpan(int spanId, int parentSpanId, String operationName) {
super(spanId, parentSpanId, operationName);
- this.stackDepth = 0;
this.currentMaxDepth = 0;
}
public EntrySpan(int spanId, int parentSpanId, int operationId) {
super(spanId, parentSpanId, operationId);
- this.stackDepth = 0;
this.currentMaxDepth = 0;
}
@@ -81,31 +76,6 @@ public class EntrySpan extends AbstractTracingSpan {
}
}
- @Override
- public boolean finish(TraceSegment owner) {
- if (--stackDepth == 0) {
- if (this.operationId == DictionaryUtil.nullValue()) {
- this.operationId = (Integer)DictionaryManager.findOperationNameCodeSection()
- .findOrPrepare4Register(owner.getApplicationId(), operationName)
- .doInCondition(
- new PossibleFound.FoundAndObtain() {
- @Override public Object doProcess(int value) {
- return value;
- }
- },
- new PossibleFound.NotFoundAndObtain() {
- @Override public Object doProcess() {
- return DictionaryUtil.nullValue();
- }
- }
- );
- }
- return super.finish(owner);
- } else {
- return false;
- }
- }
-
@Override
public AbstractTracingSpan setOperationName(String operationName) {
if (stackDepth == currentMaxDepth) {
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 bed47ff12..de9851804 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
@@ -17,32 +17,34 @@ import org.skywalking.apm.network.trace.component.Component;
*
* @author wusheng
*/
-public class ExitSpan extends AbstractTracingSpan {
- private int stackDepth;
+public class ExitSpan extends StackBasedTracingSpan {
private String peer;
private int peerId;
public ExitSpan(int spanId, int parentSpanId, String operationName, String peer) {
super(spanId, parentSpanId, operationName);
- this.stackDepth = 0;
this.peer = peer;
this.peerId = DictionaryUtil.nullValue();
}
public ExitSpan(int spanId, int parentSpanId, int operationId, int peerId) {
super(spanId, parentSpanId, operationId);
- this.stackDepth = 0;
this.peer = null;
this.peerId = peerId;
}
public ExitSpan(int spanId, int parentSpanId, int operationId, String peer) {
super(spanId, parentSpanId, operationId);
- this.stackDepth = 0;
this.peer = peer;
this.peerId = DictionaryUtil.nullValue();
}
+ public ExitSpan(int spanId, int parentSpanId, String operationName, int peerId) {
+ super(spanId, parentSpanId, operationName);
+ this.peer = null;
+ this.peerId = peerId;
+ }
+
/**
* Set the {@link #startTime}, when the first start, which means the first service provided.
*/
@@ -62,15 +64,6 @@ public class ExitSpan extends AbstractTracingSpan {
return this;
}
- @Override
- public boolean finish(TraceSegment owner) {
- if (--stackDepth == 0) {
- return super.finish(owner);
- } else {
- return false;
- }
- }
-
@Override
public AbstractTracingSpan setLayer(SpanLayer layer) {
if (stackDepth == 1) {
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java
new file mode 100644
index 000000000..846e195ed
--- /dev/null
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java
@@ -0,0 +1,51 @@
+package org.skywalking.apm.agent.core.context.trace;
+
+import org.skywalking.apm.agent.core.dictionary.DictionaryManager;
+import org.skywalking.apm.agent.core.dictionary.DictionaryUtil;
+import org.skywalking.apm.agent.core.dictionary.PossibleFound;
+
+/**
+ * The StackBasedTracingSpan represents a span with an inside stack construction.
+ *
+ * This kind of span can start and finish multi times in a stack-like invoke line.
+ *
+ * @author wusheng
+ */
+public abstract class StackBasedTracingSpan extends AbstractTracingSpan {
+ protected int stackDepth;
+
+ protected StackBasedTracingSpan(int spanId, int parentSpanId, String operationName) {
+ super(spanId, parentSpanId, operationName);
+ this.stackDepth = 0;
+ }
+
+ protected StackBasedTracingSpan(int spanId, int parentSpanId, int operationId) {
+ super(spanId, parentSpanId, operationId);
+ this.stackDepth = 0;
+ }
+
+ @Override
+ public boolean finish(TraceSegment owner) {
+ if (--stackDepth == 0) {
+ if (this.operationId == DictionaryUtil.nullValue()) {
+ this.operationId = (Integer)DictionaryManager.findOperationNameCodeSection()
+ .findOrPrepare4Register(owner.getApplicationId(), operationName)
+ .doInCondition(
+ new PossibleFound.FoundAndObtain() {
+ @Override public Object doProcess(int value) {
+ return value;
+ }
+ },
+ new PossibleFound.NotFoundAndObtain() {
+ @Override public Object doProcess() {
+ return DictionaryUtil.nullValue();
+ }
+ }
+ );
+ }
+ return super.finish(owner);
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/AbstractTracingSpanHelper.java b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/AbstractTracingSpanHelper.java
index c16872e0a..44eaf57a2 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/AbstractTracingSpanHelper.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/AbstractTracingSpanHelper.java
@@ -8,7 +8,7 @@ import org.skywalking.apm.agent.core.context.trace.LogDataEntity;
public class AbstractTracingSpanHelper {
public static int getParentSpanId(AbstractTracingSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "parentSpanId");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "parentSpanId");
} catch (Exception e) {
}
@@ -17,7 +17,7 @@ public class AbstractTracingSpanHelper {
public static List getLogs(AbstractTracingSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "logs");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "logs");
} catch (Exception e) {
}
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/FieldGetter.java b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/FieldGetter.java
index 0aeaad0b9..45c00518f 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/FieldGetter.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/FieldGetter.java
@@ -10,9 +10,10 @@ public class FieldGetter {
return (T)field.get(instance);
}
- public static T getParentFieldValue(Object instance,
+
+ public static T get2LevelParentFieldValue(Object instance,
String fieldName) throws IllegalAccessException, NoSuchFieldException {
- Field field = instance.getClass().getSuperclass().getDeclaredField(fieldName);
+ Field field = instance.getClass().getSuperclass().getSuperclass().getDeclaredField(fieldName);
field.setAccessible(true);
return (T)field.get(instance);
}
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/SpanHelper.java b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/SpanHelper.java
index 1ab112344..802b74215 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/SpanHelper.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/util/SpanHelper.java
@@ -7,7 +7,7 @@ public class SpanHelper {
public static SpanLayer getLayer(AbstractSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "layer");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "layer");
} catch (Exception e) {
}
@@ -16,7 +16,7 @@ public class SpanHelper {
public static int getComponentId(AbstractSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "componentId");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "componentId");
} catch (Exception e) {
}
diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/FieldGetter.java b/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/FieldGetter.java
index 1710b93ca..b2bb6f464 100644
--- a/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/FieldGetter.java
+++ b/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/FieldGetter.java
@@ -16,4 +16,12 @@ public class FieldGetter {
field.setAccessible(true);
return (T)field.get(instance);
}
+
+
+ public static T get2LevelParentFieldValue(Object instance,
+ String fieldName) throws IllegalAccessException, NoSuchFieldException {
+ Field field = instance.getClass().getSuperclass().getSuperclass().getDeclaredField(fieldName);
+ field.setAccessible(true);
+ return (T)field.get(instance);
+ }
}
diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/SpanHelper.java b/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/SpanHelper.java
index 3620fa741..0b752e947 100644
--- a/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/SpanHelper.java
+++ b/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/SpanHelper.java
@@ -10,8 +10,13 @@ import org.skywalking.apm.agent.core.context.util.KeyValuePair;
public class SpanHelper {
public static int getParentSpanId(AbstractSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "parentSpanId");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "parentSpanId");
} catch (Exception e) {
+ try {
+ return FieldGetter.getParentFieldValue(tracingSpan, "parentSpanId");
+ } catch (Exception e1) {
+
+ }
}
return -9999;
@@ -19,8 +24,13 @@ public class SpanHelper {
public static List getLogs(AbstractSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "logs");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "logs");
} catch (Exception e) {
+ try {
+ return FieldGetter.getParentFieldValue(tracingSpan, "logs");
+ } catch (Exception e1) {
+
+ }
}
return Collections.emptyList();
@@ -28,8 +38,13 @@ public class SpanHelper {
public static List getTags(AbstractSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "tags");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "tags");
} catch (Exception e) {
+ try {
+ return FieldGetter.getParentFieldValue(tracingSpan, "tags");
+ } catch (Exception e1) {
+
+ }
}
return Collections.emptyList();
@@ -37,8 +52,13 @@ public class SpanHelper {
public static SpanLayer getLayer(AbstractSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "layer");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "layer");
} catch (Exception e) {
+ try {
+ return FieldGetter.getParentFieldValue(tracingSpan, "layer");
+ } catch (Exception e1) {
+
+ }
}
return null;
@@ -46,8 +66,13 @@ public class SpanHelper {
public static String getComponentName(AbstractSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "componentName");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "componentName");
} catch (Exception e) {
+ try {
+ return FieldGetter.getParentFieldValue(tracingSpan, "componentName");
+ } catch (Exception e1) {
+
+ }
}
return null;
@@ -55,8 +80,13 @@ public class SpanHelper {
public static int getComponentId(AbstractSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "componentId");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "componentId");
} catch (Exception e) {
+ try {
+ return FieldGetter.getParentFieldValue(tracingSpan, "componentId");
+ } catch (Exception e1) {
+
+ }
}
return -1;
@@ -64,8 +94,13 @@ public class SpanHelper {
public static boolean getErrorOccurred(AbstractSpan tracingSpan) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "errorOccurred");
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "errorOccurred");
} catch (Exception e) {
+ try {
+ return FieldGetter.getParentFieldValue(tracingSpan, "errorOccurred");
+ } catch (Exception e1) {
+
+ }
}
return false;