提交 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> {
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>();
}
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);
if(!refs.contains(refSegment)){
refs.add(refSegment);
}
}
public void buildRelation(List<DistributedTraceId> distributedTraceIds){
if(distributedTraceIds == null || distributedTraceIds.size() == 0){
public void relatedGlobalTraces(List<DistributedTraceId> distributedTraceIds) {
if (distributedTraceIds == null || distributedTraceIds.size() == 0) {
return;
}
if(relatedGlobalTraces.getFirst() instanceof NewDistributedTraceId){
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>();
......
......@@ -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;
}
}
......@@ -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 {
......
......@@ -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());
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册