diff --git a/skywalking-sniffer/skywalking-sniffer-mock/pom.xml b/skywalking-sniffer/skywalking-sniffer-mock/pom.xml index b18693f11..0c9310acf 100644 --- a/skywalking-sniffer/skywalking-sniffer-mock/pom.xml +++ b/skywalking-sniffer/skywalking-sniffer-mock/pom.xml @@ -9,7 +9,7 @@ 4.0.0 skywalking-sniffer-mock - This is a sniffer mock module, test for test-dependency, only. + This is a sniffer mock module. Simulate a sniffer, assemble one or more trace segments. Test-dependency, only. 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 f13b49a8f..3407ec21d 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 @@ -2,9 +2,11 @@ package com.a.eye.skywalking.sniffer.mock.trace; 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.DubboServerMysqlTraceBuilder; 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.sniffer.mock.trace.builders.trace.TomcatDubboClientTraceBuilder; import com.a.eye.skywalking.trace.TraceSegment; /** @@ -19,7 +21,6 @@ public enum TraceSegmentBuilderFactory { /** * @see {@link SingleTomcat200TraceBuilder} * - * @return */ public TraceSegment singleTomcat200Trace(){ return this.build(SingleTomcat200TraceBuilder.INSTANCE); @@ -28,7 +29,6 @@ public enum TraceSegmentBuilderFactory { /** * @see {@link SingleTomcat404TraceBuilder} * - * @return */ public TraceSegment singleTomcat404Trace(){ return this.build(SingleTomcat404TraceBuilder.INSTANCE); @@ -37,12 +37,25 @@ public enum TraceSegmentBuilderFactory { /** * @see {@link SingleTomcat500TraceBuilder} * - * @return */ public TraceSegment singleTomcat500Trace(){ return this.build(SingleTomcat500TraceBuilder.INSTANCE); } + /** + * @see {@link TomcatDubboClientTraceBuilder} + */ + public TraceSegment traceOf_Tomcat_DubboClient(){ + return this.build(TomcatDubboClientTraceBuilder.INSTANCE); + } + + /** + * @see {@link DubboServerMysqlTraceBuilder} + */ + public TraceSegment traceOf_DubboServer_MySQL() { + return this.build(DubboServerMysqlTraceBuilder.INSTANCE); + } + private TraceSegment build(TraceSegmentBuilder builder){ MockTracerContextListener listener = new MockTracerContextListener(); try{ diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/DubboSpanGenerator.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/DubboSpanGenerator.java new file mode 100644 index 000000000..fdba25e7a --- /dev/null +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/DubboSpanGenerator.java @@ -0,0 +1,44 @@ +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 DubboSpanGenerator generates all possible spans, by tracing Dubbo rpc. + * Including client/server side span. + * + * @author wusheng + */ +public class DubboSpanGenerator { + public static class Client extends SpanGeneration{ + @Override protected void before() { + Span span = ContextManager.INSTANCE.createSpan("/default_rpc/com.a.eye.skywalking.test.persistence.PersistenceService.query"); + Tags.COMPONENT.set(span, "Dubbo"); + Tags.URL.set(span, "rest://192.168.1.8:20880/default_rpc/com.a.eye.skywalking.test.persistence.PersistenceService.query(String)"); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER); + Tags.PEER_HOST.set(span, "192.168.1.8"); + Tags.PEER_PORT.set(span, 20880); + Tags.SPAN_LAYER.asHttp(span); + } + + @Override protected void after() { + ContextManager.INSTANCE.stopSpan(); + } + } + + public static class Server extends SpanGeneration{ + @Override protected void before() { + Span span = ContextManager.INSTANCE.createSpan("/default_rpc/com.a.eye.skywalking.test.persistence.PersistenceService.query"); + Tags.COMPONENT.set(span, "Dubbo"); + Tags.URL.set(span, "rest://192.168.1.8:20880/default_rpc/com.a.eye.skywalking.test.persistence.PersistenceService.query(String)"); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); + Tags.PEER_HOST.set(span, "10.21.9.35"); + Tags.SPAN_LAYER.asHttp(span); + } + + @Override protected void after() { + ContextManager.INSTANCE.stopSpan(); + } + } +} diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/MySQLGenerator.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/MySQLGenerator.java new file mode 100644 index 000000000..78097f919 --- /dev/null +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/MySQLGenerator.java @@ -0,0 +1,30 @@ +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 MySQLGenerator generates all possible spans, by tracing mysql client access. + * + * @author wusheng + */ +public class MySQLGenerator { + public static class Query extends SpanGeneration { + @Override protected void before() { + Span span = ContextManager.INSTANCE.createSpan("mysql/jdbi/statement/executeQuery"); + Tags.COMPONENT.set(span, "Mysql"); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); + Tags.PEER_HOST.set(span, "10.5.34.18"); + Tags.PEER_PORT.set(span, 30088); + Tags.DB_INSTANCE.set(span, "mysql-instance"); + Tags.DB_STATEMENT.set(span, "select * from users where user_id = 1"); + Tags.DB_TYPE.set(span, "sql"); + Tags.SPAN_LAYER.asDB(span); + } + + @Override protected void after() { + ContextManager.INSTANCE.stopSpan(); + } + } +} diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/SpanGeneration.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/SpanGeneration.java index 099c7469b..e148a3de0 100644 --- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/SpanGeneration.java +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/SpanGeneration.java @@ -1,18 +1,20 @@ package com.a.eye.skywalking.sniffer.mock.trace.builders.span; /** - * Created by wusheng on 2017/2/28. + * The SpanGeneration implementations can generate several kinds of spans. + * + * @author wusheng */ public abstract class SpanGeneration { - private SpanGeneration next; + private SpanGeneration[] next; public SpanGeneration build(SpanGeneration next){ - this.next = next; + this.next = new SpanGeneration[]{next}; return next; } - public SpanGeneration build(){ - return this; + public void build(SpanGeneration... next){ + this.next = next; } protected abstract void before(); @@ -22,7 +24,9 @@ public abstract class SpanGeneration { public void generate(){ this.before(); if(next != null){ - next.generate(); + for (SpanGeneration generation : next) { + generation.generate(); + } } this.after(); } 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 index 78b69ed56..5a37ba71f 100644 --- 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 @@ -15,9 +15,12 @@ public class TomcatSpanGenerator{ @Override protected void before() { Span webSpan = ContextManager.INSTANCE.createSpan("/web/serviceA"); - Tags.COMPONENT.set(webSpan, "tomcat"); + 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.PEER_HOST.set(webSpan, "10.21.9.35"); + Tags.PEER_PORT.set(webSpan, 80); + Tags.SPAN_LAYER.asHttp(webSpan); } @Override protected void after() { @@ -32,9 +35,12 @@ public class TomcatSpanGenerator{ @Override protected void before() { Span webSpan = ContextManager.INSTANCE.createSpan("/web/service/unknown"); - Tags.COMPONENT.set(webSpan, "tomcat"); + 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.PEER_HOST.set(webSpan, "10.21.9.35"); + Tags.PEER_PORT.set(webSpan, 80); + Tags.SPAN_LAYER.asHttp(webSpan); } @Override protected void after() { @@ -49,9 +55,12 @@ public class TomcatSpanGenerator{ @Override protected void before() { Span webSpan = ContextManager.INSTANCE.createSpan("/web/error/service"); - Tags.COMPONENT.set(webSpan, "tomcat"); + 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.PEER_HOST.set(webSpan, "10.21.9.35"); + Tags.PEER_PORT.set(webSpan, 80); + Tags.SPAN_LAYER.asHttp(webSpan); } @Override protected void after() { diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/DubboServerMysqlTraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/DubboServerMysqlTraceBuilder.java new file mode 100644 index 000000000..c5f14b58d --- /dev/null +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/DubboServerMysqlTraceBuilder.java @@ -0,0 +1,21 @@ +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.DubboSpanGenerator; +import com.a.eye.skywalking.sniffer.mock.trace.builders.span.MySQLGenerator; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * @author wusheng + */ +public enum DubboServerMysqlTraceBuilder implements TraceSegmentBuilder { + INSTANCE; + + @Override public TraceSegment build(MockTracerContextListener listener) { + DubboSpanGenerator.Server rootSpan = new DubboSpanGenerator.Server(); + rootSpan.build(new MySQLGenerator.Query()); + rootSpan.generate(); + return listener.getFinished(0); + } +} 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 index 5b827f701..56b227417 100644 --- 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 @@ -14,7 +14,7 @@ public enum SingleTomcat200TraceBuilder implements TraceSegmentBuilder { INSTANCE; @Override public TraceSegment build(MockTracerContextListener listener) { - TomcatSpanGenerator.ON200.INSTANCE.build().generate(); + TomcatSpanGenerator.ON200.INSTANCE.generate(); 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 index 6000fb1b6..d1998e100 100644 --- 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 @@ -14,7 +14,7 @@ public enum SingleTomcat404TraceBuilder implements TraceSegmentBuilder { INSTANCE; @Override public TraceSegment build(MockTracerContextListener listener) { - TomcatSpanGenerator.ON404.INSTANCE.build().generate(); + TomcatSpanGenerator.ON404.INSTANCE.generate(); 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 index 5251f45f9..2f7d8ec92 100644 --- 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 @@ -14,7 +14,7 @@ public enum SingleTomcat500TraceBuilder implements TraceSegmentBuilder { INSTANCE; @Override public TraceSegment build(MockTracerContextListener listener) { - TomcatSpanGenerator.ON500.INSTANCE.build().generate(); + TomcatSpanGenerator.ON500.INSTANCE.generate(); return listener.getFinished(0); } } diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/TomcatDubboClientTraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/TomcatDubboClientTraceBuilder.java new file mode 100644 index 000000000..8ce8b718b --- /dev/null +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/TomcatDubboClientTraceBuilder.java @@ -0,0 +1,25 @@ +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.DubboSpanGenerator; +import com.a.eye.skywalking.sniffer.mock.trace.builders.span.TomcatSpanGenerator; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * A Trace segment contains two spans with ChildOf relations, + * the parent is a Tomcat span, + * the child is a Dubbo client span. + * + * @author wusheng + */ +public enum TomcatDubboClientTraceBuilder implements TraceSegmentBuilder { + INSTANCE; + + @Override public TraceSegment build(MockTracerContextListener listener) { + TomcatSpanGenerator.ON200 rootSpan = new TomcatSpanGenerator.ON200(); + rootSpan.build(new DubboSpanGenerator.Client()); + rootSpan.generate(); + return listener.getFinished(0); + } +} diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/test/java/com/a/eye/skywalking/sniffer/mock/MockTracerContextListenerTestCase.java b/skywalking-sniffer/skywalking-sniffer-mock/src/test/java/com/a/eye/skywalking/sniffer/mock/MockTracerContextListenerTestCase.java index ce43770c8..83f1d34b4 100644 --- a/skywalking-sniffer/skywalking-sniffer-mock/src/test/java/com/a/eye/skywalking/sniffer/mock/MockTracerContextListenerTestCase.java +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/test/java/com/a/eye/skywalking/sniffer/mock/MockTracerContextListenerTestCase.java @@ -49,4 +49,18 @@ public class MockTracerContextListenerTestCase { listener.clear(); listener.assertValidIndex(0); } + + @Test + public void testTraceOf_Tomcat_DubboClient(){ + TraceSegment segment = TraceSegmentBuilderFactory.INSTANCE.traceOf_Tomcat_DubboClient(); + + Assert.assertEquals(2, segment.getSpans().size()); + } + + @Test + public void testTraceOf_DubboServer_MySQL(){ + TraceSegment segment = TraceSegmentBuilderFactory.INSTANCE.traceOf_DubboServer_MySQL(); + + Assert.assertEquals(2, segment.getSpans().size()); + } }