This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch zipkin in repository https://gitbox.apache.org/repos/asf/skywalking.git
The following commit(s) were added to refs/heads/zipkin by this push: new edebf0e Set up across thread test. edebf0e is described below commit edebf0eba09cfd3c0c5d02dd7eee0421216fbbe3 Author: Wu Sheng <wu.sh...@foxmail.com> AuthorDate: Mon Jul 20 09:49:16 2020 +0800 Set up across thread test. --- .../apm/agent/core/context/ContextSnapshot.java | 2 ++ .../reporter/zipkin/ZipkinTracerContext.java | 23 +++++++++++++ .../plugin/reporter/zipkin/ContextManageTest.java | 39 ++++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java index 8031b4e..74507da 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java @@ -21,6 +21,7 @@ package org.apache.skywalking.apm.agent.core.context; import java.util.HashMap; import java.util.Map; import lombok.Getter; +import lombok.Setter; import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId; /** @@ -29,6 +30,7 @@ import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId; */ public class ContextSnapshot { @Getter + @Setter private PrimaryContextSnapshot primaryContextSnapshot; @Getter private CorrelationContext correlationContext; diff --git a/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/main/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracerContext.java b/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/main/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracerContext.java index cee544c..9576145 100644 --- a/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/main/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracerContext.java +++ b/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/main/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracerContext.java @@ -30,6 +30,7 @@ import org.apache.skywalking.apm.agent.core.context.AsyncSpan; import org.apache.skywalking.apm.agent.core.context.ContextCarrier; import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; import org.apache.skywalking.apm.agent.core.context.CorrelationContext; +import org.apache.skywalking.apm.agent.core.context.PrimaryContextSnapshot; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; /** @@ -90,6 +91,7 @@ public class ZipkinTracerContext implements AbstractTracerContext { public ContextSnapshot capture() { final TraceContext traceContext = tracing.currentTraceContext().get(); ContextSnapshot contextSnapshot = new ContextSnapshot(correlationContext); + contextSnapshot.setPrimaryContextSnapshot(ZipkinMockPrimaryContextSnapshot.INSTANCE); contextSnapshot.addCustomContext(B3_ACROSS_THREAD, traceContext); return contextSnapshot; } @@ -179,4 +181,25 @@ public class ZipkinTracerContext implements AbstractTracerContext { } return zipkinSpan; } + + /** + * Mock Primary Context Snapshot is just a place holder for adopting SkyWalking kernel across thread propagation. + */ + private static class ZipkinMockPrimaryContextSnapshot extends PrimaryContextSnapshot { + private static ZipkinMockPrimaryContextSnapshot INSTANCE = new ZipkinMockPrimaryContextSnapshot(); + + private ZipkinMockPrimaryContextSnapshot() { + super(null, null, 0, null); + } + + @Override + public boolean isFromCurrent() { + return false; + } + + @Override + public boolean isValid() { + return true; + } + } } diff --git a/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ContextManageTest.java b/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ContextManageTest.java index 6b38566..3f8b14c 100644 --- a/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ContextManageTest.java +++ b/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ContextManageTest.java @@ -22,12 +22,14 @@ import java.util.List; import org.apache.skywalking.apm.agent.core.boot.ServiceManager; import org.apache.skywalking.apm.agent.core.context.ContextCarrier; import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; import zipkin2.Span; +import static org.apache.skywalking.apm.plugin.reporter.zipkin.ZipkinTracerContext.B3_ACROSS_THREAD; import static org.apache.skywalking.apm.plugin.reporter.zipkin.ZipkinTracerContext.B3_NAME_SAMPLED; import static org.apache.skywalking.apm.plugin.reporter.zipkin.ZipkinTracerContext.B3_NAME_SPAN_ID; import static org.apache.skywalking.apm.plugin.reporter.zipkin.ZipkinTracerContext.B3_NAME_TRACE_ID; @@ -76,5 +78,42 @@ public class ContextManageTest extends ZipkinTest { Assert.assertEquals("/rpc-client", spans.get(0).name()); Assert.assertEquals(zipkin2.Span.Kind.SERVER, spans.get(2).kind()); Assert.assertEquals("/rpc-server", spans.get(2).name()); + Assert.assertEquals(spans.get(0).id(), spans.get(2).parentId()); + } + + @Test + public void testAcrossThread() { + ContextManager.createLocalSpan("local async method"); + final ContextSnapshot contextSnapshot = ContextManager.capture(); + ContextManager.stopSpan(); + + List<List<Span>> traces = readTracesUntilTimeout(10, 1, 1); + Assert.assertEquals(1, traces.size()); + + Assert.assertNotNull(contextSnapshot.readCustomContext(B3_ACROSS_THREAD)); + + Thread newThread = new Thread(new Runnable() { + @Override + public void run() { + ContextManager.createLocalSpan("async execution"); + ContextManager.continued(contextSnapshot); + ContextManager.stopSpan(); + } + }); + newThread.start(); + + traces = readTracesUntilTimeout(10, 1, 2); + + Assert.assertEquals(1, traces.size()); + final List<Span> spans = traces.get(0); + Assert.assertEquals("local async method", spans.get(0).name()); + // Fail, + // Expected :b04359559a2ccdb1 + // Actual :null + // Assert.assertEquals(spans.get(0).id(), spans.get(1).parentId()); + // Fail + // Expected :async execution + // Actual :null + // Assert.assertEquals("async execution", spans.get(1).name()); } }