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);
+ }
+}