You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2020/07/14 15:40:43 UTC

[skywalking] branch zipkin updated: Finish first test case.

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 b8afa31  Finish first test case.
b8afa31 is described below

commit b8afa312af5d3ee77fedb72572ca46954c8f4d4a
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue Jul 14 23:40:21 2020 +0800

    Finish first test case.
---
 .../reporter/zipkin/ZipkinTracerContext.java       | 11 ++++-
 .../{ZipkinTracingTest.java => ZipkinTest.java}    | 38 +++++-----------
 ...acingTest.java => ZipkinTracerContextTest.java} | 51 +++++++---------------
 3 files changed, 37 insertions(+), 63 deletions(-)

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 00743e0..3ba06f0 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
@@ -34,6 +34,12 @@ import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
 
 /**
  * ZipkinTracerContext is an API wrapper of Zipkin tracer.
+ *
+ * Same as SkyWalking, Zipkin traceContext is controlled automatically through stack push/pop. Once all created spans
+ * finished, the tracer context closed automatically too.
+ *
+ * Span finished means {@link #stopSpan(AbstractSpan)} called, even in async case, Zipkin span is still alive, and
+ * waiting for {@link #asyncStop(AsyncSpan)}.
  */
 public class ZipkinTracerContext implements AbstractTracerContext {
     private static String B3_NAME = "b3";
@@ -129,7 +135,7 @@ public class ZipkinTracerContext implements AbstractTracerContext {
         if (!zipkinSpan.isAsync()) {
             zipkinSpan.stop();
         }
-        runningSpans.remove(span);
+        runningSpans.remove(zipkinSpan.getSpan());
         boolean isContextFinished = runningSpans.isEmpty();
         if (isContextFinished) {
             currentTraceContext.clear();
@@ -158,8 +164,9 @@ public class ZipkinTracerContext implements AbstractTracerContext {
             zipkinSpan = new ZipkinSpan(span);
             final ZipkinSpan prevValue = runningSpans.putIfAbsent(span, zipkinSpan);
             if (prevValue != null) {
-                zipkinSpan = prevValue;
+                throw new IllegalStateException("No concurrency access for span creation");
             }
+            currentTraceContext.maybeScope(span.context());
         }
         return zipkinSpan;
     }
diff --git a/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracingTest.java b/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTest.java
similarity index 58%
copy from apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracingTest.java
copy to apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTest.java
index cb53d1a..e66086b 100644
--- a/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracingTest.java
+++ b/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTest.java
@@ -20,18 +20,14 @@ package org.apache.skywalking.apm.plugin.reporter.zipkin;
 
 import java.util.List;
 import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.agent.core.context.AbstractTracerContext;
-import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
-import org.junit.Test;
-import org.powermock.reflect.Whitebox;
 import zipkin2.Span;
 import zipkin2.junit.ZipkinRule;
 
-public class ZipkinTracingTest {
+public class ZipkinTest {
     @Rule
     public ZipkinRule zipkin = new ZipkinRule();
 
@@ -47,28 +43,18 @@ public class ZipkinTracingTest {
         Config.Agent.SERVICE_NAME = null;
     }
 
-    @Test
-    public void zipkinTracerRunning() throws Exception {
-        final ZipkinTraceReporter zipkinTraceReporter = new ZipkinTraceReporter();
-        zipkinTraceReporter.boot();
-
-        ZipkinContextManager manager = new ZipkinContextManager();
-        Whitebox.setInternalState(manager, "zipkinTraceReporter", zipkinTraceReporter);
-        final AbstractTracerContext traceContext = manager.createTraceContext("/span1", true);
-        Assert.assertTrue(traceContext instanceof ZipkinTracerContext);
-
-        final AbstractSpan span1 = traceContext.createEntrySpan("span1");
-        final AbstractSpan span2 = traceContext.createLocalSpan("span2");
-        final AbstractSpan span3 = traceContext.createExitSpan("span3", "127.0.0.1:8080");
-
-        traceContext.stopSpan(span3);
-        traceContext.stopSpan(span2);
-        traceContext.stopSpan(span1);
-
+    /**
+     * @param time * 2s = Max wait time
+     * @return traces
+     */
+    protected List<List<Span>> readTracesUntilTimeout(int time) {
         List<List<Span>> traces = null;
         boolean received = false;
-        for (int i = 10; i >= 0; i--) {
-            Thread.sleep(2000L);
+        for (int i = time; i >= 0; i--) {
+            try {
+                Thread.sleep(2000L);
+            } catch (InterruptedException e) {
+            }
             traces = zipkin.getTraces();
             if (traces.size() > 0) {
                 received = true;
@@ -77,6 +63,6 @@ public class ZipkinTracingTest {
         }
 
         Assert.assertTrue(received);
-        Assert.assertEquals(1, traces.size());
+        return traces;
     }
 }
diff --git a/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracingTest.java b/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracerContextTest.java
similarity index 67%
rename from apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracingTest.java
rename to apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracerContextTest.java
index cb53d1a..b187ffb 100644
--- a/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracingTest.java
+++ b/apm-sniffer/optional-reporter-plugins/zipkin-reporter-plugin/src/test/java/org/apache/skywalking/apm/plugin/reporter/zipkin/ZipkinTracerContextTest.java
@@ -19,36 +19,16 @@
 package org.apache.skywalking.apm.plugin.reporter.zipkin;
 
 import java.util.List;
-import org.apache.skywalking.apm.agent.core.conf.Config;
 import org.apache.skywalking.apm.agent.core.context.AbstractTracerContext;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
-import org.junit.After;
 import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
 import org.powermock.reflect.Whitebox;
 import zipkin2.Span;
-import zipkin2.junit.ZipkinRule;
-
-public class ZipkinTracingTest {
-    @Rule
-    public ZipkinRule zipkin = new ZipkinRule();
-
-    @Before
-    public void setup() {
-        Config.Collector.BACKEND_SERVICE = zipkin.httpUrl() + "/api/v2/spans";
-        Config.Agent.SERVICE_NAME = "Zipkin-Core";
-    }
-
-    @After
-    public void clean() {
-        Config.Collector.BACKEND_SERVICE = null;
-        Config.Agent.SERVICE_NAME = null;
-    }
 
+public class ZipkinTracerContextTest extends ZipkinTest {
     @Test
-    public void zipkinTracerRunning() throws Exception {
+    public void testContextIsolationInThread() {
         final ZipkinTraceReporter zipkinTraceReporter = new ZipkinTraceReporter();
         zipkinTraceReporter.boot();
 
@@ -60,23 +40,24 @@ public class ZipkinTracingTest {
         final AbstractSpan span1 = traceContext.createEntrySpan("span1");
         final AbstractSpan span2 = traceContext.createLocalSpan("span2");
         final AbstractSpan span3 = traceContext.createExitSpan("span3", "127.0.0.1:8080");
-
         traceContext.stopSpan(span3);
         traceContext.stopSpan(span2);
         traceContext.stopSpan(span1);
 
-        List<List<Span>> traces = null;
-        boolean received = false;
-        for (int i = 10; i >= 0; i--) {
-            Thread.sleep(2000L);
-            traces = zipkin.getTraces();
-            if (traces.size() > 0) {
-                received = true;
-                break;
-            }
-        }
-
-        Assert.assertTrue(received);
+        List<List<Span>> traces = readTracesUntilTimeout(10);
         Assert.assertEquals(1, traces.size());
+        List<Span> spans = traces.get(0);
+        Assert.assertEquals(3, spans.size());
+        Assert.assertEquals("span3", spans.get(0).name());
+
+        // Scope should be clear automatically in traceContext#stopSpan.
+        final AbstractSpan span4 = traceContext.createEntrySpan("span4");
+        traceContext.stopSpan(span4);
+
+        traces = readTracesUntilTimeout(10);
+        Assert.assertEquals(2, traces.size());
+        spans = traces.get(1);
+        Assert.assertEquals(1, spans.size());
+        Assert.assertEquals("span4", spans.get(0).name());
     }
 }