diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/TraceNodeDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/TraceNodeDao.java index fd9b8ab62..642d755b5 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/TraceNodeDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/TraceNodeDao.java @@ -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 traceLogMap = new HashMap(); Map rpcMap = new HashMap(); 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()); diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceTreeInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceTreeInfo.java index 37b67ffbb..2f1f13719 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceTreeInfo.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceTreeInfo.java @@ -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 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; + } } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/impl/TraceTreeService.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/impl/TraceTreeService.java index d6fbbb46e..22c489c31 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/impl/TraceTreeService.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/impl/TraceTreeService.java @@ -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(); 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 endTime = new ArrayList(); endTime.add(0, traceNodeInfoList.get(0).getEndDate()); + + Collections.sort(traceNodeInfoList, new Comparator() { @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; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/ReplaceAddressUtil.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/ReplaceAddressUtil.java new file mode 100644 index 000000000..a9cbcc2f2 --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/ReplaceAddressUtil.java @@ -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); + } + +} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/TokenGenerator.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/TokenGenerator.java index fa4005795..fadf8b0a1 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/TokenGenerator.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/TokenGenerator.java @@ -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) { diff --git a/skywalking-webui/src/main/webapp/bower_components/skywalking/js/tracelog.js b/skywalking-webui/src/main/webapp/bower_components/skywalking/js/tracelog.js index 59757ec0b..0f613993a 100644 --- a/skywalking-webui/src/main/webapp/bower_components/skywalking/js/tracelog.js +++ b/skywalking-webui/src/main/webapp/bower_components/skywalking/js/tracelog.js @@ -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(); } \ No newline at end of file diff --git a/skywalking-webui/src/main/webapp/pages/common/traceInfo.ftl b/skywalking-webui/src/main/webapp/pages/common/traceInfo.ftl index 0054e2888..5209f96ae 100644 --- a/skywalking-webui/src/main/webapp/pages/common/traceInfo.ftl +++ b/skywalking-webui/src/main/webapp/pages/common/traceInfo.ftl @@ -153,6 +153,9 @@ {{else}} {{>totalSize}}个调用节点, {{/if}}消耗总时长:{{>totalTime}}ms。 + {{if hasCallChainTree}} + + {{/if}}