提交 76d5baab 编写于 作者: A ascrutae

提交从TraceId追踪树跳转到典型调用链中

上级 65e2a14a
......@@ -62,12 +62,16 @@ public class TraceNodeDao implements ITraceNodeDao {
Table table = hBaseUtils.getConnection().getTable(TableName.valueOf(CALL_CHAIN_TABLE_NAME));
Get g = new Get(Bytes.toBytes(traceId));
g.addColumn("call-chain".getBytes(), "0".getBytes());
g.addColumn("call-chain".getBytes(), "0-S".getBytes());
g.addColumn("call-chain".getBytes(), "0.0".getBytes());
Result r = table.get(g);
Map<String, TraceNodeInfo> traceLogMap = new HashMap<String, TraceNodeInfo>();
Map<String, TraceNodeInfo> rpcMap = new HashMap<String, TraceNodeInfo>();
Cell cell = r.getColumnLatestCell("call-chain".getBytes(), "0".getBytes());
if (cell == null){
cell = r.getColumnLatestCell("call-chain".getBytes(), "0-S".getBytes());
}
doDealSingleSpan(traceLogMap, rpcMap, cell);
cell = r.getColumnLatestCell("call-chain".getBytes(), "0.0".getBytes());
......
package com.ai.cloud.skywalking.web.dto;
import com.ai.cloud.skywalking.web.util.Constants;
import com.ai.cloud.skywalking.web.util.TokenGenerator;
import java.util.ArrayList;
import java.util.List;
public class TraceTreeInfo {
private String traceId;
private boolean hasCallChainTree = true;
private String callChainTreeToken = "";
private long beginTime;
private long endTime;
private List<TraceNodeInfo> nodes;
......@@ -78,4 +81,27 @@ public class TraceTreeInfo {
public void setMaxQueryNodeSize(int maxQueryNodeSize) {
this.maxQueryNodeSize = maxQueryNodeSize;
}
public void fillCallChainTreeToken(String entranceViewPoint) {
if (entranceViewPoint == null || entranceViewPoint.length() == 0){
hasCallChainTree = false;
}
callChainTreeToken = TokenGenerator.generateTreeToken(entranceViewPoint);
}
public boolean isHasCallChainTree() {
return hasCallChainTree;
}
public void setHasCallChainTree(boolean hasCallChainTree) {
this.hasCallChainTree = hasCallChainTree;
}
public String getCallChainTreeToken() {
return callChainTreeToken;
}
public void setCallChainTreeToken(String callChainTreeToken) {
this.callChainTreeToken = callChainTreeToken;
}
}
package com.ai.cloud.skywalking.web.service.impl;
import com.ai.cloud.skywalking.util.SpanLevelIdComparators;
import com.ai.cloud.skywalking.web.dao.inter.ITraceNodeDao;
import com.ai.cloud.skywalking.web.dto.TraceNodeInfo;
import com.ai.cloud.skywalking.web.dto.TraceNodesResult;
import com.ai.cloud.skywalking.web.dto.TraceTreeInfo;
import com.ai.cloud.skywalking.web.service.inter.ITraceTreeService;
import com.ai.cloud.skywalking.web.util.Constants;
import com.ai.cloud.skywalking.web.util.ReplaceAddressUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -34,13 +36,15 @@ public class TraceTreeService implements ITraceTreeService {
traceNodeInfoList = new ArrayList<TraceNodeInfo>();
traceNodeInfoList.addAll(traceTreeDao.queryEntranceNodeByTraceId(traceId));
traceTreeInfo.setRealNodeSize(Constants.MAX_SEARCH_SPAN_SIZE + 1);
}else{
} else {
traceTreeInfo.setRealNodeSize(traceNodeInfoList.size());
}
if (traceNodeInfoList.size() > 0){
if (traceNodeInfoList.size() > 0) {
final List<Long> endTime = new ArrayList<Long>();
endTime.add(0, traceNodeInfoList.get(0).getEndDate());
Collections.sort(traceNodeInfoList, new Comparator<TraceNodeInfo>() {
@Override
public int compare(TraceNodeInfo arg0, TraceNodeInfo arg1) {
......@@ -50,18 +54,22 @@ public class TraceTreeService implements ITraceTreeService {
if (endTime.get(0) < arg1.getEndDate()) {
endTime.set(0, arg1.getEndDate());
}
return arg0.getColId().compareTo(arg1.getColId());
return SpanLevelIdComparators.ascCompare(arg0.getColId(), arg1.getColId());
}
});
// 截断
int subIndex = traceNodeInfoList.size();
if (subIndex > Constants.MAX_SHOW_SPAN_SIZE){
if (subIndex > Constants.MAX_SHOW_SPAN_SIZE) {
subIndex = Constants.MAX_SHOW_SPAN_SIZE;
}
traceTreeInfo.setHasBeenSpiltNodes(traceNodeInfoList.subList(0, subIndex));
traceTreeInfo.setBeginTime(traceNodeInfoList.get(0).getStartDate());
traceTreeInfo.setEndTime(endTime.get(0));
if (traceNodeInfoList.get(0) != null) {
traceTreeInfo.fillCallChainTreeToken(ReplaceAddressUtil.replace(traceNodeInfoList.get(0).getViewPointId(),
traceNodeInfoList.get(0).getApplicationId()));
}
}
return traceTreeInfo;
......
package com.ai.cloud.skywalking.web.util;
public class ReplaceAddressUtil {
//ip:port regex
private static String IP_PORT_REGEX = "(([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))|localhost):([1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]|[0-9]{1,4})";
public static String replace(String origin, String applicationId){
return origin.replaceAll(IP_PORT_REGEX, applicationId);
}
}
......@@ -11,6 +11,10 @@ public final class TokenGenerator {
private static Logger logger = LogManager.getLogger(TokenGenerator.class);
public static String generateTreeToken(String originData) {
return "TREE_ID_" + generate(originData);
}
public static String generate(String originData) {
StringBuilder result = new StringBuilder();
if (originData != null) {
......
function changeData(data) {
var result = {
traceTree: {
traceId: "",
......@@ -26,6 +25,8 @@ function changeData(data) {
result.traceTree.maxQueryNodeSize = data.maxQueryNodeSize;
result.traceTree.startTimeStr = convertDate(new Date(result.traceTree.startTime));
result.traceTree.callIP = data.nodes[0].address;
result.traceTree.hasCallChainTree = data.hasCallChainTree;
result.traceTree.callChainTreeToken = data.callChainTreeToken;
var tmpNode;
var colId;
for (var i = 0; i < data.nodes.length; i++) {
......@@ -137,4 +138,10 @@ function convertDate(date) {
var minutes = date.getMinutes();
var second = date.getSeconds();
return year + "-" + month + "-" + date1 + " " + hour + ":" + minutes + ":" + second;
}
function gotoCallChainTree(obj){
var callChainTreeToken = $(obj).attr("value");
$("#searchKey").val("analysisresult:" + callChainTreeToken);
$("#searchBtn").click();
}
\ No newline at end of file
......@@ -153,6 +153,9 @@
{{else}}
{{>totalSize}}个调用节点,
{{/if}}消耗总时长:{{>totalTime}}ms。
{{if hasCallChainTree}}
<button class="btn btn-primary" onclick="javascript:gotoCallChainTree(this);" value="{{>callChainTreeToken}}">查看调用树</button>
{{/if}}
</h5>
</div>
<ul id="myTab" class="nav nav-tabs">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册