From 96f6c5fad94e57d2dec30ae7090bf5eaae8c64f8 Mon Sep 17 00:00:00 2001 From: wusheng Date: Mon, 20 Feb 2017 23:34:34 +0800 Subject: [PATCH] Add Tomcat span, and singleTrace mock. --- .../skywalking/api/context/TracerContext.java | 2 +- .../context/MockTracerContextListener.java | 10 ++++ .../mock/trace/TraceSegmentBuilder.java | 3 +- .../trace/TraceSegmentBuilderFactory.java | 51 ++++++++++++------ .../builders/SingleTomcat200TraceBuilder.java | 27 ---------- .../builders/span/TomcatSpanGenerator.java | 53 +++++++++++++++++++ .../trace/SingleTomcat200TraceBuilder.java | 20 +++++++ .../trace/SingleTomcat404TraceBuilder.java | 20 +++++++ .../trace/SingleTomcat500TraceBuilder.java | 20 +++++++ 9 files changed, 162 insertions(+), 44 deletions(-) delete mode 100644 skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/SingleTomcat200TraceBuilder.java create mode 100644 skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/TomcatSpanGenerator.java create mode 100644 skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat200TraceBuilder.java create mode 100644 skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat404TraceBuilder.java create mode 100644 skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat500TraceBuilder.java diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java index ea8faf001..4ef3d3188 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java @@ -171,7 +171,7 @@ public final class TracerContext { /** * Clear the given {@link TracerContextListener} */ - static synchronized void remove(TracerContextListener listener){ + public static synchronized void remove(TracerContextListener listener){ listeners.remove(listener); } } diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/context/MockTracerContextListener.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/context/MockTracerContextListener.java index ec7e1ccde..a79f80e1a 100644 --- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/context/MockTracerContextListener.java +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/context/MockTracerContextListener.java @@ -48,4 +48,14 @@ public class MockTracerContextListener implements TracerContextListener { public void clear(){ finishedTraceSegments.clear(); } + + /** + * Get {@link TraceSegment} of the given index. + * @param index + * @return + */ + public TraceSegment getFinished(int index){ + assertSize(index + 1); + return finishedTraceSegments.get(index); + } } diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilder.java index 57e48fd19..55743677a 100644 --- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilder.java +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilder.java @@ -1,10 +1,11 @@ package com.a.eye.skywalking.sniffer.mock.trace; +import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; import com.a.eye.skywalking.trace.TraceSegment; /** * Created by wusheng on 2017/2/20. */ public interface TraceSegmentBuilder { - TraceSegment build(); + TraceSegment build(MockTracerContextListener listener); } diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilderFactory.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilderFactory.java index 6714ced0b..f13b49a8f 100644 --- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilderFactory.java +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilderFactory.java @@ -1,9 +1,11 @@ package com.a.eye.skywalking.sniffer.mock.trace; -import com.a.eye.skywalking.sniffer.mock.trace.builders.SingleTomcat200TraceBuilder; +import com.a.eye.skywalking.api.context.TracerContext; +import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; +import com.a.eye.skywalking.sniffer.mock.trace.builders.trace.SingleTomcat200TraceBuilder; +import com.a.eye.skywalking.sniffer.mock.trace.builders.trace.SingleTomcat404TraceBuilder; +import com.a.eye.skywalking.sniffer.mock.trace.builders.trace.SingleTomcat500TraceBuilder; import com.a.eye.skywalking.trace.TraceSegment; -import java.util.HashMap; -import java.util.Map; /** * The TraceSegmentBuilderFactory contains all {@link TraceSegmentBuilder} implementations. @@ -14,22 +16,41 @@ import java.util.Map; public enum TraceSegmentBuilderFactory { INSTANCE; - private Map allBuilders; - - TraceSegmentBuilderFactory(){ - allBuilders = new HashMap(); - initialize(); - } - + /** + * @see {@link SingleTomcat200TraceBuilder} + * + * @return + */ public TraceSegment singleTomcat200Trace(){ - return allBuilders.get(SingleTomcat200TraceBuilder.INSTANCE).build(); + return this.build(SingleTomcat200TraceBuilder.INSTANCE); } - private void initialize(){ - initBuilder(SingleTomcat200TraceBuilder.INSTANCE); + /** + * @see {@link SingleTomcat404TraceBuilder} + * + * @return + */ + public TraceSegment singleTomcat404Trace(){ + return this.build(SingleTomcat404TraceBuilder.INSTANCE); } - private void initBuilder(TraceSegmentBuilder builder){ - allBuilders.put(builder.toString(), builder); + /** + * @see {@link SingleTomcat500TraceBuilder} + * + * @return + */ + public TraceSegment singleTomcat500Trace(){ + return this.build(SingleTomcat500TraceBuilder.INSTANCE); } + + private TraceSegment build(TraceSegmentBuilder builder){ + MockTracerContextListener listener = new MockTracerContextListener(); + try{ + TracerContext.ListenerManager.add(listener); + return builder.build(listener); + }finally{ + TracerContext.ListenerManager.remove(listener); + } + } + } diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/SingleTomcat200TraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/SingleTomcat200TraceBuilder.java deleted file mode 100644 index d84eb8d79..000000000 --- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/SingleTomcat200TraceBuilder.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.a.eye.skywalking.sniffer.mock.trace.builders; - -import com.a.eye.skywalking.api.context.ContextManager; -import com.a.eye.skywalking.sniffer.mock.trace.TraceSegmentBuilder; -import com.a.eye.skywalking.trace.Span; -import com.a.eye.skywalking.trace.TraceSegment; -import com.a.eye.skywalking.trace.tag.Tags; - -/** - * A Trace contains only one span, which represent a tomcat server side span. - * - * Created by wusheng on 2017/2/20. - */ -public enum SingleTomcat200TraceBuilder implements TraceSegmentBuilder { - INSTANCE; - - @Override public TraceSegment build() { - Span webSpan = ContextManager.INSTANCE.createSpan("/web/serviceA"); - { - Tags.COMPONENT.set(webSpan, "tomcat"); - Tags.URL.set(webSpan, "http://10.21.9.35/web/serviceA"); - Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER); - Tags.STATUS_CODE.set(webSpan, 200); - } - return null; - } -} diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/TomcatSpanGenerator.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/TomcatSpanGenerator.java new file mode 100644 index 000000000..c9096cf26 --- /dev/null +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/TomcatSpanGenerator.java @@ -0,0 +1,53 @@ +package com.a.eye.skywalking.sniffer.mock.trace.builders.span; + +import com.a.eye.skywalking.api.context.ContextManager; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.tag.Tags; + +/** + * The TomcatSpanGenerator generate all possible spans, by tracing Tomcat. + * + * Created by wusheng on 2017/2/20. + */ +public enum TomcatSpanGenerator { + INSTANCE; + + /** + * When tomcat response 200. + */ + public void on200(){ + Span webSpan = ContextManager.INSTANCE.createSpan("/web/serviceA"); + Tags.COMPONENT.set(webSpan, "tomcat"); + Tags.URL.set(webSpan, "http://10.21.9.35/web/serviceA"); + Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER); + Tags.STATUS_CODE.set(webSpan, 200); + ContextManager.INSTANCE.stopSpan(webSpan); + } + + /** + * When tomcat response 404. + */ + public void on404(){ + Span webSpan = ContextManager.INSTANCE.createSpan("/web/service/unknown"); + Tags.COMPONENT.set(webSpan, "tomcat"); + Tags.URL.set(webSpan, "http://10.21.9.35/web/unknown"); + Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER); + Tags.STATUS_CODE.set(webSpan, 404); + Tags.ERROR.set(webSpan,true); + ContextManager.INSTANCE.stopSpan(webSpan); + } + + /** + * When tomcat response 500. + */ + public void on500(){ + Span webSpan = ContextManager.INSTANCE.createSpan("/web/error/service"); + Tags.COMPONENT.set(webSpan, "tomcat"); + Tags.URL.set(webSpan, "http://10.21.9.35/web/error/service"); + Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER); + Tags.STATUS_CODE.set(webSpan, 500); + Tags.ERROR.set(webSpan,true); + webSpan.log(new NumberFormatException("Can't convert 'abc' to int.")); + ContextManager.INSTANCE.stopSpan(webSpan); + } +} diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat200TraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat200TraceBuilder.java new file mode 100644 index 000000000..5812b24de --- /dev/null +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat200TraceBuilder.java @@ -0,0 +1,20 @@ +package com.a.eye.skywalking.sniffer.mock.trace.builders.trace; + +import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; +import com.a.eye.skywalking.sniffer.mock.trace.TraceSegmentBuilder; +import com.a.eye.skywalking.sniffer.mock.trace.builders.span.TomcatSpanGenerator; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * A Trace contains only one span, which represent a tomcat server side span. + * + * Created by wusheng on 2017/2/20. + */ +public enum SingleTomcat200TraceBuilder implements TraceSegmentBuilder { + INSTANCE; + + @Override public TraceSegment build(MockTracerContextListener listener) { + TomcatSpanGenerator.INSTANCE.on200(); + return listener.getFinished(0); + } +} diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat404TraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat404TraceBuilder.java new file mode 100644 index 000000000..7ec32e46e --- /dev/null +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat404TraceBuilder.java @@ -0,0 +1,20 @@ +package com.a.eye.skywalking.sniffer.mock.trace.builders.trace; + +import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; +import com.a.eye.skywalking.sniffer.mock.trace.TraceSegmentBuilder; +import com.a.eye.skywalking.sniffer.mock.trace.builders.span.TomcatSpanGenerator; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * A Trace contains only one span, which represent a tomcat server side span. + * + * Created by wusheng on 2017/2/20. + */ +public enum SingleTomcat404TraceBuilder implements TraceSegmentBuilder { + INSTANCE; + + @Override public TraceSegment build(MockTracerContextListener listener) { + TomcatSpanGenerator.INSTANCE.on404(); + return listener.getFinished(0); + } +} diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat500TraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat500TraceBuilder.java new file mode 100644 index 000000000..150c4ab6e --- /dev/null +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat500TraceBuilder.java @@ -0,0 +1,20 @@ +package com.a.eye.skywalking.sniffer.mock.trace.builders.trace; + +import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; +import com.a.eye.skywalking.sniffer.mock.trace.TraceSegmentBuilder; +import com.a.eye.skywalking.sniffer.mock.trace.builders.span.TomcatSpanGenerator; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * A Trace contains only one span, which represent a tomcat server side span. + * + * Created by wusheng on 2017/2/20. + */ +public enum SingleTomcat500TraceBuilder implements TraceSegmentBuilder { + INSTANCE; + + @Override public TraceSegment build(MockTracerContextListener listener) { + TomcatSpanGenerator.INSTANCE.on500(); + return listener.getFinished(0); + } +}