Loading skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java +47 −7 Original line number Diff line number Diff line package com.ai.cloud.skywalking.analysis.chainbuild.entity; import java.util.List; import com.ai.cloud.skywalking.analysis.chainbuild.exception.TraceSpanTreeNotFountException; 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; Loading @@ -7,8 +10,6 @@ import com.ai.cloud.skywalking.protocol.CallType; import com.ai.cloud.skywalking.protocol.Span; import com.google.gson.annotations.Expose; import java.util.List; public class TraceSpanNode { protected TraceSpanNode prev = null; Loading Loading @@ -88,6 +89,13 @@ public class TraceSpanNode { @Expose protected String applicationId = ""; /** * Warning: call this constructor ONLY by gson for deserialize */ public TraceSpanNode(){ } public TraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next, Span span, List<TraceSpanNode> spanContainer) { this(parent, sub, prev, next, spanContainer); this.visualNode = false; Loading Loading @@ -170,19 +178,47 @@ public class TraceSpanNode { } } public TraceSpanNode prev() { public TraceSpanNode prev(TraceSpanTree tree) throws TraceSpanTreeNotFountException { if(prev == null){ if(prevNodeRefToken == null){ throw new TraceSpanTreeNotFountException(getDesc() + " unexpected prev== null and prevNodeRefToken==null"); }else{ prev = tree.findNode(prevNodeRefToken); } } return prev; } public TraceSpanNode next() { public TraceSpanNode next(TraceSpanTree tree) throws TraceSpanTreeNotFountException { if(next == null){ if(nextNodeRefToken == null){ throw new TraceSpanTreeNotFountException(getDesc() + " unexpected next== null and nextNodeRefToken==null"); }else{ next = tree.findNode(nextNodeRefToken); } } return next; } public TraceSpanNode parent() { public TraceSpanNode parent(TraceSpanTree tree) throws TraceSpanTreeNotFountException { if(parent == null){ if(parentNodeRefToken == null){ throw new TraceSpanTreeNotFountException(getDesc() + " unexpected parent== null and parentNodeRefToken==null"); }else{ parent = tree.findNode(parentNodeRefToken); } } return parent; } public TraceSpanNode sub() { public TraceSpanNode sub(TraceSpanTree tree) throws TraceSpanTreeNotFountException { if(sub == null){ if(subNodeRefToken == null){ throw new TraceSpanTreeNotFountException(getDesc() + " unexpected sub== null and subNodeRefToken==null"); }else{ sub = tree.findNode(subNodeRefToken); } } return sub; } Loading Loading @@ -244,11 +280,15 @@ public class TraceSpanNode { public String getNodeRefToken() throws TraceSpanTreeSerializeException { if (StringUtil.isBlank(nodeRefToken)) { throw new TraceSpanTreeSerializeException("parentLevel=" + parentLevel + ", levelId=" + levelId + ", viewPointId=" + viewPointId + ", node ref token is null."); throw new TraceSpanTreeSerializeException(getDesc() + " ref token is null."); } return nodeRefToken; } private String getDesc(){ return "Node[parentLevel=" + parentLevel + ", levelId=" + levelId + ", viewPointId=" + viewPointId + "]"; } void serializeRef() throws TraceSpanTreeSerializeException { if (prev != null) { prevNodeRefToken = prev.getNodeRefToken(); Loading skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java +45 −17 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.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.hadoop.io.Writable; 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; import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil; import com.ai.cloud.skywalking.analysis.chainbuild.util.TokenGenerator; Loading @@ -9,34 +24,30 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; 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.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class TraceSpanTree implements Writable { private Logger logger = LoggerFactory.getLogger(TraceSpanTree.class); @Expose private String userId = null; @Expose private String cid; @Expose private TraceSpanNode treeRoot; @Expose private List<TraceSpanNode> spanContainer = new ArrayList<TraceSpanNode>(); private Map<String, TraceSpanNode> traceSpanNodeMap = new HashMap<String, TraceSpanNode>(); public TraceSpanTree() { } public String build(List<Span> spanList) throws BuildTraceSpanTreeException { public String build(List<Span> spanList) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException { if (spanList.size() == 0) { throw new BuildTraceSpanTreeException("spanList is empty."); } Loading @@ -62,7 +73,7 @@ public class TraceSpanTree implements Writable { return cid; } private void build(Span span) throws BuildTraceSpanTreeException { private void build(Span span) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException { if (userId == null && span.getUserId() != null) { userId = span.getUserId(); } Loading @@ -76,7 +87,10 @@ public class TraceSpanTree implements Writable { if (span.getLevelId() > 0) { TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess( span.getParentLevel(), span.getLevelId() - 1); new TraceSpanNode(null, null, foundNode, foundNode.next(), span, spanContainer); /** * Create node between foundNode and foundNode.next(maybe foundNode.next == null) */ new TraceSpanNode(null, null, foundNode, foundNode.next(this), span, spanContainer); } else { /** * levelId=0 find for parent level if parentLevelId = 0.0.1 then Loading @@ -91,13 +105,16 @@ public class TraceSpanTree implements Writable { TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess( parentLevel.substring(0, idx), Integer.parseInt(parentLevel.substring(idx + 1))); /** * Create sub node of using span data. FoundNode is parent node. */ new TraceSpanNode(foundNode, null, null, null, span, spanContainer); } } private TraceSpanNode findNodeAndCreateVisualNodeIfNess( String parentLevelId, int levelId) { String parentLevelId, int levelId) throws TraceSpanTreeNotFountException { String levelDesc = StringUtil.isBlank(parentLevelId) ? (levelId + "") : (parentLevelId + "." + levelId); String[] levelArray = levelDesc.split("\\."); Loading @@ -108,7 +125,7 @@ public class TraceSpanTree implements Writable { int currentLevelInt = Integer.parseInt(currentLevel); for (int i = 0; i < currentLevelInt; i++) { if (currentNode.hasNext()) { currentNode = currentNode.next(); currentNode = currentNode.next(this); } else { // create visual next node currentNode = new VisualTraceSpanNode(null, null, Loading @@ -118,7 +135,7 @@ public class TraceSpanTree implements Writable { contextParentLevelId = contextParentLevelId == "" ? ("" + currentLevelInt) : (contextParentLevelId + "." + currentLevelInt); if (currentNode.hasSub()) { currentNode = currentNode.sub(); currentNode = currentNode.sub(this); } else { // create visual sub node currentNode = new VisualTraceSpanNode(currentNode, null, null, Loading Loading @@ -154,6 +171,14 @@ public class TraceSpanTree implements Writable { return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(this); } TraceSpanNode findNode(String nodeRefToken) throws TraceSpanTreeNotFountException{ if(traceSpanNodeMap.containsKey(nodeRefToken)){ return traceSpanNodeMap.get(nodeRefToken); }else{ throw new TraceSpanTreeNotFountException("nodeRefToken=" + nodeRefToken + " not found."); } } @Override public void write(DataOutput out) throws IOException { try { Loading @@ -174,6 +199,9 @@ public class TraceSpanTree implements Writable { spanContainer = new Gson().fromJson(jsonObject.get("spanContainer"), new TypeToken<List<TraceSpanNode>>() { }.getType()); for(TraceSpanNode node : spanContainer){ traceSpanNodeMap.put(node.getNodeRefToken(), node); } } catch (Exception e) { logger.error("Failed to parse the value[" + value + "] to TraceSpanTree Object", e); } Loading skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/exception/TraceSpanTreeNotFountException.java 0 → 100644 +13 −0 Original line number Diff line number Diff line package com.ai.cloud.skywalking.analysis.chainbuild.exception; public class TraceSpanTreeNotFountException extends Exception { private static final long serialVersionUID = 5559441397011866237L; public TraceSpanTreeNotFountException(String msg){ super(msg); } public TraceSpanTreeNotFountException(String msg, Exception cause){ super(msg, cause); } } Loading
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java +47 −7 Original line number Diff line number Diff line package com.ai.cloud.skywalking.analysis.chainbuild.entity; import java.util.List; import com.ai.cloud.skywalking.analysis.chainbuild.exception.TraceSpanTreeNotFountException; 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; Loading @@ -7,8 +10,6 @@ import com.ai.cloud.skywalking.protocol.CallType; import com.ai.cloud.skywalking.protocol.Span; import com.google.gson.annotations.Expose; import java.util.List; public class TraceSpanNode { protected TraceSpanNode prev = null; Loading Loading @@ -88,6 +89,13 @@ public class TraceSpanNode { @Expose protected String applicationId = ""; /** * Warning: call this constructor ONLY by gson for deserialize */ public TraceSpanNode(){ } public TraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next, Span span, List<TraceSpanNode> spanContainer) { this(parent, sub, prev, next, spanContainer); this.visualNode = false; Loading Loading @@ -170,19 +178,47 @@ public class TraceSpanNode { } } public TraceSpanNode prev() { public TraceSpanNode prev(TraceSpanTree tree) throws TraceSpanTreeNotFountException { if(prev == null){ if(prevNodeRefToken == null){ throw new TraceSpanTreeNotFountException(getDesc() + " unexpected prev== null and prevNodeRefToken==null"); }else{ prev = tree.findNode(prevNodeRefToken); } } return prev; } public TraceSpanNode next() { public TraceSpanNode next(TraceSpanTree tree) throws TraceSpanTreeNotFountException { if(next == null){ if(nextNodeRefToken == null){ throw new TraceSpanTreeNotFountException(getDesc() + " unexpected next== null and nextNodeRefToken==null"); }else{ next = tree.findNode(nextNodeRefToken); } } return next; } public TraceSpanNode parent() { public TraceSpanNode parent(TraceSpanTree tree) throws TraceSpanTreeNotFountException { if(parent == null){ if(parentNodeRefToken == null){ throw new TraceSpanTreeNotFountException(getDesc() + " unexpected parent== null and parentNodeRefToken==null"); }else{ parent = tree.findNode(parentNodeRefToken); } } return parent; } public TraceSpanNode sub() { public TraceSpanNode sub(TraceSpanTree tree) throws TraceSpanTreeNotFountException { if(sub == null){ if(subNodeRefToken == null){ throw new TraceSpanTreeNotFountException(getDesc() + " unexpected sub== null and subNodeRefToken==null"); }else{ sub = tree.findNode(subNodeRefToken); } } return sub; } Loading Loading @@ -244,11 +280,15 @@ public class TraceSpanNode { public String getNodeRefToken() throws TraceSpanTreeSerializeException { if (StringUtil.isBlank(nodeRefToken)) { throw new TraceSpanTreeSerializeException("parentLevel=" + parentLevel + ", levelId=" + levelId + ", viewPointId=" + viewPointId + ", node ref token is null."); throw new TraceSpanTreeSerializeException(getDesc() + " ref token is null."); } return nodeRefToken; } private String getDesc(){ return "Node[parentLevel=" + parentLevel + ", levelId=" + levelId + ", viewPointId=" + viewPointId + "]"; } void serializeRef() throws TraceSpanTreeSerializeException { if (prev != null) { prevNodeRefToken = prev.getNodeRefToken(); Loading
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java +45 −17 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.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.hadoop.io.Writable; 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; import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil; import com.ai.cloud.skywalking.analysis.chainbuild.util.TokenGenerator; Loading @@ -9,34 +24,30 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; 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.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class TraceSpanTree implements Writable { private Logger logger = LoggerFactory.getLogger(TraceSpanTree.class); @Expose private String userId = null; @Expose private String cid; @Expose private TraceSpanNode treeRoot; @Expose private List<TraceSpanNode> spanContainer = new ArrayList<TraceSpanNode>(); private Map<String, TraceSpanNode> traceSpanNodeMap = new HashMap<String, TraceSpanNode>(); public TraceSpanTree() { } public String build(List<Span> spanList) throws BuildTraceSpanTreeException { public String build(List<Span> spanList) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException { if (spanList.size() == 0) { throw new BuildTraceSpanTreeException("spanList is empty."); } Loading @@ -62,7 +73,7 @@ public class TraceSpanTree implements Writable { return cid; } private void build(Span span) throws BuildTraceSpanTreeException { private void build(Span span) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException { if (userId == null && span.getUserId() != null) { userId = span.getUserId(); } Loading @@ -76,7 +87,10 @@ public class TraceSpanTree implements Writable { if (span.getLevelId() > 0) { TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess( span.getParentLevel(), span.getLevelId() - 1); new TraceSpanNode(null, null, foundNode, foundNode.next(), span, spanContainer); /** * Create node between foundNode and foundNode.next(maybe foundNode.next == null) */ new TraceSpanNode(null, null, foundNode, foundNode.next(this), span, spanContainer); } else { /** * levelId=0 find for parent level if parentLevelId = 0.0.1 then Loading @@ -91,13 +105,16 @@ public class TraceSpanTree implements Writable { TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess( parentLevel.substring(0, idx), Integer.parseInt(parentLevel.substring(idx + 1))); /** * Create sub node of using span data. FoundNode is parent node. */ new TraceSpanNode(foundNode, null, null, null, span, spanContainer); } } private TraceSpanNode findNodeAndCreateVisualNodeIfNess( String parentLevelId, int levelId) { String parentLevelId, int levelId) throws TraceSpanTreeNotFountException { String levelDesc = StringUtil.isBlank(parentLevelId) ? (levelId + "") : (parentLevelId + "." + levelId); String[] levelArray = levelDesc.split("\\."); Loading @@ -108,7 +125,7 @@ public class TraceSpanTree implements Writable { int currentLevelInt = Integer.parseInt(currentLevel); for (int i = 0; i < currentLevelInt; i++) { if (currentNode.hasNext()) { currentNode = currentNode.next(); currentNode = currentNode.next(this); } else { // create visual next node currentNode = new VisualTraceSpanNode(null, null, Loading @@ -118,7 +135,7 @@ public class TraceSpanTree implements Writable { contextParentLevelId = contextParentLevelId == "" ? ("" + currentLevelInt) : (contextParentLevelId + "." + currentLevelInt); if (currentNode.hasSub()) { currentNode = currentNode.sub(); currentNode = currentNode.sub(this); } else { // create visual sub node currentNode = new VisualTraceSpanNode(currentNode, null, null, Loading Loading @@ -154,6 +171,14 @@ public class TraceSpanTree implements Writable { return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(this); } TraceSpanNode findNode(String nodeRefToken) throws TraceSpanTreeNotFountException{ if(traceSpanNodeMap.containsKey(nodeRefToken)){ return traceSpanNodeMap.get(nodeRefToken); }else{ throw new TraceSpanTreeNotFountException("nodeRefToken=" + nodeRefToken + " not found."); } } @Override public void write(DataOutput out) throws IOException { try { Loading @@ -174,6 +199,9 @@ public class TraceSpanTree implements Writable { spanContainer = new Gson().fromJson(jsonObject.get("spanContainer"), new TypeToken<List<TraceSpanNode>>() { }.getType()); for(TraceSpanNode node : spanContainer){ traceSpanNodeMap.put(node.getNodeRefToken(), node); } } catch (Exception e) { logger.error("Failed to parse the value[" + value + "] to TraceSpanTree Object", e); } Loading
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/exception/TraceSpanTreeNotFountException.java 0 → 100644 +13 −0 Original line number Diff line number Diff line package com.ai.cloud.skywalking.analysis.chainbuild.exception; public class TraceSpanTreeNotFountException extends Exception { private static final long serialVersionUID = 5559441397011866237L; public TraceSpanTreeNotFountException(String msg){ super(msg); } public TraceSpanTreeNotFountException(String msg, Exception cause){ super(msg, cause); } }