提交 0131a35d 编写于 作者: wu-sheng's avatar wu-sheng

完善序列化和反序列化代码。

上级 62b43cde
package com.ai.cloud.skywalking.analysis.chainbuild.entity; 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.exception.TraceSpanTreeSerializeException;
import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil; import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil;
import com.ai.cloud.skywalking.analysis.chainbuild.util.TokenGenerator; import com.ai.cloud.skywalking.analysis.chainbuild.util.TokenGenerator;
...@@ -7,8 +10,6 @@ import com.ai.cloud.skywalking.protocol.CallType; ...@@ -7,8 +10,6 @@ import com.ai.cloud.skywalking.protocol.CallType;
import com.ai.cloud.skywalking.protocol.Span; import com.ai.cloud.skywalking.protocol.Span;
import com.google.gson.annotations.Expose; import com.google.gson.annotations.Expose;
import java.util.List;
public class TraceSpanNode { public class TraceSpanNode {
protected TraceSpanNode prev = null; protected TraceSpanNode prev = null;
...@@ -88,6 +89,13 @@ public class TraceSpanNode { ...@@ -88,6 +89,13 @@ public class TraceSpanNode {
@Expose @Expose
protected String applicationId = ""; 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) { public TraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, TraceSpanNode prev, TraceSpanNode next, Span span, List<TraceSpanNode> spanContainer) {
this(parent, sub, prev, next, spanContainer); this(parent, sub, prev, next, spanContainer);
this.visualNode = false; this.visualNode = false;
...@@ -170,19 +178,47 @@ public class TraceSpanNode { ...@@ -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; 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; 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; 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; return sub;
} }
...@@ -244,10 +280,14 @@ public class TraceSpanNode { ...@@ -244,10 +280,14 @@ public class TraceSpanNode {
public String getNodeRefToken() throws TraceSpanTreeSerializeException { public String getNodeRefToken() throws TraceSpanTreeSerializeException {
if (StringUtil.isBlank(nodeRefToken)) { 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; return nodeRefToken;
} }
private String getDesc(){
return "Node[parentLevel=" + parentLevel + ", levelId=" + levelId + ", viewPointId=" + viewPointId + "]";
}
void serializeRef() throws TraceSpanTreeSerializeException { void serializeRef() throws TraceSpanTreeSerializeException {
if (prev != null) { if (prev != null) {
......
package com.ai.cloud.skywalking.analysis.chainbuild.entity; 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.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.exception.TraceSpanTreeSerializeException;
import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil; import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil;
import com.ai.cloud.skywalking.analysis.chainbuild.util.TokenGenerator; import com.ai.cloud.skywalking.analysis.chainbuild.util.TokenGenerator;
...@@ -9,34 +24,30 @@ import com.google.gson.Gson; ...@@ -9,34 +24,30 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import com.google.gson.annotations.Expose;
import com.google.gson.reflect.TypeToken; 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 { public class TraceSpanTree implements Writable {
private Logger logger = LoggerFactory.getLogger(TraceSpanTree.class); private Logger logger = LoggerFactory.getLogger(TraceSpanTree.class);
@Expose
private String userId = null; private String userId = null;
@Expose
private String cid; private String cid;
@Expose
private TraceSpanNode treeRoot; private TraceSpanNode treeRoot;
@Expose
private List<TraceSpanNode> spanContainer = new ArrayList<TraceSpanNode>(); private List<TraceSpanNode> spanContainer = new ArrayList<TraceSpanNode>();
private Map<String, TraceSpanNode> traceSpanNodeMap = new HashMap<String, TraceSpanNode>();
public TraceSpanTree() { public TraceSpanTree() {
} }
public String build(List<Span> spanList) throws BuildTraceSpanTreeException { public String build(List<Span> spanList) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException {
if (spanList.size() == 0) { if (spanList.size() == 0) {
throw new BuildTraceSpanTreeException("spanList is empty."); throw new BuildTraceSpanTreeException("spanList is empty.");
} }
...@@ -62,7 +73,7 @@ public class TraceSpanTree implements Writable { ...@@ -62,7 +73,7 @@ public class TraceSpanTree implements Writable {
return cid; return cid;
} }
private void build(Span span) throws BuildTraceSpanTreeException { private void build(Span span) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException {
if (userId == null && span.getUserId() != null) { if (userId == null && span.getUserId() != null) {
userId = span.getUserId(); userId = span.getUserId();
} }
...@@ -76,7 +87,10 @@ public class TraceSpanTree implements Writable { ...@@ -76,7 +87,10 @@ public class TraceSpanTree implements Writable {
if (span.getLevelId() > 0) { if (span.getLevelId() > 0) {
TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess( TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess(
span.getParentLevel(), span.getLevelId() - 1); 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 { } else {
/** /**
* levelId=0 find for parent level if parentLevelId = 0.0.1 then * levelId=0 find for parent level if parentLevelId = 0.0.1 then
...@@ -91,13 +105,16 @@ public class TraceSpanTree implements Writable { ...@@ -91,13 +105,16 @@ public class TraceSpanTree implements Writable {
TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess( TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess(
parentLevel.substring(0, idx), parentLevel.substring(0, idx),
Integer.parseInt(parentLevel.substring(idx + 1))); 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); new TraceSpanNode(foundNode, null, null, null, span, spanContainer);
} }
} }
private TraceSpanNode findNodeAndCreateVisualNodeIfNess( private TraceSpanNode findNodeAndCreateVisualNodeIfNess(
String parentLevelId, int levelId) { String parentLevelId, int levelId) throws TraceSpanTreeNotFountException {
String levelDesc = StringUtil.isBlank(parentLevelId) ? (levelId + "") String levelDesc = StringUtil.isBlank(parentLevelId) ? (levelId + "")
: (parentLevelId + "." + levelId); : (parentLevelId + "." + levelId);
String[] levelArray = levelDesc.split("\\."); String[] levelArray = levelDesc.split("\\.");
...@@ -108,7 +125,7 @@ public class TraceSpanTree implements Writable { ...@@ -108,7 +125,7 @@ public class TraceSpanTree implements Writable {
int currentLevelInt = Integer.parseInt(currentLevel); int currentLevelInt = Integer.parseInt(currentLevel);
for (int i = 0; i < currentLevelInt; i++) { for (int i = 0; i < currentLevelInt; i++) {
if (currentNode.hasNext()) { if (currentNode.hasNext()) {
currentNode = currentNode.next(); currentNode = currentNode.next(this);
} else { } else {
// create visual next node // create visual next node
currentNode = new VisualTraceSpanNode(null, null, currentNode = new VisualTraceSpanNode(null, null,
...@@ -118,7 +135,7 @@ public class TraceSpanTree implements Writable { ...@@ -118,7 +135,7 @@ public class TraceSpanTree implements Writable {
contextParentLevelId = contextParentLevelId == "" ? ("" + currentLevelInt) contextParentLevelId = contextParentLevelId == "" ? ("" + currentLevelInt)
: (contextParentLevelId + "." + currentLevelInt); : (contextParentLevelId + "." + currentLevelInt);
if (currentNode.hasSub()) { if (currentNode.hasSub()) {
currentNode = currentNode.sub(); currentNode = currentNode.sub(this);
} else { } else {
// create visual sub node // create visual sub node
currentNode = new VisualTraceSpanNode(currentNode, null, null, currentNode = new VisualTraceSpanNode(currentNode, null, null,
...@@ -153,6 +170,14 @@ public class TraceSpanTree implements Writable { ...@@ -153,6 +170,14 @@ public class TraceSpanTree implements Writable {
beforeSerialize(); beforeSerialize();
return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(this); 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 @Override
public void write(DataOutput out) throws IOException { public void write(DataOutput out) throws IOException {
...@@ -174,6 +199,9 @@ public class TraceSpanTree implements Writable { ...@@ -174,6 +199,9 @@ public class TraceSpanTree implements Writable {
spanContainer = new Gson().fromJson(jsonObject.get("spanContainer"), spanContainer = new Gson().fromJson(jsonObject.get("spanContainer"),
new TypeToken<List<TraceSpanNode>>() { new TypeToken<List<TraceSpanNode>>() {
}.getType()); }.getType());
for(TraceSpanNode node : spanContainer){
traceSpanNodeMap.put(node.getNodeRefToken(), node);
}
} catch (Exception e) { } catch (Exception e) {
logger.error("Failed to parse the value[" + value + "] to TraceSpanTree Object", e); logger.error("Failed to parse the value[" + value + "] to TraceSpanTree Object", e);
} }
......
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);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册