From 888e0484bb7c4bb42c31423481bc51185ced68a6 Mon Sep 17 00:00:00 2001 From: wusheng Date: Sun, 2 Jul 2017 22:18:12 +0800 Subject: [PATCH] Fix entry and exit span methods bug. --- .../agent/core/context/TracingContext.java | 18 ++++++---- .../agent/core/context/trace/EntrySpan.java | 33 +++++++++++++++++++ .../agent/core/context/trace/ExitSpan.java | 28 ++++++++++++++++ .../core/context/trace/TraceSegmentRef.java | 5 +++ 4 files changed, 78 insertions(+), 6 deletions(-) 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();