From cf3d2a40266cc761c679fdfab98a52e224045da6 Mon Sep 17 00:00:00 2001 From: wusheng Date: Sun, 11 Jun 2017 22:35:30 +0800 Subject: [PATCH] Add parts of ignore mechanism, and this is part of new sampling mechanism. All of these are providing higher performance. --- .../core/context/AbstractTracerContext.java | 2 + .../agent/core/context/ContextCarrier.java | 16 ++- .../agent/core/context/ContextManager.java | 25 +++-- .../core/context/IgnoreTracerContext.java | 104 ++++++++++++++++++ .../context/IgnoreTracerContextListener.java | 9 ++ .../apm/agent/core/context/TracerContext.java | 6 + .../apm/agent/core/context/trace/Span.java | 4 +- 7 files changed, 150 insertions(+), 16 deletions(-) create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoreTracerContext.java create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoreTracerContextListener.java 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 ade88e1af..0891fc3c3 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 @@ -23,4 +23,6 @@ public interface AbstractTracerContext { void stopSpan(Span span); void stopSpan(Span span, Long endTime); + + void dispose(); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextCarrier.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextCarrier.java index 10e2efc1d..a8fb8dfb8 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextCarrier.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextCarrier.java @@ -49,12 +49,16 @@ public class ContextCarrier implements Serializable { * @return the serialization string. */ public String serialize() { - return StringUtil.join('|', - this.getTraceSegmentId(), - this.getSpanId() + "", - this.getApplicationCode(), - this.getPeerHost(), - this.serializeDistributedTraceIds()); + if (this.isValid()) { + return StringUtil.join('|', + this.getTraceSegmentId(), + this.getSpanId() + "", + this.getApplicationCode(), + this.getPeerHost(), + this.serializeDistributedTraceIds()); + } else { + return ""; + } } /** 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 157c2fb9a..72db942bb 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 @@ -17,7 +17,7 @@ import org.skywalking.apm.agent.core.context.trace.TraceSegment; * * @author wusheng */ -public class ContextManager implements TracerContextListener, BootService { +public class ContextManager implements TracerContextListener, BootService, IgnoreTracerContextListener { private static ThreadLocal CONTEXT = new ThreadLocal(); private static AbstractTracerContext get() { @@ -75,21 +75,18 @@ public class ContextManager implements TracerContextListener, BootService { return get().activeSpan(); } - public static void stopSpan(Span span) { - get().stopSpan(span); - } - public static void stopSpan(Long endTime) { get().stopSpan(activeSpan(), endTime); } public static void stopSpan() { - stopSpan(activeSpan()); + get().stopSpan(activeSpan()); } @Override public void bootUp() { TracerContext.ListenerManager.add(this); + IgnoreTracerContext.ListenerManager.add(this); } @Override @@ -97,13 +94,23 @@ public class ContextManager implements TracerContextListener, BootService { CONTEXT.remove(); } + @Override + public void afterFinished(IgnoreTracerContext traceSegment) { + CONTEXT.remove(); + } + /** - * The ContextSwitcher gives the chance to switch {@link AbstractTracerContext} in {@link #CONTEXT}. + * The ContextSwitcher gives the chance to switch {@link AbstractTracerContext} in {@link #CONTEXT}, + * for ignore, sampling, and analytic trace. */ - enum ContextSwitcher { + public enum ContextSwitcher { INSTANCE; - void toNew(AbstractTracerContext context) { + public void toNew(AbstractTracerContext context) { + AbstractTracerContext existedContext = CONTEXT.get(); + if (existedContext != null) { + existedContext.dispose(); + } CONTEXT.set(context); } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoreTracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoreTracerContext.java new file mode 100644 index 000000000..9d5878667 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoreTracerContext.java @@ -0,0 +1,104 @@ +package org.skywalking.apm.agent.core.context; + +import java.util.LinkedList; +import java.util.List; +import org.skywalking.apm.agent.core.context.trace.Span; + +/** + * The IgnoreTracerContext represent a context should be ignored. + * So it just maintains the stack with integer depth. + * All operations through this IgnoreTracerContext will be ignored, with low gc cost. + * + * TODO: Can't return null span + * + * @author wusheng + */ +public class IgnoreTracerContext implements AbstractTracerContext { + private int stackDepth; + + public IgnoreTracerContext(int initStackDepth) { + this.stackDepth = initStackDepth; + } + + @Override + public void inject(ContextCarrier carrier) { + + } + + @Override + public void extract(ContextCarrier carrier) { + + } + + @Override + public String getGlobalTraceId() { + return "[Ignored Trace]"; + } + + @Override + public Span createSpan(String operationName, boolean isLeaf) { + stackDepth++; + return null; + } + + @Override + public Span createSpan(String operationName, long startTime, boolean isLeaf) { + return createSpan(operationName, isLeaf); + } + + @Override + public Span activeSpan() { + return null; + } + + @Override + public void stopSpan(Span span) { + stackDepth--; + if (stackDepth == 0) { + + } + } + + @Override + public void stopSpan(Span span, Long endTime) { + stopSpan(span); + } + + @Override + public void dispose() { + + } + + public static class ListenerManager { + private static List LISTENERS = new LinkedList(); + + /** + * Add the given {@link IgnoreTracerContextListener} to {@link #LISTENERS} list. + * + * @param listener the new listener. + */ + public static synchronized void add(IgnoreTracerContextListener listener) { + LISTENERS.add(listener); + } + + /** + * Notify the {@link IgnoreTracerContext.ListenerManager} about the given {@link IgnoreTracerContext} have + * finished. And trigger {@link IgnoreTracerContext.ListenerManager} to notify all {@link #LISTENERS} 's {@link + * IgnoreTracerContextListener#afterFinished(IgnoreTracerContext)} + * + * @param ignoreTracerContext + */ + static void notifyFinish(IgnoreTracerContext ignoreTracerContext) { + for (IgnoreTracerContextListener listener : LISTENERS) { + listener.afterFinished(ignoreTracerContext); + } + } + + /** + * Clear the given {@link IgnoreTracerContextListener} + */ + public static synchronized void remove(IgnoreTracerContextListener listener) { + LISTENERS.remove(listener); + } + } +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoreTracerContextListener.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoreTracerContextListener.java new file mode 100644 index 000000000..dba27d026 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/IgnoreTracerContextListener.java @@ -0,0 +1,9 @@ +package org.skywalking.apm.agent.core.context; + + +/** + * @author wusheng + */ +public interface IgnoreTracerContextListener { + void afterFinished(IgnoreTracerContext traceSegment); +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracerContext.java index 1c183e93d..48d086602 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracerContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracerContext.java @@ -126,6 +126,12 @@ public final class TracerContext implements AbstractTracerContext { } } + @Override + public void dispose() { + this.segment = null; + this.activeSpanStack = null; + } + /** * Finish this context, and notify all {@link TracerContextListener}s, managed by {@link ListenerManager} */ diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/Span.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/Span.java index a3dd660d8..d194c609a 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/Span.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/Span.java @@ -14,6 +14,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import org.skywalking.apm.agent.core.conf.Config; +import org.skywalking.apm.agent.core.context.ContextManager; +import org.skywalking.apm.agent.core.context.IgnoreTracerContext; import org.skywalking.apm.agent.core.context.tag.BooleanTagItem; import org.skywalking.apm.agent.core.context.tag.IntTagItem; import org.skywalking.apm.agent.core.context.tag.StringTagItem; @@ -199,7 +201,7 @@ public class Span { if (operationName != null) { int suffixIdx = operationName.lastIndexOf("."); if (suffixIdx > -1 && Config.Agent.IGNORE_SUFFIX.contains(operationName.substring(suffixIdx))) { - + ContextManager.ContextSwitcher.INSTANCE.toNew(new IgnoreTracerContext(1)); } } }