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;