提交 edebf0eb 编写于 作者: wu-sheng's avatar wu-sheng

Set up across thread test.

上级 9e150493
......@@ -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;
......
......@@ -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;
}
}
}
......@@ -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());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册