提交从TraceId追踪树跳转到典型调用链中
This commit is contained in:
parent
65e2a14a39
commit
76d5baabc4
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -1,12 +1,15 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
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;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
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) {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
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();
|
||||
}
|
||||
|
|
@ -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">
|
||||
|
|
|
|||
Loading…
Reference in New Issue