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

2.为虚拟节点创建一个明文的token(方便识别)
This commit is contained in:
wusheng 2016-03-02 16:20:53 +08:00
parent 0131a35dec
commit 3006c7fa32
3 changed files with 210 additions and 162 deletions

View File

@ -45,7 +45,7 @@ public class ChainBuildMapper extends TableMapper<Text, TraceSpanTree> {
TraceSpanTree tree = new TraceSpanTree();
tree.build(spanList);
context.write(new Text(tree.getTreeRoot().getNodeRefToken()), tree);
context.write(new Text(tree.getCid()), tree);
} catch (Throwable e) {
logger.error("Failed to mapper call chain[" + key.toString() + "]",
e);

View File

@ -4,13 +4,16 @@ 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;
@ -47,7 +50,8 @@ public class TraceSpanTree implements Writable {
public TraceSpanTree() {
}
public String build(List<Span> spanList) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException {
public String build(List<Span> spanList)
throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException {
if (spanList.size() == 0) {
throw new BuildTraceSpanTreeException("spanList is empty.");
}
@ -62,8 +66,16 @@ public class TraceSpanTree implements Writable {
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 (!StringUtil.isBlank(span.getUserId())) {
userId = span.getUserId();
} else {
throw new BuildTraceSpanTreeException(
"spanList[0] 's userId is null");
}
cid = generateCID(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));
@ -73,8 +85,9 @@ public class TraceSpanTree implements Writable {
return cid;
}
private void build(Span span) throws BuildTraceSpanTreeException, TraceSpanTreeNotFountException {
if (userId == null && span.getUserId() != null) {
private void build(Span span) throws BuildTraceSpanTreeException,
TraceSpanTreeNotFountException {
if (userId == null && !StringUtil.isBlank(span.getUserId())) {
userId = span.getUserId();
}
@ -88,9 +101,11 @@ public class TraceSpanTree implements Writable {
TraceSpanNode foundNode = findNodeAndCreateVisualNodeIfNess(
span.getParentLevel(), span.getLevelId() - 1);
/**
* Create node between foundNode and foundNode.next(maybe foundNode.next == null)
* Create node between foundNode and foundNode.next(maybe
* foundNode.next == null)
*/
new TraceSpanNode(null, null, foundNode, foundNode.next(this), span, spanContainer);
new TraceSpanNode(null, null, foundNode, foundNode.next(this),
span, spanContainer);
} else {
/**
* levelId=0 find for parent level if parentLevelId = 0.0.1 then
@ -114,7 +129,8 @@ public class TraceSpanTree implements Writable {
}
private TraceSpanNode findNodeAndCreateVisualNodeIfNess(
String parentLevelId, int levelId) throws TraceSpanTreeNotFountException {
String parentLevelId, int levelId)
throws TraceSpanTreeNotFountException {
String levelDesc = StringUtil.isBlank(parentLevelId) ? (levelId + "")
: (parentLevelId + "." + levelId);
String[] levelArray = levelDesc.split("\\.");
@ -129,7 +145,8 @@ public class TraceSpanTree implements Writable {
} else {
// create visual next node
currentNode = new VisualTraceSpanNode(null, null,
currentNode, null, contextParentLevelId, i, spanContainer);
currentNode, null, contextParentLevelId, i,
spanContainer);
}
}
contextParentLevelId = contextParentLevelId == "" ? ("" + currentLevelInt)
@ -146,19 +163,32 @@ public class TraceSpanTree implements Writable {
return currentNode;
}
private String generateChainToken(Span level0Span)
private String generateCID(Span level0Span)
throws BuildTraceSpanTreeException {
if (StringUtil.isBlank(level0Span.getParentLevel())
&& level0Span.getLevelId() == 0) {
StringBuilder chainTokenDesc = new StringBuilder();
chainTokenDesc.append(userId).append("_");
chainTokenDesc.append(level0Span.getViewPointId());
return TokenGenerator.generateCID(chainTokenDesc.toString());
return getTSBySpanTraceId(level0Span) + "_" + TokenGenerator.generateCID(chainTokenDesc.toString());
} else {
throw new BuildTraceSpanTreeException("tid:"
+ level0Span.getTraceId() + " level0 span data is illegal");
}
}
private static String getTSBySpanTraceId(Span span)
throws BuildTraceSpanTreeException {
try {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(Long.parseLong(span.getTraceId().split(
"\\.")[2])));
return calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1);
} catch (Throwable t) {
throw new BuildTraceSpanTreeException("tid:" + span.getTraceId()
+ " is illegal.");
}
}
private void beforeSerialize() throws TraceSpanTreeSerializeException {
for (TraceSpanNode treeNode : spanContainer) {
@ -168,14 +198,17 @@ public class TraceSpanTree implements Writable {
public String serialize() throws TraceSpanTreeSerializeException {
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)){
TraceSpanNode findNode(String nodeRefToken)
throws TraceSpanTreeNotFountException {
if (traceSpanNodeMap.containsKey(nodeRefToken)) {
return traceSpanNodeMap.get(nodeRefToken);
}else{
throw new TraceSpanTreeNotFountException("nodeRefToken=" + nodeRefToken + " not found.");
} else {
throw new TraceSpanTreeNotFountException("nodeRefToken="
+ nodeRefToken + " not found.");
}
}
@ -195,19 +228,26 @@ public class TraceSpanTree implements Writable {
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"),
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){
for (TraceSpanNode node : spanContainer) {
traceSpanNodeMap.put(node.getNodeRefToken(), node);
}
} 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);
}
}
public TraceSpanNode getTreeRoot() {
return treeRoot;
}
public String getCid() {
return cid;
}
}

View File

@ -2,6 +2,8 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity;
import java.util.List;
import com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil;
public class VisualTraceSpanNode extends TraceSpanNode {
protected VisualTraceSpanNode(TraceSpanNode parent, TraceSpanNode sub,
@ -9,7 +11,13 @@ public class VisualTraceSpanNode extends TraceSpanNode {
int levelId, List<TraceSpanNode> 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 + "]";
}