Commit f2fb5ca9 authored by 吴晟's avatar 吴晟
Browse files

Add new extract method.

parent 0a7369b2
Loading
Loading
Loading
Loading
+25 −7
Original line number Diff line number Diff line
@@ -87,12 +87,19 @@ 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) {
    public void ref(TraceSegmentRef refSegment, boolean primaryOnly) {
        if(primaryOnly){
            if (primaryRef == null) {
                primaryRef = refSegment;
            }
        }else {
            if (primaryRef == null) {
                primaryRef = refSegment;
            } else {
@@ -102,6 +109,17 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
                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,
+6 −6
Original line number Diff line number Diff line
@@ -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);
+19 −1
Original line number Diff line number Diff line
@@ -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;
    }

    /**