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

Add new extract method.

上级 0a7369b2
......@@ -87,22 +87,40 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
/**
* Establish the link between this segment and its parents.
* When {@param primaryOnly} is true;
* The first time, you {@link #ref(TraceSegmentRef)} to parent, it is affirmed as {@link #primaryRef}.
* And others are affirmed as {@link #refs}.
*
* @param refSegment {@link TraceSegmentRef}
* @param primaryOnly if true, set {@param refSegment} to {@link #primaryRef} only.
*/
public void ref(TraceSegmentRef refSegment) {
if (primaryRef == null) {
primaryRef = refSegment;
} else {
if (refs == null) {
refs = new LinkedList<TraceSegmentRef>();
public void ref(TraceSegmentRef refSegment, boolean primaryOnly) {
if(primaryOnly){
if (primaryRef == null) {
primaryRef = refSegment;
}
}else {
if (primaryRef == null) {
primaryRef = refSegment;
} else {
if (refs == null) {
refs = new LinkedList<TraceSegmentRef>();
}
refs.add(refSegment);
}
refs.add(refSegment);
}
}
/**
* Set to {@link #primaryRef} only,
* based on {@link #ref(TraceSegmentRef, boolean)}
*
* @param refSegment {@link TraceSegmentRef}
*/
public void ref(TraceSegmentRef refSegment){
ref(refSegment, true);
}
/**
* After {@link Span} is finished, as be controller by "skywalking-api" module,
* notify the {@link TraceSegment} to archive it.
......
......@@ -24,17 +24,17 @@ public class TraceSegmentTestCase {
TraceSegmentRef ref1 = new TraceSegmentRef();
ref1.setTraceSegmentId("parent_trace_0");
ref1.setSpanId(1);
segment.ref(ref1);
segment.ref(ref1, false);
TraceSegmentRef ref2 = new TraceSegmentRef();
ref2.setTraceSegmentId("parent_trace_1");
ref2.setSpanId(5);
segment.ref(ref2);
segment.ref(ref2, false);
TraceSegmentRef ref3 = new TraceSegmentRef();
ref3.setTraceSegmentId("parent_trace_1");
ref3.setSpanId(5);
segment.ref(ref3);
segment.ref(ref3, false);
Assert.assertEquals(ref1, segment.getPrimaryRef());
Assert.assertEquals(ref2, segment.getRefs().get(0));
......@@ -75,21 +75,21 @@ public class TraceSegmentTestCase {
ref1.setSpanId(1);
ref1.setApplicationCode("REMOTE_APP");
ref1.setPeerHost("10.2.3.16:8080");
segment.ref(ref1);
segment.ref(ref1, false);
TraceSegmentRef ref2 = new TraceSegmentRef();
ref2.setTraceSegmentId("parent_trace_1");
ref2.setSpanId(5);
ref2.setApplicationCode("REMOTE_APP");
ref2.setPeerHost("10.2.3.16:8080");
segment.ref(ref2);
segment.ref(ref2, false);
TraceSegmentRef ref3 = new TraceSegmentRef();
ref3.setTraceSegmentId("parent_trace_1");
ref3.setSpanId(5);
ref3.setApplicationCode("REMOTE_APP");
ref3.setPeerHost("10.2.3.16:8080");
segment.ref(ref3);
segment.ref(ref3, false);
Span span1 = new Span(1, "/serviceA");
Tags.SPAN_LAYER.asHttp(span1);
......
......@@ -135,12 +135,30 @@ public final class TracerContext {
* ContextCarrier#deserialize(String)} called.
*/
public void extract(ContextCarrier carrier) {
if(carrier.isValid()) {
this.segment.ref(getRef(carrier));
}
}
/**
* Ref this {@link ContextCarrier} to this {@link TraceSegment}, and support multi-extract for supporting batch process, like MQ.
*
* @param carrier holds the snapshot, if get this {@link ContextCarrier} from remote, make sure {@link
* ContextCarrier#deserialize(String)} called.
*/
public void multiExtract(ContextCarrier carrier){
if(carrier.isValid()) {
this.segment.ref(getRef(carrier), false);
}
}
private TraceSegmentRef getRef(ContextCarrier carrier){
TraceSegmentRef ref = new TraceSegmentRef();
ref.setTraceSegmentId(carrier.getTraceSegmentId());
ref.setSpanId(carrier.getSpanId());
ref.setApplicationCode(carrier.getApplicationCode());
ref.setPeerHost(carrier.getPeerHost());
this.segment.ref(ref);
return ref;
}
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册