提交 3006c7fa 编写于 作者: wu-sheng's avatar wu-sheng

1.修改cid的生成规则。增加userId为算子。增加年-月作为cid前缀

2.为虚拟节点创建一个明文的token(方便识别)
上级 0131a35d
...@@ -45,7 +45,7 @@ public class ChainBuildMapper extends TableMapper<Text, TraceSpanTree> { ...@@ -45,7 +45,7 @@ public class ChainBuildMapper extends TableMapper<Text, TraceSpanTree> {
TraceSpanTree tree = new TraceSpanTree(); TraceSpanTree tree = new TraceSpanTree();
tree.build(spanList); tree.build(spanList);
context.write(new Text(tree.getTreeRoot().getNodeRefToken()), tree); context.write(new Text(tree.getCid()), tree);
} catch (Throwable e) { } catch (Throwable e) {
logger.error("Failed to mapper call chain[" + key.toString() + "]", logger.error("Failed to mapper call chain[" + key.toString() + "]",
e); e);
......
...@@ -4,13 +4,16 @@ import java.io.DataInput; ...@@ -4,13 +4,16 @@ import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.hadoop.io.Writable; import org.apache.hadoop.io.Writable;
import org.mortbay.log.Log;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -28,186 +31,223 @@ import com.google.gson.annotations.Expose; ...@@ -28,186 +31,223 @@ import com.google.gson.annotations.Expose;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
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 @Expose
private String userId = null; private String userId = null;
@Expose @Expose
private String cid; private String cid;
@Expose @Expose
private TraceSpanNode treeRoot; private TraceSpanNode treeRoot;
@Expose @Expose
private List<TraceSpanNode> spanContainer = new ArrayList<TraceSpanNode>(); private List<TraceSpanNode> spanContainer = new ArrayList<TraceSpanNode>();
private Map<String, TraceSpanNode> traceSpanNodeMap = new HashMap<String, TraceSpanNode>(); private Map<String, TraceSpanNode> traceSpanNodeMap = new HashMap<String, TraceSpanNode>();
public TraceSpanTree() { public TraceSpanTree() {
} }
public String build(List<Span> spanList) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException { public String build(List<Span> spanList)
if (spanList.size() == 0) { throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException {
throw new BuildTraceSpanTreeException("spanList is empty."); if (spanList.size() == 0) {
} throw new BuildTraceSpanTreeException("spanList is empty.");
}
Collections.sort(spanList, new Comparator<Span>() {
@Override Collections.sort(spanList, new Comparator<Span>() {
public int compare(Span span1, Span span2) { @Override
String span1TraceLevel = span1.getParentLevel() + "." public int compare(Span span1, Span span2) {
+ span1.getLevelId(); String span1TraceLevel = span1.getParentLevel() + "."
String span2TraceLevel = span2.getParentLevel() + "." + span1.getLevelId();
+ span2.getLevelId(); String span2TraceLevel = span2.getParentLevel() + "."
return span1TraceLevel.compareTo(span2TraceLevel); + span2.getLevelId();
} return span1TraceLevel.compareTo(span2TraceLevel);
}); }
cid = generateChainToken(spanList.get(0)); });
treeRoot = new TraceSpanNode(null, null, null, null, spanList.get(0), spanContainer); Span span = spanList.get(0);
if (spanList.size() > 1) { if (!StringUtil.isBlank(span.getUserId())) {
for (int i = 1; i < spanList.size(); i++) { userId = span.getUserId();
this.build(spanList.get(i)); } else {
} throw new BuildTraceSpanTreeException(
} "spanList[0] 's userId is null");
}
return cid; cid = generateCID(spanList.get(0));
} treeRoot = new TraceSpanNode(null, null, null, null, spanList.get(0),
spanContainer);
private void build(Span span) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException { if (spanList.size() > 1) {
if (userId == null && span.getUserId() != null) { for (int i = 1; i < spanList.size(); i++) {
userId = span.getUserId(); this.build(spanList.get(i));
} }
}
TraceSpanNode clientOrServerNode = findNodeAndCreateVisualNodeIfNess(
span.getParentLevel(), span.getLevelId()); return cid;
if (clientOrServerNode != null) { }
clientOrServerNode.mergeSpan(span);
} private void build(Span span) throws BuildTraceSpanTreeException,
TraceSpanTreeNotFountException {
if (span.getLevelId() > 0) { if (userId == null && !StringUtil.isBlank(span.getUserId())) {
TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess( userId = span.getUserId();
span.getParentLevel(), span.getLevelId() - 1); }
/**
* Create node between foundNode and foundNode.next(maybe foundNode.next == null) TraceSpanNode clientOrServerNode = findNodeAndCreateVisualNodeIfNess(
*/ span.getParentLevel(), span.getLevelId());
new TraceSpanNode(null, null, foundNode, foundNode.next(this), span, spanContainer); if (clientOrServerNode != null) {
} else { clientOrServerNode.mergeSpan(span);
/** }
* levelId=0 find for parent level if parentLevelId = 0.0.1 then
* find node[parentLevelId=0.0,levelId=1] if (span.getLevelId() > 0) {
*/ TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess(
String parentLevel = span.getParentLevel(); span.getParentLevel(), span.getLevelId() - 1);
int idx = parentLevel.lastIndexOf("\\."); /**
if (idx < 0) { * Create node between foundNode and foundNode.next(maybe
throw new BuildTraceSpanTreeException("parentLevel=" * foundNode.next == null)
+ parentLevel + " is unexpected."); */
} new TraceSpanNode(null, null, foundNode, foundNode.next(this),
TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess( span, spanContainer);
parentLevel.substring(0, idx), } else {
Integer.parseInt(parentLevel.substring(idx + 1))); /**
/** * levelId=0 find for parent level if parentLevelId = 0.0.1 then
* Create sub node of using span data. FoundNode is parent node. * find node[parentLevelId=0.0,levelId=1]
*/ */
new TraceSpanNode(foundNode, null, null, null, span, spanContainer); String parentLevel = span.getParentLevel();
int idx = parentLevel.lastIndexOf("\\.");
} if (idx < 0) {
} throw new BuildTraceSpanTreeException("parentLevel="
+ parentLevel + " is unexpected.");
private TraceSpanNode findNodeAndCreateVisualNodeIfNess( }
String parentLevelId, int levelId) throws TraceSpanTreeNotFountException { TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess(
String levelDesc = StringUtil.isBlank(parentLevelId) ? (levelId + "") parentLevel.substring(0, idx),
: (parentLevelId + "." + levelId); Integer.parseInt(parentLevel.substring(idx + 1)));
String[] levelArray = levelDesc.split("\\."); /**
* Create sub node of using span data. FoundNode is parent node.
TraceSpanNode currentNode = treeRoot; */
String contextParentLevelId = ""; new TraceSpanNode(foundNode, null, null, null, span, spanContainer);
for (String currentLevel : levelArray) {
int currentLevelInt = Integer.parseInt(currentLevel); }
for (int i = 0; i < currentLevelInt; i++) { }
if (currentNode.hasNext()) {
currentNode = currentNode.next(this); private TraceSpanNode findNodeAndCreateVisualNodeIfNess(
} else { String parentLevelId, int levelId)
// create visual next node throws TraceSpanTreeNotFountException {
currentNode = new VisualTraceSpanNode(null, null, String levelDesc = StringUtil.isBlank(parentLevelId) ? (levelId + "")
currentNode, null, contextParentLevelId, i, spanContainer); : (parentLevelId + "." + levelId);
} String[] levelArray = levelDesc.split("\\.");
}
contextParentLevelId = contextParentLevelId == "" ? ("" + currentLevelInt) TraceSpanNode currentNode = treeRoot;
: (contextParentLevelId + "." + currentLevelInt); String contextParentLevelId = "";
if (currentNode.hasSub()) { for (String currentLevel : levelArray) {
currentNode = currentNode.sub(this); int currentLevelInt = Integer.parseInt(currentLevel);
} else { for (int i = 0; i < currentLevelInt; i++) {
// create visual sub node if (currentNode.hasNext()) {
currentNode = new VisualTraceSpanNode(currentNode, null, null, currentNode = currentNode.next(this);
null, contextParentLevelId, 0, spanContainer); } else {
} // create visual next node
} currentNode = new VisualTraceSpanNode(null, null,
currentNode, null, contextParentLevelId, i,
return currentNode; spanContainer);
} }
}
private String generateChainToken(Span level0Span) contextParentLevelId = contextParentLevelId == "" ? ("" + currentLevelInt)
throws BuildTraceSpanTreeException { : (contextParentLevelId + "." + currentLevelInt);
if (StringUtil.isBlank(level0Span.getParentLevel()) if (currentNode.hasSub()) {
&& level0Span.getLevelId() == 0) { currentNode = currentNode.sub(this);
StringBuilder chainTokenDesc = new StringBuilder(); } else {
chainTokenDesc.append(level0Span.getViewPointId()); // create visual sub node
return TokenGenerator.generateCID(chainTokenDesc.toString()); currentNode = new VisualTraceSpanNode(currentNode, null, null,
} else { null, contextParentLevelId, 0, spanContainer);
throw new BuildTraceSpanTreeException("tid:" }
+ level0Span.getTraceId() + " level0 span data is illegal"); }
}
} return currentNode;
}
private void beforeSerialize() throws TraceSpanTreeSerializeException { private String generateCID(Span level0Span)
for (TraceSpanNode treeNode : spanContainer) { throws BuildTraceSpanTreeException {
treeNode.serializeRef(); if (StringUtil.isBlank(level0Span.getParentLevel())
} && level0Span.getLevelId() == 0) {
} StringBuilder chainTokenDesc = new StringBuilder();
chainTokenDesc.append(userId).append("_");
public String serialize() throws TraceSpanTreeSerializeException { chainTokenDesc.append(level0Span.getViewPointId());
beforeSerialize(); return getTSBySpanTraceId(level0Span) + "_" + TokenGenerator.generateCID(chainTokenDesc.toString());
return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(this); } else {
} throw new BuildTraceSpanTreeException("tid:"
+ level0Span.getTraceId() + " level0 span data is illegal");
TraceSpanNode findNode(String nodeRefToken) throws TraceSpanTreeNotFountException{ }
if(traceSpanNodeMap.containsKey(nodeRefToken)){ }
return traceSpanNodeMap.get(nodeRefToken);
}else{ private static String getTSBySpanTraceId(Span span)
throw new TraceSpanTreeNotFountException("nodeRefToken=" + nodeRefToken + " not found."); throws BuildTraceSpanTreeException {
} try {
} Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(Long.parseLong(span.getTraceId().split(
@Override "\\.")[2])));
public void write(DataOutput out) throws IOException { return calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1);
try { } catch (Throwable t) {
out.write(serialize().getBytes()); throw new BuildTraceSpanTreeException("tid:" + span.getTraceId()
} catch (TraceSpanTreeSerializeException e) { + " is illegal.");
logger.error("Failed to serialize Chain Id[" + cid + "]", e); }
} }
}
private void beforeSerialize() throws TraceSpanTreeSerializeException {
@Override for (TraceSpanNode treeNode : spanContainer) {
public void readFields(DataInput in) throws IOException { treeNode.serializeRef();
String value = in.readLine(); }
try { }
JsonObject jsonObject = (JsonObject) new JsonParser().parse(value);
userId = jsonObject.get("userId").getAsString(); public String serialize() throws TraceSpanTreeSerializeException {
cid = jsonObject.get("cid").getAsString(); beforeSerialize();
treeRoot = new Gson().fromJson(jsonObject.get("treeRoot"), TraceSpanNode.class); return new GsonBuilder().excludeFieldsWithoutExposeAnnotation()
spanContainer = new Gson().fromJson(jsonObject.get("spanContainer"), .create().toJson(this);
new TypeToken<List<TraceSpanNode>>() { }
}.getType());
for(TraceSpanNode node : spanContainer){ TraceSpanNode findNode(String nodeRefToken)
traceSpanNodeMap.put(node.getNodeRefToken(), node); throws TraceSpanTreeNotFountException {
} if (traceSpanNodeMap.containsKey(nodeRefToken)) {
} catch (Exception e) { return traceSpanNodeMap.get(nodeRefToken);
logger.error("Failed to parse the value[" + value + "] to TraceSpanTree Object", e); } else {
} throw new TraceSpanTreeNotFountException("nodeRefToken="
} + nodeRefToken + " not found.");
}
public TraceSpanNode getTreeRoot() { }
return treeRoot;
} @Override
public void write(DataOutput out) throws IOException {
try {
out.write(serialize().getBytes());
} catch (TraceSpanTreeSerializeException e) {
logger.error("Failed to serialize Chain Id[" + cid + "]", e);
}
}
@Override
public void readFields(DataInput in) throws IOException {
String value = in.readLine();
try {
JsonObject jsonObject = (JsonObject) new JsonParser().parse(value);
userId = jsonObject.get("userId").getAsString();
cid = jsonObject.get("cid").getAsString();
treeRoot = new Gson().fromJson(jsonObject.get("treeRoot"),
TraceSpanNode.class);
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);
}
}
public TraceSpanNode getTreeRoot() {
return treeRoot;
}
public String getCid() {
return cid;
}
} }
...@@ -2,6 +2,8 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity; ...@@ -2,6 +2,8 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity;
import java.util.List; import java.util.List;
import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil;
public class VisualTraceSpanNode extends TraceSpanNode { public class VisualTraceSpanNode extends TraceSpanNode {
protected VisualTraceSpanNode(TraceSpanNode parent, TraceSpanNode sub, protected VisualTraceSpanNode(TraceSpanNode parent, TraceSpanNode sub,
...@@ -9,7 +11,13 @@ public class VisualTraceSpanNode extends TraceSpanNode { ...@@ -9,7 +11,13 @@ public class VisualTraceSpanNode extends TraceSpanNode {
int levelId, List<TraceSpanNode> spanContainer) { int levelId, List<TraceSpanNode> spanContainer) {
super(parent, sub, prev, next, parentLevelId, levelId, spanContainer); super(parent, sub, prev, next, parentLevelId, levelId, spanContainer);
//TODO: to set nodeToken /**set visual node token.<br/>
* for example: <br/>
* VisualNode[0.0]<br/>
* VisualNode[0.0.1]<br/>
* etc.<br/>
*/
nodeRefToken = "VisualNode[" + (StringUtil.isBlank(parentLevelId) ? "": nodeRefToken + ".") + levelId + "]";
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册