Loading skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/BranchTraceSpanNode.java 0 → 100644 +39 −0 Original line number Diff line number Diff line package com.ai.cloud.skywalking.analysis.chainbuild.entity; import java.util.List; public class BranchTraceSpanNode extends TraceSpanNode { protected BranchTraceSpanNode(TraceSpanNode origin, TraceSpanNode dest, List<TraceSpanNode> spanContainer) { setNextBranchNode(dest); dest.parent = this; dest.setNextBranchNode(origin); origin.parent = this; this.setParent(dest.parent); this.branchNode = true; spanContainer.add(this); } public boolean hasNextBranch() { return nextBranchNode != null; } public TraceSpanNode nextBranch() { return nextBranchNode; } public void addBranch(TraceSpanNode branch) { TraceSpanNode lastBranchNode = null; while (hasNextBranch()) { lastBranchNode = nextBranchNode; } lastBranchNode.nextBranchNode = branch; branch.parent = this; } } skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java +17 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,15 @@ public class TraceSpanNode { @Expose protected String applicationId = ""; /** * 是否为分支节点 */ @Expose protected boolean branchNode; @Expose protected TraceSpanNode nextBranchNode; /** * Warning: call this constructor ONLY by gson for deserialize */ Loading Loading @@ -234,6 +243,10 @@ public class TraceSpanNode { this.parent = parent; } public void setNextBranchNode(TraceSpanNode nextBranchNode){ this.nextBranchNode = nextBranchNode; } public void setSub(TraceSpanNode sub) { this.sub = sub; } Loading Loading @@ -303,4 +316,8 @@ public class TraceSpanNode { subNodeRefToken = sub.getNodeRefToken(); } } public boolean isBranchNode() { return branchNode; } } skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java +293 −236 Original line number Diff line number Diff line package com.ai.cloud.skywalking.analysis.chainbuild.entity; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.hadoop.io.Writable; import org.mortbay.log.Log; 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.TraceSpanTreeNotFountException; import com.ai.cloud.skywalking.analysis.chainbuild.exception.TraceSpanTreeSerializeException; Loading @@ -29,6 +12,14 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.annotations.Expose; import com.google.gson.reflect.TypeToken; import org.apache.hadoop.io.Writable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.*; public class TraceSpanTree implements Writable { private Logger logger = LoggerFactory.getLogger(TraceSpanTree.class); Loading Loading @@ -250,4 +241,70 @@ public class TraceSpanTree implements Writable { public String getCid() { return cid; } public void merge(TraceSpanTree spanTree) { if (spanTree.getTreeRoot().hasNext()) { SpanTreeMerger.merge(spanTree.getTreeRoot().next, treeRoot.next, spanContainer); } if (spanTree.getTreeRoot().hasSub()) { SpanTreeMerger.merge(spanTree.getTreeRoot().sub, treeRoot.sub, spanContainer); } } private static class SpanTreeMerger { public static boolean merge(TraceSpanNode origin, TraceSpanNode dest, List<TraceSpanNode> spanContainer) { boolean flag = false; if (origin == null || dest == null) { if (origin != null && dest == null) { dest.parent.sub = origin; origin.parent = dest.parent; return true; } return true; } if (dest.isBranchNode()) { BranchTraceSpanNode branchTraceSpanNode = (BranchTraceSpanNode) dest; boolean branchFlag = false; while (branchTraceSpanNode.hasNextBranch()) { branchFlag = merge(origin, branchTraceSpanNode.nextBranch(), spanContainer); if (branchFlag) { break; } } if (branchFlag) { return true; } else { branchTraceSpanNode.addBranch(origin); return false; } } if (origin.isVisualNode() || dest.isVisualNode()) { boolean nextFlag = merge(origin.next, dest.next, spanContainer); boolean subFlag = merge(origin.sub, dest.sub, spanContainer); if (subFlag && nextFlag) { // 合并子树数据 } else { new BranchTraceSpanNode(origin, dest, spanContainer); } flag = nextFlag && nextFlag; } else { if (origin.nodeRefToken.equals(dest.nodeRefToken)) { // 合并子树数据 flag = true; } else { new BranchTraceSpanNode(origin, dest, spanContainer); flag = false; } flag = flag && merge(origin.next, dest.next, spanContainer); flag = flag && merge(origin.sub, dest.sub, spanContainer); } return flag; } } } Loading
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/BranchTraceSpanNode.java 0 → 100644 +39 −0 Original line number Diff line number Diff line package com.ai.cloud.skywalking.analysis.chainbuild.entity; import java.util.List; public class BranchTraceSpanNode extends TraceSpanNode { protected BranchTraceSpanNode(TraceSpanNode origin, TraceSpanNode dest, List<TraceSpanNode> spanContainer) { setNextBranchNode(dest); dest.parent = this; dest.setNextBranchNode(origin); origin.parent = this; this.setParent(dest.parent); this.branchNode = true; spanContainer.add(this); } public boolean hasNextBranch() { return nextBranchNode != null; } public TraceSpanNode nextBranch() { return nextBranchNode; } public void addBranch(TraceSpanNode branch) { TraceSpanNode lastBranchNode = null; while (hasNextBranch()) { lastBranchNode = nextBranchNode; } lastBranchNode.nextBranchNode = branch; branch.parent = this; } }
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java +17 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,15 @@ public class TraceSpanNode { @Expose protected String applicationId = ""; /** * 是否为分支节点 */ @Expose protected boolean branchNode; @Expose protected TraceSpanNode nextBranchNode; /** * Warning: call this constructor ONLY by gson for deserialize */ Loading Loading @@ -234,6 +243,10 @@ public class TraceSpanNode { this.parent = parent; } public void setNextBranchNode(TraceSpanNode nextBranchNode){ this.nextBranchNode = nextBranchNode; } public void setSub(TraceSpanNode sub) { this.sub = sub; } Loading Loading @@ -303,4 +316,8 @@ public class TraceSpanNode { subNodeRefToken = sub.getNodeRefToken(); } } public boolean isBranchNode() { return branchNode; } }
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java +293 −236 Original line number Diff line number Diff line package com.ai.cloud.skywalking.analysis.chainbuild.entity; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.hadoop.io.Writable; import org.mortbay.log.Log; 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.TraceSpanTreeNotFountException; import com.ai.cloud.skywalking.analysis.chainbuild.exception.TraceSpanTreeSerializeException; Loading @@ -29,6 +12,14 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.annotations.Expose; import com.google.gson.reflect.TypeToken; import org.apache.hadoop.io.Writable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.*; public class TraceSpanTree implements Writable { private Logger logger = LoggerFactory.getLogger(TraceSpanTree.class); Loading Loading @@ -250,4 +241,70 @@ public class TraceSpanTree implements Writable { public String getCid() { return cid; } public void merge(TraceSpanTree spanTree) { if (spanTree.getTreeRoot().hasNext()) { SpanTreeMerger.merge(spanTree.getTreeRoot().next, treeRoot.next, spanContainer); } if (spanTree.getTreeRoot().hasSub()) { SpanTreeMerger.merge(spanTree.getTreeRoot().sub, treeRoot.sub, spanContainer); } } private static class SpanTreeMerger { public static boolean merge(TraceSpanNode origin, TraceSpanNode dest, List<TraceSpanNode> spanContainer) { boolean flag = false; if (origin == null || dest == null) { if (origin != null && dest == null) { dest.parent.sub = origin; origin.parent = dest.parent; return true; } return true; } if (dest.isBranchNode()) { BranchTraceSpanNode branchTraceSpanNode = (BranchTraceSpanNode) dest; boolean branchFlag = false; while (branchTraceSpanNode.hasNextBranch()) { branchFlag = merge(origin, branchTraceSpanNode.nextBranch(), spanContainer); if (branchFlag) { break; } } if (branchFlag) { return true; } else { branchTraceSpanNode.addBranch(origin); return false; } } if (origin.isVisualNode() || dest.isVisualNode()) { boolean nextFlag = merge(origin.next, dest.next, spanContainer); boolean subFlag = merge(origin.sub, dest.sub, spanContainer); if (subFlag && nextFlag) { // 合并子树数据 } else { new BranchTraceSpanNode(origin, dest, spanContainer); } flag = nextFlag && nextFlag; } else { if (origin.nodeRefToken.equals(dest.nodeRefToken)) { // 合并子树数据 flag = true; } else { new BranchTraceSpanNode(origin, dest, spanContainer); flag = false; } flag = flag && merge(origin.next, dest.next, spanContainer); flag = flag && merge(origin.sub, dest.sub, spanContainer); } return flag; } } }