Commit 0d0d9840 authored by 吴晟's avatar 吴晟
Browse files

1. Remove the primary ref. Only use ref to the parent segment.

2. Adjust globalTracerIds
parent dfa0eead
Loading
Loading
Loading
Loading
+22 −58
Original line number Diff line number Diff line
@@ -41,14 +41,8 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
    private long endTime;

    /**
     * The primary ref of the parent trace segment.
     * Use {@link TraceSegmentRef}, we can link this trace segment to the primary parent segment.
     */
    private TraceSegmentRef primaryRef;

    /**
     * The refs of other parent trace segments, except the primary one.
     * For most RPC call, {@link #refs} stay in null,
     * The refs of parent trace segments, except the primary one.
     * For most RPC call, {@link #refs} contains only one element,
     * but if this segment is a start span of batch process, the segment faces multi parents,
     * at this moment, we use this {@link #refs} to link them.
     */
@@ -74,13 +68,13 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
     * element, because only one parent {@link TraceSegment} exists, but, in batch scenario, the num becomes greater
     * than 1, also meaning multi-parents {@link TraceSegment}.
     *
     * The difference between <code>relatedGlobalTraces</code> and {@link #primaryRef}/{@link #refs} is: {@link
     * #primaryRef}/{@link #refs} targets this {@link TraceSegment}'s direct parent,
     * The difference between <code>relatedGlobalTraces</code> and {@link #refs} is:
     * {@link #refs} targets this {@link TraceSegment}'s direct parent,
     *
     * and
     *
     * <code>relatedGlobalTraces</code> targets this {@link TraceSegment}'s related call chain, a call chain contains
     * multi {@link TraceSegment}s, only using {@link #primaryRef}/{@link #refs} is enough for analysis and ui.
     * multi {@link TraceSegment}s, only using {@link #refs} is not enough for analysis and ui.
     */
    private LinkedList<DistributedTraceId> relatedGlobalTraces;

@@ -108,48 +102,27 @@ 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, boolean primaryOnly) {
        if (primaryOnly) {
            if (primaryRef == null) {
                primaryRef = refSegment;
            }
        } else {
            if (primaryRef == null) {
                primaryRef = refSegment;
            } else {
                if (refs == null) {
                    refs = new LinkedList<TraceSegmentRef>();
                }
    public void ref(TraceSegmentRef refSegment) {
        if(!refs.contains(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);
    }

    public void buildRelation(List<DistributedTraceId> distributedTraceIds){
    public void relatedGlobalTraces(List<DistributedTraceId> distributedTraceIds) {
        if (distributedTraceIds == null || distributedTraceIds.size() == 0) {
            return;
        }
        if (relatedGlobalTraces.getFirst() instanceof NewDistributedTraceId) {
            relatedGlobalTraces.removeFirst();
        }
        relatedGlobalTraces.addAll(distributedTraceIds);
        for (DistributedTraceId distributedTraceId : distributedTraceIds) {
            if(!relatedGlobalTraces.contains(distributedTraceId)){
                relatedGlobalTraces.add(distributedTraceId);
            }
        }
    }

    /**
@@ -184,10 +157,6 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
        return endTime;
    }

    public TraceSegmentRef getPrimaryRef() {
        return primaryRef;
    }

    public List<TraceSegmentRef> getRefs() {
        if (refs == null) {
            return null;
@@ -207,13 +176,15 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
        return applicationCode;
    }

    @Override
    public String toString() {
    @Override public String toString() {
        return "TraceSegment{" +
            "traceSegmentId='" + traceSegmentId + '\'' +
            ", startTime=" + startTime +
            ", endTime=" + endTime +
            ", primaryRef=" + primaryRef +
            ", spans.size=" + spans.size() +
            ", refs=" + refs +
            ", spans=" + spans +
            ", applicationCode='" + applicationCode + '\'' +
            ", relatedGlobalTraces=" + relatedGlobalTraces +
            '}';
    }

@@ -224,9 +195,6 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
        segmentBuilder.setStartTime(startTime);
        segmentBuilder.setEndTime(endTime);
        segmentBuilder.setApplicationCode(applicationCode);
        if (primaryRef != null) {
            segmentBuilder.setPrimaryRef(primaryRef.serialize());
        }
        if (refs != null && refs.size() > 0) {
            for (TraceSegmentRef ref : refs) {
                segmentBuilder.addRefs(ref.serialize());
@@ -247,10 +215,6 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
        startTime = message.getStartTime();
        endTime = message.getEndTime();
        applicationCode = message.getApplicationCode();
        SegmentRefMessage messagePrimaryRef = message.getPrimaryRef();
        if (messagePrimaryRef != null) {
            (primaryRef = new TraceSegmentRef()).deserialize(messagePrimaryRef);
        }
        List<SegmentRefMessage> refsList = message.getRefsList();
        if (refsList != null && refsList.size() > 0) {
            this.refs = new LinkedList<TraceSegmentRef>();
+27 −0
Original line number Diff line number Diff line
@@ -97,4 +97,31 @@ public class TraceSegmentRef implements ISerializable<SegmentRefMessage> {
        applicationCode = message.getApplicationCode();
        peerHost = message.getPeerHost();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;

        TraceSegmentRef ref = (TraceSegmentRef)o;

        if (spanId != ref.spanId)
            return false;
        if (traceSegmentId != null ? !traceSegmentId.equals(ref.traceSegmentId) : ref.traceSegmentId != null)
            return false;
        if (applicationCode != null ? !applicationCode.equals(ref.applicationCode) : ref.applicationCode != null)
            return false;
        return peerHost != null ? peerHost.equals(ref.peerHost) : ref.peerHost == null;
    }

    @Override
    public int hashCode() {
        int result = traceSegmentId != null ? traceSegmentId.hashCode() : 0;
        result = 31 * result + spanId;
        result = 31 * result + (applicationCode != null ? applicationCode.hashCode() : 0);
        result = 31 * result + (peerHost != null ? peerHost.hashCode() : 0);
        return result;
    }
}
+3 −4
Original line number Diff line number Diff line
@@ -8,10 +8,9 @@ message SegmentMessage {
    int64 startTime = 2;
    int64 endTime = 3;
    string applicationCode = 4;
    SegmentRefMessage primaryRef = 5;
    repeated SegmentRefMessage refs = 6;
    repeated string relatedTraceIds = 7;
    repeated SpanMessage spans = 8;
    repeated SegmentRefMessage refs = 5;
    repeated string relatedTraceIds = 6;
    repeated SpanMessage spans = 7;
}

message SegmentRefMessage {
+1 −13
Original line number Diff line number Diff line
@@ -137,19 +137,7 @@ public final class TracerContext {
    public void extract(ContextCarrier carrier) {
        if(carrier.isValid()) {
            this.segment.ref(getRef(carrier));
            this.segment.buildRelation(carrier.getDistributedTraceIds());
        }
    }

    /**
     * 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);
            this.segment.relatedGlobalTraces(carrier.getDistributedTraceIds());
        }
    }