Loading apm-network/src/main/proto/TraceSegmentService.proto +1 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ message TraceSegmentObject { repeated SpanObject spans = 3; int32 applicationId = 4; int32 applicationInstanceId = 5; bool isSizeLimited = 6; } message TraceSegmentReference { Loading apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/Config.java +16 −15 Original line number Diff line number Diff line Loading @@ -31,22 +31,27 @@ public class Config { public static class Agent { /** * Application code is showed in sky-walking-ui. * Suggestion: set an unique name for each application, one application's nodes share the same code. * Application code is showed in sky-walking-ui. Suggestion: set an unique name for each application, one * application's nodes share the same code. */ public static String APPLICATION_CODE = ""; /** * Negative or zero means off, by default. * {@link #SAMPLE_N_PER_3_SECS} means sampling N {@link TraceSegment} in 10 seconds tops. * Negative or zero means off, by default. {@link #SAMPLE_N_PER_3_SECS} means sampling N {@link TraceSegment} in * 10 seconds tops. */ public static int SAMPLE_N_PER_3_SECS = -1; /** * If the operation name of the first span is included in this set, * this segment should be ignored. * If the operation name of the first span is included in this set, this segment should be ignored. */ public static String IGNORE_SUFFIX = ".jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg"; /** * The max number of spans in a single segment. Through this config item, skywalking keep your application * memory cost estimated. */ public static int SPAN_LIMIT_PER_SEGMENT = 300; } public static class Collector { Loading @@ -63,9 +68,7 @@ public class Config { */ public static long DISCOVERY_CHECK_INTERVAL = 60; /** * Collector REST-Service address. * e.g. * SERVERS="127.0.0.1:8080" for single collector node. * Collector REST-Service address. e.g. SERVERS="127.0.0.1:8080" for single collector node. * SERVERS="10.2.45.126:8080,10.2.45.127:7600" for multi collector nodes. */ public static String SERVERS = ""; Loading Loading @@ -105,16 +108,15 @@ public class Config { public static String FILE_NAME = "skywalking-api.log"; /** * Log files directory. * Default is blank string, means, use "system.out" to output logs. * Log files directory. Default is blank string, means, use "system.out" to output logs. * * @see {@link WriterFactory#getLogWriter()} */ public static String DIR = ""; /** * The max size of log file. * If the size is bigger than this, archive the current file, and write into a new file. * The max size of log file. If the size is bigger than this, archive the current file, and write into a new * file. */ public static int MAX_FILE_SIZE = 300 * 1024 * 1024; Loading @@ -129,8 +131,7 @@ public class Config { public static class Plugin { public static class MongoDB { /** * If true, trace all the parameters, default is false. * Only trace the operation, not include parameters. * If true, trace all the parameters, default is false. Only trace the operation, not include parameters. */ public static boolean TRACE_PARAM = false; } Loading apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java +56 −37 Original line number Diff line number Diff line Loading @@ -21,11 +21,13 @@ 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.Config; 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; 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.NoopSpan; 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; Loading @@ -34,17 +36,15 @@ import org.skywalking.apm.agent.core.dictionary.PossibleFound; import org.skywalking.apm.agent.core.sampling.SamplingService; /** * The <code>TracingContext</code> represents a core tracing logic controller. * It build the final {@link TracingContext}, by the stack mechanism, * which is similar with the codes work. * The <code>TracingContext</code> represents a core tracing logic controller. It build the final {@link * TracingContext}, by the stack mechanism, which is similar with the codes work. * * In opentracing concept, it means, all spans in a segment tracing context(thread) * are CHILD_OF relationship, but no FOLLOW_OF. * In opentracing concept, it means, all spans in a segment tracing context(thread) are CHILD_OF relationship, but no * FOLLOW_OF. * * In skywalking core concept, FOLLOW_OF is an abstract concept * when cross-process MQ or cross-thread async/batch tasks happen, * we used {@link TraceSegmentRef} for these scenarios. * Check {@link TraceSegmentRef} which is from {@link ContextCarrier} or {@link ContextSnapshot}. * In skywalking core concept, FOLLOW_OF is an abstract concept when cross-process MQ or cross-thread async/batch tasks * happen, we used {@link TraceSegmentRef} for these scenarios. Check {@link TraceSegmentRef} which is from {@link * ContextCarrier} or {@link ContextSnapshot}. * * @author wusheng */ Loading @@ -60,13 +60,11 @@ public class TracingContext implements AbstractTracerContext { private TraceSegment segment; /** * Active spans stored in a Stack, usually called 'ActiveSpanStack'. * This {@link LinkedList} is the in-memory storage-structure. * <p> * I use {@link LinkedList#removeLast()}, {@link LinkedList#addLast(Object)} and {@link LinkedList#last} instead of * {@link #pop()}, {@link #push(AbstractTracingSpan)}, {@link #peek()} * Active spans stored in a Stack, usually called 'ActiveSpanStack'. This {@link LinkedList} is the in-memory * storage-structure. <p> I use {@link LinkedList#removeLast()}, {@link LinkedList#addLast(Object)} and {@link * LinkedList#last} instead of {@link #pop()}, {@link #push(AbstractSpan)}, {@link #peek()} */ private LinkedList<AbstractTracingSpan> activeSpanStack = new LinkedList<AbstractTracingSpan>(); private LinkedList<AbstractSpan> activeSpanStack = new LinkedList<AbstractSpan>(); /** * A counter for the next span. Loading @@ -93,7 +91,7 @@ public class TracingContext implements AbstractTracerContext { */ @Override public void inject(ContextCarrier carrier) { AbstractTracingSpan span = this.activeSpan(); AbstractSpan span = this.activeSpan(); if (!span.isExit()) { throw new IllegalStateException("Inject can be done only in Exit Span"); } Loading @@ -119,7 +117,7 @@ public class TracingContext implements AbstractTracerContext { operationName = ref.getEntryOperationName(); entryApplicationInstanceId = ref.getEntryApplicationInstanceId(); } else { AbstractTracingSpan firstSpan = first(); AbstractSpan firstSpan = first(); operationId = firstSpan.getOperationId(); operationName = firstSpan.getOperationName(); entryApplicationInstanceId = this.segment.getApplicationInstanceId(); Loading Loading @@ -169,7 +167,7 @@ public class TracingContext implements AbstractTracerContext { int entryOperationId; String entryOperationName; int entryApplicationInstanceId; AbstractTracingSpan firstSpan = first(); AbstractSpan firstSpan = first(); if (refs != null && refs.size() > 0) { TraceSegmentRef ref = refs.get(0); entryOperationId = ref.getEntryOperationId(); Loading Loading @@ -225,8 +223,12 @@ public class TracingContext implements AbstractTracerContext { */ @Override public AbstractSpan createEntrySpan(final String operationName) { AbstractTracingSpan entrySpan; final AbstractTracingSpan parentSpan = peek(); if (isLimitMechanismWorking()) { NoopSpan span = new NoopSpan(); return push(span); } AbstractSpan entrySpan; final AbstractSpan parentSpan = peek(); final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId(); if (parentSpan == null) { entrySpan = (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection() Loading Loading @@ -269,7 +271,11 @@ public class TracingContext implements AbstractTracerContext { */ @Override public AbstractSpan createLocalSpan(final String operationName) { AbstractTracingSpan parentSpan = peek(); if (isLimitMechanismWorking()) { NoopSpan span = new NoopSpan(); return push(span); } AbstractSpan parentSpan = peek(); final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId(); AbstractTracingSpan span = (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection() .findOrPrepare4Register(segment.getApplicationId(), operationName) Loading Loading @@ -298,8 +304,12 @@ public class TracingContext implements AbstractTracerContext { */ @Override public AbstractSpan createExitSpan(final String operationName, final String remotePeer) { AbstractTracingSpan exitSpan; AbstractTracingSpan parentSpan = peek(); if (isLimitMechanismWorking()) { NoopSpan span = new NoopSpan(); return push(span); } AbstractSpan exitSpan; AbstractSpan parentSpan = peek(); if (parentSpan != null && parentSpan.isExit()) { exitSpan = parentSpan; } else { Loading Loading @@ -354,8 +364,8 @@ public class TracingContext implements AbstractTracerContext { * @return the active span of current context, the top element of {@link #activeSpanStack} */ @Override public AbstractTracingSpan activeSpan() { AbstractTracingSpan span = peek(); public AbstractSpan activeSpan() { AbstractSpan span = peek(); if (span == null) { throw new IllegalStateException("No active span."); } Loading @@ -363,16 +373,21 @@ public class TracingContext implements AbstractTracerContext { } /** * Stop the given span, if and only if this one is the top element of {@link #activeSpanStack}. * Because the tracing core must make sure the span must match in a stack module, like any program did. * Stop the given span, if and only if this one is the top element of {@link #activeSpanStack}. Because the tracing * core must make sure the span must match in a stack module, like any program did. * * @param span to finish */ @Override public void stopSpan(AbstractSpan span) { AbstractTracingSpan lastSpan = peek(); AbstractSpan lastSpan = peek(); if (lastSpan == span) { if (lastSpan.finish(segment)) { if (lastSpan instanceof AbstractTracingSpan) { AbstractTracingSpan toFinishSpan = (AbstractTracingSpan)lastSpan; if (toFinishSpan.finish(segment)) { pop(); } } else { pop(); } } else { Loading @@ -389,7 +404,7 @@ public class TracingContext implements AbstractTracerContext { * TracingContext.ListenerManager} */ private void finish() { TraceSegment finishedSegment = segment.finish(); TraceSegment finishedSegment = segment.finish(isLimitMechanismWorking()); /** * Recheck the segment if the segment contains only one span. * Because in the runtime, can't sure this segment is part of distributed trace. Loading Loading @@ -421,9 +436,9 @@ public class TracingContext implements AbstractTracerContext { } /** * Notify the {@link TracingContext.ListenerManager} about the given {@link TraceSegment} have finished. * And trigger {@link TracingContext.ListenerManager} to notify all {@link #LISTENERS} 's * {@link TracingContextListener#afterFinished(TraceSegment)} * Notify the {@link TracingContext.ListenerManager} about the given {@link TraceSegment} have finished. And * trigger {@link TracingContext.ListenerManager} to notify all {@link #LISTENERS} 's {@link * TracingContextListener#afterFinished(TraceSegment)} * * @param finishedSegment */ Loading @@ -445,7 +460,7 @@ public class TracingContext implements AbstractTracerContext { /** * @return the top element of 'ActiveSpanStack', and remove it. */ private AbstractTracingSpan pop() { private AbstractSpan pop() { return activeSpanStack.removeLast(); } Loading @@ -454,7 +469,7 @@ public class TracingContext implements AbstractTracerContext { * * @param span */ private AbstractTracingSpan push(AbstractTracingSpan span) { private AbstractSpan push(AbstractSpan span) { activeSpanStack.addLast(span); return span; } Loading @@ -462,14 +477,18 @@ public class TracingContext implements AbstractTracerContext { /** * @return the top element of 'ActiveSpanStack' only. */ private AbstractTracingSpan peek() { private AbstractSpan peek() { if (activeSpanStack.isEmpty()) { return null; } return activeSpanStack.getLast(); } private AbstractTracingSpan first() { private AbstractSpan first() { return activeSpanStack.getFirst(); } private boolean isLimitMechanismWorking() { return spanIdGenerator > Config.Agent.SPAN_LIMIT_PER_SEGMENT; } } apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractSpan.java +23 −4 Original line number Diff line number Diff line Loading @@ -22,8 +22,7 @@ import java.util.Map; import org.skywalking.apm.network.trace.component.Component; /** * The <code>AbstractSpan</code> represents the span's skeleton, * which contains all open methods. * The <code>AbstractSpan</code> represents the span's skeleton, which contains all open methods. * * @author wusheng */ Loading @@ -37,8 +36,8 @@ public interface AbstractSpan { AbstractSpan setComponent(Component component); /** * Only use this method in explicit instrumentation, like opentracing-skywalking-bridge. * It it higher recommend don't use this for performance consideration. * Only use this method in explicit instrumentation, like opentracing-skywalking-bridge. It it higher recommend * don't use this for performance consideration. * * @param componentName * @return the span for chaining. Loading Loading @@ -89,4 +88,24 @@ public interface AbstractSpan { * @return this Span instance, for chaining */ AbstractSpan setOperationName(String operationName); /** * Start a span. * * @return this Span instance, for chaining */ AbstractSpan start(); /** * Get the id of span * * @return id value. */ int getSpanId(); int getOperationId(); String getOperationName(); AbstractSpan setOperationId(int operationId); } apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java +16 −15 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ import org.skywalking.apm.network.proto.SpanType; import org.skywalking.apm.network.trace.component.Component; /** * The <code>AbstractTracingSpan</code> represents a group of {@link AbstractSpan} implementations, * which belongs a real distributed trace. * The <code>AbstractTracingSpan</code> represents a group of {@link AbstractSpan} implementations, which belongs a real * distributed trace. * * @author wusheng */ Loading Loading @@ -59,9 +59,7 @@ public abstract class AbstractTracingSpan implements AbstractSpan { protected String componentName; /** * Log is a concept from OpenTracing spec. * <p> * {@see https://github.com/opentracing/specification/blob/master/specification.md#log-structured-data} * Log is a concept from OpenTracing spec. <p> {@see https://github.com/opentracing/specification/blob/master/specification.md#log-structured-data} */ protected List<LogDataEntity> logs; Loading Loading @@ -94,8 +92,8 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * Finish the active Span. * When it is finished, it will be archived by the given {@link TraceSegment}, which owners it. * Finish the active Span. When it is finished, it will be archived by the given {@link TraceSegment}, which owners * it. * * @param owner of the Span. */ Loading @@ -105,6 +103,7 @@ public abstract class AbstractTracingSpan implements AbstractSpan { return true; } @Override public AbstractTracingSpan start() { this.startTime = System.currentTimeMillis(); return this; Loading Loading @@ -150,8 +149,8 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * In the scope of this span tracing context, error occurred, * in auto-instrumentation mechanism, almost means throw an exception. * In the scope of this span tracing context, error occurred, in auto-instrumentation mechanism, almost means throw * an exception. * * @return span instance, for chaining. */ Loading @@ -162,8 +161,8 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * Set the operation name, just because these is not compress dictionary value for this name. * Use the entire string temporarily, the agent will compress this name in async mode. * Set the operation name, just because these is not compress dictionary value for this name. Use the entire string * temporarily, the agent will compress this name in async mode. * * @param operationName * @return span instance, for chaining. Loading @@ -181,20 +180,24 @@ public abstract class AbstractTracingSpan implements AbstractSpan { * @param operationId * @return span instance, for chaining. */ @Override public AbstractTracingSpan setOperationId(int operationId) { this.operationId = operationId; this.operationName = null; return this; } @Override public int getSpanId() { return spanId; } @Override public int getOperationId() { return operationId; } @Override public String getOperationName() { return operationName; } Loading @@ -206,8 +209,7 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * Set the component of this span, with internal supported. * Highly recommend to use this way. * Set the component of this span, with internal supported. Highly recommend to use this way. * * @param component * @return span instance, for chaining. Loading @@ -219,8 +221,7 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * Set the component name. * By using this, cost more memory and network. * Set the component name. By using this, cost more memory and network. * * @param componentName * @return span instance, for chaining. Loading Loading
apm-network/src/main/proto/TraceSegmentService.proto +1 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ message TraceSegmentObject { repeated SpanObject spans = 3; int32 applicationId = 4; int32 applicationInstanceId = 5; bool isSizeLimited = 6; } message TraceSegmentReference { Loading
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/Config.java +16 −15 Original line number Diff line number Diff line Loading @@ -31,22 +31,27 @@ public class Config { public static class Agent { /** * Application code is showed in sky-walking-ui. * Suggestion: set an unique name for each application, one application's nodes share the same code. * Application code is showed in sky-walking-ui. Suggestion: set an unique name for each application, one * application's nodes share the same code. */ public static String APPLICATION_CODE = ""; /** * Negative or zero means off, by default. * {@link #SAMPLE_N_PER_3_SECS} means sampling N {@link TraceSegment} in 10 seconds tops. * Negative or zero means off, by default. {@link #SAMPLE_N_PER_3_SECS} means sampling N {@link TraceSegment} in * 10 seconds tops. */ public static int SAMPLE_N_PER_3_SECS = -1; /** * If the operation name of the first span is included in this set, * this segment should be ignored. * If the operation name of the first span is included in this set, this segment should be ignored. */ public static String IGNORE_SUFFIX = ".jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg"; /** * The max number of spans in a single segment. Through this config item, skywalking keep your application * memory cost estimated. */ public static int SPAN_LIMIT_PER_SEGMENT = 300; } public static class Collector { Loading @@ -63,9 +68,7 @@ public class Config { */ public static long DISCOVERY_CHECK_INTERVAL = 60; /** * Collector REST-Service address. * e.g. * SERVERS="127.0.0.1:8080" for single collector node. * Collector REST-Service address. e.g. SERVERS="127.0.0.1:8080" for single collector node. * SERVERS="10.2.45.126:8080,10.2.45.127:7600" for multi collector nodes. */ public static String SERVERS = ""; Loading Loading @@ -105,16 +108,15 @@ public class Config { public static String FILE_NAME = "skywalking-api.log"; /** * Log files directory. * Default is blank string, means, use "system.out" to output logs. * Log files directory. Default is blank string, means, use "system.out" to output logs. * * @see {@link WriterFactory#getLogWriter()} */ public static String DIR = ""; /** * The max size of log file. * If the size is bigger than this, archive the current file, and write into a new file. * The max size of log file. If the size is bigger than this, archive the current file, and write into a new * file. */ public static int MAX_FILE_SIZE = 300 * 1024 * 1024; Loading @@ -129,8 +131,7 @@ public class Config { public static class Plugin { public static class MongoDB { /** * If true, trace all the parameters, default is false. * Only trace the operation, not include parameters. * If true, trace all the parameters, default is false. Only trace the operation, not include parameters. */ public static boolean TRACE_PARAM = false; } Loading
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java +56 −37 Original line number Diff line number Diff line Loading @@ -21,11 +21,13 @@ 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.Config; 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; 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.NoopSpan; 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; Loading @@ -34,17 +36,15 @@ import org.skywalking.apm.agent.core.dictionary.PossibleFound; import org.skywalking.apm.agent.core.sampling.SamplingService; /** * The <code>TracingContext</code> represents a core tracing logic controller. * It build the final {@link TracingContext}, by the stack mechanism, * which is similar with the codes work. * The <code>TracingContext</code> represents a core tracing logic controller. It build the final {@link * TracingContext}, by the stack mechanism, which is similar with the codes work. * * In opentracing concept, it means, all spans in a segment tracing context(thread) * are CHILD_OF relationship, but no FOLLOW_OF. * In opentracing concept, it means, all spans in a segment tracing context(thread) are CHILD_OF relationship, but no * FOLLOW_OF. * * In skywalking core concept, FOLLOW_OF is an abstract concept * when cross-process MQ or cross-thread async/batch tasks happen, * we used {@link TraceSegmentRef} for these scenarios. * Check {@link TraceSegmentRef} which is from {@link ContextCarrier} or {@link ContextSnapshot}. * In skywalking core concept, FOLLOW_OF is an abstract concept when cross-process MQ or cross-thread async/batch tasks * happen, we used {@link TraceSegmentRef} for these scenarios. Check {@link TraceSegmentRef} which is from {@link * ContextCarrier} or {@link ContextSnapshot}. * * @author wusheng */ Loading @@ -60,13 +60,11 @@ public class TracingContext implements AbstractTracerContext { private TraceSegment segment; /** * Active spans stored in a Stack, usually called 'ActiveSpanStack'. * This {@link LinkedList} is the in-memory storage-structure. * <p> * I use {@link LinkedList#removeLast()}, {@link LinkedList#addLast(Object)} and {@link LinkedList#last} instead of * {@link #pop()}, {@link #push(AbstractTracingSpan)}, {@link #peek()} * Active spans stored in a Stack, usually called 'ActiveSpanStack'. This {@link LinkedList} is the in-memory * storage-structure. <p> I use {@link LinkedList#removeLast()}, {@link LinkedList#addLast(Object)} and {@link * LinkedList#last} instead of {@link #pop()}, {@link #push(AbstractSpan)}, {@link #peek()} */ private LinkedList<AbstractTracingSpan> activeSpanStack = new LinkedList<AbstractTracingSpan>(); private LinkedList<AbstractSpan> activeSpanStack = new LinkedList<AbstractSpan>(); /** * A counter for the next span. Loading @@ -93,7 +91,7 @@ public class TracingContext implements AbstractTracerContext { */ @Override public void inject(ContextCarrier carrier) { AbstractTracingSpan span = this.activeSpan(); AbstractSpan span = this.activeSpan(); if (!span.isExit()) { throw new IllegalStateException("Inject can be done only in Exit Span"); } Loading @@ -119,7 +117,7 @@ public class TracingContext implements AbstractTracerContext { operationName = ref.getEntryOperationName(); entryApplicationInstanceId = ref.getEntryApplicationInstanceId(); } else { AbstractTracingSpan firstSpan = first(); AbstractSpan firstSpan = first(); operationId = firstSpan.getOperationId(); operationName = firstSpan.getOperationName(); entryApplicationInstanceId = this.segment.getApplicationInstanceId(); Loading Loading @@ -169,7 +167,7 @@ public class TracingContext implements AbstractTracerContext { int entryOperationId; String entryOperationName; int entryApplicationInstanceId; AbstractTracingSpan firstSpan = first(); AbstractSpan firstSpan = first(); if (refs != null && refs.size() > 0) { TraceSegmentRef ref = refs.get(0); entryOperationId = ref.getEntryOperationId(); Loading Loading @@ -225,8 +223,12 @@ public class TracingContext implements AbstractTracerContext { */ @Override public AbstractSpan createEntrySpan(final String operationName) { AbstractTracingSpan entrySpan; final AbstractTracingSpan parentSpan = peek(); if (isLimitMechanismWorking()) { NoopSpan span = new NoopSpan(); return push(span); } AbstractSpan entrySpan; final AbstractSpan parentSpan = peek(); final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId(); if (parentSpan == null) { entrySpan = (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection() Loading Loading @@ -269,7 +271,11 @@ public class TracingContext implements AbstractTracerContext { */ @Override public AbstractSpan createLocalSpan(final String operationName) { AbstractTracingSpan parentSpan = peek(); if (isLimitMechanismWorking()) { NoopSpan span = new NoopSpan(); return push(span); } AbstractSpan parentSpan = peek(); final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId(); AbstractTracingSpan span = (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection() .findOrPrepare4Register(segment.getApplicationId(), operationName) Loading Loading @@ -298,8 +304,12 @@ public class TracingContext implements AbstractTracerContext { */ @Override public AbstractSpan createExitSpan(final String operationName, final String remotePeer) { AbstractTracingSpan exitSpan; AbstractTracingSpan parentSpan = peek(); if (isLimitMechanismWorking()) { NoopSpan span = new NoopSpan(); return push(span); } AbstractSpan exitSpan; AbstractSpan parentSpan = peek(); if (parentSpan != null && parentSpan.isExit()) { exitSpan = parentSpan; } else { Loading Loading @@ -354,8 +364,8 @@ public class TracingContext implements AbstractTracerContext { * @return the active span of current context, the top element of {@link #activeSpanStack} */ @Override public AbstractTracingSpan activeSpan() { AbstractTracingSpan span = peek(); public AbstractSpan activeSpan() { AbstractSpan span = peek(); if (span == null) { throw new IllegalStateException("No active span."); } Loading @@ -363,16 +373,21 @@ public class TracingContext implements AbstractTracerContext { } /** * Stop the given span, if and only if this one is the top element of {@link #activeSpanStack}. * Because the tracing core must make sure the span must match in a stack module, like any program did. * Stop the given span, if and only if this one is the top element of {@link #activeSpanStack}. Because the tracing * core must make sure the span must match in a stack module, like any program did. * * @param span to finish */ @Override public void stopSpan(AbstractSpan span) { AbstractTracingSpan lastSpan = peek(); AbstractSpan lastSpan = peek(); if (lastSpan == span) { if (lastSpan.finish(segment)) { if (lastSpan instanceof AbstractTracingSpan) { AbstractTracingSpan toFinishSpan = (AbstractTracingSpan)lastSpan; if (toFinishSpan.finish(segment)) { pop(); } } else { pop(); } } else { Loading @@ -389,7 +404,7 @@ public class TracingContext implements AbstractTracerContext { * TracingContext.ListenerManager} */ private void finish() { TraceSegment finishedSegment = segment.finish(); TraceSegment finishedSegment = segment.finish(isLimitMechanismWorking()); /** * Recheck the segment if the segment contains only one span. * Because in the runtime, can't sure this segment is part of distributed trace. Loading Loading @@ -421,9 +436,9 @@ public class TracingContext implements AbstractTracerContext { } /** * Notify the {@link TracingContext.ListenerManager} about the given {@link TraceSegment} have finished. * And trigger {@link TracingContext.ListenerManager} to notify all {@link #LISTENERS} 's * {@link TracingContextListener#afterFinished(TraceSegment)} * Notify the {@link TracingContext.ListenerManager} about the given {@link TraceSegment} have finished. And * trigger {@link TracingContext.ListenerManager} to notify all {@link #LISTENERS} 's {@link * TracingContextListener#afterFinished(TraceSegment)} * * @param finishedSegment */ Loading @@ -445,7 +460,7 @@ public class TracingContext implements AbstractTracerContext { /** * @return the top element of 'ActiveSpanStack', and remove it. */ private AbstractTracingSpan pop() { private AbstractSpan pop() { return activeSpanStack.removeLast(); } Loading @@ -454,7 +469,7 @@ public class TracingContext implements AbstractTracerContext { * * @param span */ private AbstractTracingSpan push(AbstractTracingSpan span) { private AbstractSpan push(AbstractSpan span) { activeSpanStack.addLast(span); return span; } Loading @@ -462,14 +477,18 @@ public class TracingContext implements AbstractTracerContext { /** * @return the top element of 'ActiveSpanStack' only. */ private AbstractTracingSpan peek() { private AbstractSpan peek() { if (activeSpanStack.isEmpty()) { return null; } return activeSpanStack.getLast(); } private AbstractTracingSpan first() { private AbstractSpan first() { return activeSpanStack.getFirst(); } private boolean isLimitMechanismWorking() { return spanIdGenerator > Config.Agent.SPAN_LIMIT_PER_SEGMENT; } }
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractSpan.java +23 −4 Original line number Diff line number Diff line Loading @@ -22,8 +22,7 @@ import java.util.Map; import org.skywalking.apm.network.trace.component.Component; /** * The <code>AbstractSpan</code> represents the span's skeleton, * which contains all open methods. * The <code>AbstractSpan</code> represents the span's skeleton, which contains all open methods. * * @author wusheng */ Loading @@ -37,8 +36,8 @@ public interface AbstractSpan { AbstractSpan setComponent(Component component); /** * Only use this method in explicit instrumentation, like opentracing-skywalking-bridge. * It it higher recommend don't use this for performance consideration. * Only use this method in explicit instrumentation, like opentracing-skywalking-bridge. It it higher recommend * don't use this for performance consideration. * * @param componentName * @return the span for chaining. Loading Loading @@ -89,4 +88,24 @@ public interface AbstractSpan { * @return this Span instance, for chaining */ AbstractSpan setOperationName(String operationName); /** * Start a span. * * @return this Span instance, for chaining */ AbstractSpan start(); /** * Get the id of span * * @return id value. */ int getSpanId(); int getOperationId(); String getOperationName(); AbstractSpan setOperationId(int operationId); }
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java +16 −15 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ import org.skywalking.apm.network.proto.SpanType; import org.skywalking.apm.network.trace.component.Component; /** * The <code>AbstractTracingSpan</code> represents a group of {@link AbstractSpan} implementations, * which belongs a real distributed trace. * The <code>AbstractTracingSpan</code> represents a group of {@link AbstractSpan} implementations, which belongs a real * distributed trace. * * @author wusheng */ Loading Loading @@ -59,9 +59,7 @@ public abstract class AbstractTracingSpan implements AbstractSpan { protected String componentName; /** * Log is a concept from OpenTracing spec. * <p> * {@see https://github.com/opentracing/specification/blob/master/specification.md#log-structured-data} * Log is a concept from OpenTracing spec. <p> {@see https://github.com/opentracing/specification/blob/master/specification.md#log-structured-data} */ protected List<LogDataEntity> logs; Loading Loading @@ -94,8 +92,8 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * Finish the active Span. * When it is finished, it will be archived by the given {@link TraceSegment}, which owners it. * Finish the active Span. When it is finished, it will be archived by the given {@link TraceSegment}, which owners * it. * * @param owner of the Span. */ Loading @@ -105,6 +103,7 @@ public abstract class AbstractTracingSpan implements AbstractSpan { return true; } @Override public AbstractTracingSpan start() { this.startTime = System.currentTimeMillis(); return this; Loading Loading @@ -150,8 +149,8 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * In the scope of this span tracing context, error occurred, * in auto-instrumentation mechanism, almost means throw an exception. * In the scope of this span tracing context, error occurred, in auto-instrumentation mechanism, almost means throw * an exception. * * @return span instance, for chaining. */ Loading @@ -162,8 +161,8 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * Set the operation name, just because these is not compress dictionary value for this name. * Use the entire string temporarily, the agent will compress this name in async mode. * Set the operation name, just because these is not compress dictionary value for this name. Use the entire string * temporarily, the agent will compress this name in async mode. * * @param operationName * @return span instance, for chaining. Loading @@ -181,20 +180,24 @@ public abstract class AbstractTracingSpan implements AbstractSpan { * @param operationId * @return span instance, for chaining. */ @Override public AbstractTracingSpan setOperationId(int operationId) { this.operationId = operationId; this.operationName = null; return this; } @Override public int getSpanId() { return spanId; } @Override public int getOperationId() { return operationId; } @Override public String getOperationName() { return operationName; } Loading @@ -206,8 +209,7 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * Set the component of this span, with internal supported. * Highly recommend to use this way. * Set the component of this span, with internal supported. Highly recommend to use this way. * * @param component * @return span instance, for chaining. Loading @@ -219,8 +221,7 @@ public abstract class AbstractTracingSpan implements AbstractSpan { } /** * Set the component name. * By using this, cost more memory and network. * Set the component name. By using this, cost more memory and network. * * @param componentName * @return span instance, for chaining. Loading