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

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

2. Adjust globalTracerIds
上级 dfa0eead
...@@ -41,14 +41,8 @@ public class TraceSegment implements ISerializable<SegmentMessage> { ...@@ -41,14 +41,8 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
private long endTime; private long endTime;
/** /**
* The primary ref of the parent trace segment. * The refs of parent trace segments, except the primary one.
* Use {@link TraceSegmentRef}, we can link this trace segment to the primary parent segment. * For most RPC call, {@link #refs} contains only one element,
*/
private TraceSegmentRef primaryRef;
/**
* The refs of other parent trace segments, except the primary one.
* For most RPC call, {@link #refs} stay in null,
* but if this segment is a start span of batch process, the segment faces multi parents, * 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. * at this moment, we use this {@link #refs} to link them.
*/ */
...@@ -74,13 +68,13 @@ public class TraceSegment implements ISerializable<SegmentMessage> { ...@@ -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 * element, because only one parent {@link TraceSegment} exists, but, in batch scenario, the num becomes greater
* than 1, also meaning multi-parents {@link TraceSegment}. * than 1, also meaning multi-parents {@link TraceSegment}.
* *
* The difference between <code>relatedGlobalTraces</code> and {@link #primaryRef}/{@link #refs} is: {@link * The difference between <code>relatedGlobalTraces</code> and {@link #refs} is:
* #primaryRef}/{@link #refs} targets this {@link TraceSegment}'s direct parent, * {@link #refs} targets this {@link TraceSegment}'s direct parent,
* *
* and * and
* *
* <code>relatedGlobalTraces</code> targets this {@link TraceSegment}'s related call chain, a call chain contains * <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; private LinkedList<DistributedTraceId> relatedGlobalTraces;
...@@ -108,48 +102,27 @@ public class TraceSegment implements ISerializable<SegmentMessage> { ...@@ -108,48 +102,27 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
/** /**
* Establish the link between this segment and its parents. * 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>();
}
refs.add(refSegment);
}
}
}
/**
* Set to {@link #primaryRef} only,
* based on {@link #ref(TraceSegmentRef, boolean)}
* *
* @param refSegment {@link TraceSegmentRef} * @param refSegment {@link TraceSegmentRef}
*/ */
public void ref(TraceSegmentRef refSegment) { public void ref(TraceSegmentRef refSegment) {
ref(refSegment, true); if(!refs.contains(refSegment)){
refs.add(refSegment);
}
} }
public void buildRelation(List<DistributedTraceId> distributedTraceIds){ public void relatedGlobalTraces(List<DistributedTraceId> distributedTraceIds) {
if(distributedTraceIds == null || distributedTraceIds.size() == 0){ if (distributedTraceIds == null || distributedTraceIds.size() == 0) {
return; return;
} }
if(relatedGlobalTraces.getFirst() instanceof NewDistributedTraceId){ if (relatedGlobalTraces.getFirst() instanceof NewDistributedTraceId) {
relatedGlobalTraces.removeFirst(); 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> { ...@@ -184,10 +157,6 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
return endTime; return endTime;
} }
public TraceSegmentRef getPrimaryRef() {
return primaryRef;
}
public List<TraceSegmentRef> getRefs() { public List<TraceSegmentRef> getRefs() {
if (refs == null) { if (refs == null) {
return null; return null;
...@@ -207,13 +176,15 @@ public class TraceSegment implements ISerializable<SegmentMessage> { ...@@ -207,13 +176,15 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
return applicationCode; return applicationCode;
} }
@Override @Override public String toString() {
public String toString() {
return "TraceSegment{" + return "TraceSegment{" +
"traceSegmentId='" + traceSegmentId + '\'' + "traceSegmentId='" + traceSegmentId + '\'' +
", startTime=" + startTime +
", endTime=" + endTime + ", endTime=" + endTime +
", primaryRef=" + primaryRef + ", refs=" + refs +
", spans.size=" + spans.size() + ", spans=" + spans +
", applicationCode='" + applicationCode + '\'' +
", relatedGlobalTraces=" + relatedGlobalTraces +
'}'; '}';
} }
...@@ -224,9 +195,6 @@ public class TraceSegment implements ISerializable<SegmentMessage> { ...@@ -224,9 +195,6 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
segmentBuilder.setStartTime(startTime); segmentBuilder.setStartTime(startTime);
segmentBuilder.setEndTime(endTime); segmentBuilder.setEndTime(endTime);
segmentBuilder.setApplicationCode(applicationCode); segmentBuilder.setApplicationCode(applicationCode);
if (primaryRef != null) {
segmentBuilder.setPrimaryRef(primaryRef.serialize());
}
if (refs != null && refs.size() > 0) { if (refs != null && refs.size() > 0) {
for (TraceSegmentRef ref : refs) { for (TraceSegmentRef ref : refs) {
segmentBuilder.addRefs(ref.serialize()); segmentBuilder.addRefs(ref.serialize());
...@@ -247,10 +215,6 @@ public class TraceSegment implements ISerializable<SegmentMessage> { ...@@ -247,10 +215,6 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
startTime = message.getStartTime(); startTime = message.getStartTime();
endTime = message.getEndTime(); endTime = message.getEndTime();
applicationCode = message.getApplicationCode(); applicationCode = message.getApplicationCode();
SegmentRefMessage messagePrimaryRef = message.getPrimaryRef();
if (messagePrimaryRef != null) {
(primaryRef = new TraceSegmentRef()).deserialize(messagePrimaryRef);
}
List<SegmentRefMessage> refsList = message.getRefsList(); List<SegmentRefMessage> refsList = message.getRefsList();
if (refsList != null && refsList.size() > 0) { if (refsList != null && refsList.size() > 0) {
this.refs = new LinkedList<TraceSegmentRef>(); this.refs = new LinkedList<TraceSegmentRef>();
......
...@@ -97,4 +97,31 @@ public class TraceSegmentRef implements ISerializable<SegmentRefMessage> { ...@@ -97,4 +97,31 @@ public class TraceSegmentRef implements ISerializable<SegmentRefMessage> {
applicationCode = message.getApplicationCode(); applicationCode = message.getApplicationCode();
peerHost = message.getPeerHost(); 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;
}
} }
...@@ -8,10 +8,9 @@ message SegmentMessage { ...@@ -8,10 +8,9 @@ message SegmentMessage {
int64 startTime = 2; int64 startTime = 2;
int64 endTime = 3; int64 endTime = 3;
string applicationCode = 4; string applicationCode = 4;
SegmentRefMessage primaryRef = 5; repeated SegmentRefMessage refs = 5;
repeated SegmentRefMessage refs = 6; repeated string relatedTraceIds = 6;
repeated string relatedTraceIds = 7; repeated SpanMessage spans = 7;
repeated SpanMessage spans = 8;
} }
message SegmentRefMessage { message SegmentRefMessage {
......
...@@ -137,19 +137,7 @@ public final class TracerContext { ...@@ -137,19 +137,7 @@ public final class TracerContext {
public void extract(ContextCarrier carrier) { public void extract(ContextCarrier carrier) {
if(carrier.isValid()) { if(carrier.isValid()) {
this.segment.ref(getRef(carrier)); this.segment.ref(getRef(carrier));
this.segment.buildRelation(carrier.getDistributedTraceIds()); this.segment.relatedGlobalTraces(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);
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册