diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java index 3110891d5..43a4183ee 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java @@ -1,5 +1,8 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity; +import java.util.List; + +import com.ai.cloud.skywalking.analysis.chainbuild.exception.TraceSpanTreeSerializeException; import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil; import com.ai.cloud.skywalking.protocol.CallType; import com.ai.cloud.skywalking.protocol.Span; @@ -13,6 +16,16 @@ public class TraceSpanNode { protected TraceSpanNode sub = null; + protected String prevNodeRefToken = null; + + protected String nextNodeRefToken = null; + + protected String parentNodeRefToken = null; + + protected String subNodeRefToken = null; + + protected String nodeRefToken = null; + protected boolean visualNode = true; protected String parentLevel; @@ -57,8 +70,8 @@ public class TraceSpanNode { */ protected String applicationId = ""; - public TraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next, Span span) { - this(parent, sub, prev, next); + public TraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next, Span span, List spanContainer) { + this(parent, sub, prev, next, spanContainer); this.visualNode = false; this.parentLevel = span.getParentLevel(); this.levelId = span.getLevelId(); @@ -75,30 +88,33 @@ public class TraceSpanNode { this.spanType = span.getSpanType(); this.businessKey = span.getBusinessKey(); this.applicationId = span.getApplicationId(); + + //TODO: to set nodeToken } - public TraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next){ + protected TraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next, List spanContainer){ this.visualNode = true; - this.parent = parent; + this.setParent(parent); if(parent != null){ - parent.sub = this; + parent.setSub(this); } - this.sub = sub; + this.setSub(sub); if(sub != null){ - sub.parent = this; + sub.setParent(this); } - this.prev = prev; + this.setPrev(prev); if(prev != null){ - prev.next = this; + prev.setNext(this); } - this.next = next; + this.setNext(next); if(next != null){ - next.prev = this; + next.setPrev(this); } + spanContainer.add(this); } - protected TraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next, String parentLevelId, int levelId){ - this(parent, sub, prev, next); + protected TraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next, String parentLevelId, int levelId, List spanContainer){ + this(parent, sub, prev, next, spanContainer); this.parentLevel = parentLevelId; this.levelId = levelId; this.callTimes = 0; @@ -134,30 +150,38 @@ public class TraceSpanNode { } } - TraceSpanNode next(){ - return this.next; - } - - TraceSpanNode sub(){ - return this.sub; - } - - public TraceSpanNode getPrev() { + public TraceSpanNode prev() { return prev; } - public TraceSpanNode getNext() { + public TraceSpanNode next() { return next; } - public TraceSpanNode getParent() { + public TraceSpanNode parent() { return parent; } - public TraceSpanNode getSub() { + public TraceSpanNode sub() { return sub; } + public void setPrev(TraceSpanNode prev) { + this.prev = prev; + } + + public void setNext(TraceSpanNode next) { + this.next = next; + } + + public void setParent(TraceSpanNode parent) { + this.parent = parent; + } + + public void setSub(TraceSpanNode sub) { + this.sub = sub; + } + public boolean isVisualNode() { return visualNode; } @@ -197,4 +221,26 @@ public class TraceSpanNode { public String getApplicationId() { return applicationId; } + + public String getNodeRefToken() throws TraceSpanTreeSerializeException { + if(StringUtil.isBlank(nodeRefToken)){ + throw new TraceSpanTreeSerializeException("parentLevel=" + parentLevel + ", levelId=" + levelId + ", viewPointId=" + viewPointId + ", node ref token is null."); + } + return nodeRefToken; + } + + void serializeRef() throws TraceSpanTreeSerializeException{ + if(prev != null){ + prevNodeRefToken = prev.getNodeRefToken(); + } + if(parent != null){ + parentNodeRefToken = parent.getNodeRefToken(); + } + if(next != null){ + nextNodeRefToken = next.getNodeRefToken(); + } + if(sub != null){ + subNodeRefToken = sub.getNodeRefToken(); + } + } } diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java index e7a1d7d4b..0d0841381 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java @@ -1,5 +1,6 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -8,6 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ai.cloud.skywalking.analysis.chainbuild.exception.BuildTraceSpanTreeException; +import com.ai.cloud.skywalking.analysis.chainbuild.exception.TraceSpanTreeSerializeException; import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil; import com.ai.cloud.skywalking.analysis.chainbuild.util.TokenGenerator; import com.ai.cloud.skywalking.protocol.Span; @@ -20,6 +22,8 @@ public class TraceSpanTree { private String cid; private TraceSpanNode treeRoot; + + private List spanContainer = new ArrayList(); public TraceSpanTree() { } @@ -40,7 +44,7 @@ public class TraceSpanTree { } }); cid = generateChainToken(spanList.get(0)); - treeRoot = new TraceSpanNode(null, null, null, null, spanList.get(0)); + treeRoot = new TraceSpanNode(null, null, null, null, spanList.get(0), spanContainer); if (spanList.size() > 1) { for (int i = 1; i < spanList.size(); i++) { this.build(spanList.get(i)); @@ -65,7 +69,7 @@ public class TraceSpanTree { TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess( span.getParentLevel(), span.getLevelId() - 1); if (foundNode != null) { - new TraceSpanNode(null, null, foundNode, foundNode.next(), span); + new TraceSpanNode(null, null, foundNode, foundNode.next(), span, spanContainer); } } else { /** @@ -101,7 +105,7 @@ public class TraceSpanTree { } else { // create visual next node currentNode = new VisualTraceSpanNode(null, null, - currentNode, null, contextParentLevelId, i); + currentNode, null, contextParentLevelId, i, spanContainer); } } contextParentLevelId = contextParentLevelId == "" ? ("" + currentLevelInt) @@ -111,7 +115,7 @@ public class TraceSpanTree { } else { // create visual sub node currentNode = new VisualTraceSpanNode(currentNode, null, null, - null, contextParentLevelId, 0); + null, contextParentLevelId, 0, spanContainer); } } @@ -130,5 +134,12 @@ public class TraceSpanTree { + level0Span.getTraceId() + " level0 span data is illegal"); } } + + + private void beforeSerialize() throws TraceSpanTreeSerializeException{ + for(TraceSpanNode treeNode : spanContainer){ + treeNode.serializeRef(); + } + } } diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/VisualTraceSpanNode.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/VisualTraceSpanNode.java index d1ce42fec..6d155f528 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/VisualTraceSpanNode.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/VisualTraceSpanNode.java @@ -1,11 +1,15 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity; +import java.util.List; + public class VisualTraceSpanNode extends TraceSpanNode { protected VisualTraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next, String parentLevelId, - int levelId) { - super(parent, sub, prev, next, parentLevelId, levelId); + int levelId, List spanContainer) { + super(parent, sub, prev, next, parentLevelId, levelId, spanContainer); + + //TODO: to set nodeToken } diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/exception/TraceSpanTreeSerializeException.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/exception/TraceSpanTreeSerializeException.java new file mode 100644 index 000000000..5f0bdd9e0 --- /dev/null +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/exception/TraceSpanTreeSerializeException.java @@ -0,0 +1,13 @@ +package com.ai.cloud.skywalking.analysis.chainbuild.exception; + +public class TraceSpanTreeSerializeException extends Exception { + private static final long serialVersionUID = 7857716041262993579L; + + public TraceSpanTreeSerializeException(String msg){ + super(msg); + } + + public TraceSpanTreeSerializeException(String msg, Exception cause){ + super(msg, cause); + } +}