From f2fb5ca9fadb09143b9c5ec144420eca222b5efa Mon Sep 17 00:00:00 2001 From: wusheng Date: Thu, 2 Mar 2017 14:46:51 +0800 Subject: [PATCH] Add new extract method. --- .../a/eye/skywalking/trace/TraceSegment.java | 32 +++++++++++++++---- .../trace/TraceSegmentTestCase.java | 12 +++---- .../skywalking/api/context/TracerContext.java | 20 +++++++++++- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java index c2453fa6e..56b1727d1 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java @@ -87,22 +87,40 @@ public class TraceSegment implements ISerializable { /** * 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(); + 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(); + } + 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. diff --git a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java index 51e6947b9..37a6fac69 100644 --- a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java +++ b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java @@ -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); diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java index 59e220cf2..c723fc3c0 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java @@ -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; } /**