diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/common/BaseController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/common/BaseController.java index efe2f9f58..73d25d3a1 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/common/BaseController.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/common/BaseController.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.web.common; import com.ai.cloud.skywalking.web.util.Constants; -import com.ai.cloud.skywalking.web.bo.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AlarmRuleMaintainController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AlarmRuleMaintainController.java index ed4475ef7..b5a7776ff 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AlarmRuleMaintainController.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AlarmRuleMaintainController.java @@ -1,8 +1,8 @@ package com.ai.cloud.skywalking.web.controller; -import com.ai.cloud.skywalking.web.bo.AlarmRuleInfo; -import com.ai.cloud.skywalking.web.bo.ConfigArgs; -import com.ai.cloud.skywalking.web.bo.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.AlarmRuleInfo; +import com.ai.cloud.skywalking.web.dto.ConfigArgs; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; import com.ai.cloud.skywalking.web.common.BaseController; import com.ai.cloud.skywalking.web.dao.inter.IAlarmRuleMaintainDao; import com.ai.cloud.skywalking.web.entity.AlarmRule; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/ApplicationConfigController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/ApplicationConfigController.java index c4f1c7150..90b2f520f 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/ApplicationConfigController.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/ApplicationConfigController.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.web.controller; -import com.ai.cloud.skywalking.web.bo.ApplicationInfo; -import com.ai.cloud.skywalking.web.bo.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.ApplicationInfo; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; import com.ai.cloud.skywalking.web.common.BaseController; import com.ai.cloud.skywalking.web.dao.inter.IAlarmRuleMaintainDao; import com.ai.cloud.skywalking.web.dao.inter.IApplicationsMaintainDao; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AuthFileController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AuthFileController.java index 37b0f030c..260228b69 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AuthFileController.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AuthFileController.java @@ -1,6 +1,6 @@ package com.ai.cloud.skywalking.web.controller; -import com.ai.cloud.skywalking.web.bo.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; import com.ai.cloud.skywalking.web.common.BaseController; import com.ai.cloud.skywalking.web.dao.inter.IAuthFileMaintainDao; import com.ai.cloud.skywalking.web.dao.inter.ISystemConfigMaintainDao; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/SearchController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/SearchController.java index 5619ef7df..d8961e9e4 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/SearchController.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/SearchController.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.web.controller; -import com.ai.cloud.skywalking.web.bo.LoginUserInfo; -import com.ai.cloud.skywalking.web.bo.TraceTreeInfo; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.TraceTreeInfo; import com.ai.cloud.skywalking.web.common.BaseController; import com.ai.cloud.skywalking.web.entity.CallChainTree; import com.ai.cloud.skywalking.web.service.inter.ICallChainTreeService; @@ -70,6 +70,7 @@ public class SearchController extends BaseController { jsonObject.put("message", "Cannot find TraceId[" + traceId + "]"); } } catch (Exception e) { + logger.error("Search tree Id ", e); jsonObject.put("code", "500"); jsonObject.put("result", "Fatal error"); } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserMaintainController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserMaintainController.java index 939f66469..3a7a23b91 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserMaintainController.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserMaintainController.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.web.controller; -import com.ai.cloud.skywalking.web.bo.LoginUserInfo; -import com.ai.cloud.skywalking.web.bo.SignInUserInfo; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.SignInUserInfo; import com.ai.cloud.skywalking.web.common.BaseController; import com.ai.cloud.skywalking.web.dao.inter.IUserMaintainDao; import com.ai.cloud.skywalking.web.entity.UserInfo; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/AlarmRuleMaintainDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/AlarmRuleMaintainDao.java index 367389cbb..7dee99c06 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/AlarmRuleMaintainDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/AlarmRuleMaintainDao.java @@ -3,7 +3,7 @@ package com.ai.cloud.skywalking.web.dao.impl; import com.ai.cloud.skywalking.web.dao.inter.IAlarmRuleMaintainDao; import com.ai.cloud.skywalking.web.entity.AlarmRule; import com.ai.cloud.skywalking.web.util.DBConnectUtil; -import com.ai.cloud.skywalking.web.bo.ConfigArgs; +import com.ai.cloud.skywalking.web.dto.ConfigArgs; import com.google.gson.Gson; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/ApplicationsMaintainDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/ApplicationsMaintainDao.java index 3e984abc6..110281c9a 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/ApplicationsMaintainDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/ApplicationsMaintainDao.java @@ -1,6 +1,6 @@ package com.ai.cloud.skywalking.web.dao.impl; -import com.ai.cloud.skywalking.web.bo.ApplicationInfo; +import com.ai.cloud.skywalking.web.dto.ApplicationInfo; import com.ai.cloud.skywalking.web.dao.inter.IApplicationsMaintainDao; import com.ai.cloud.skywalking.web.entity.Application; import com.ai.cloud.skywalking.web.util.DBConnectUtil; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/CallChainTreeDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/CallChainTreeDao.java index 97a157940..2a608138b 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/CallChainTreeDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/CallChainTreeDao.java @@ -1,14 +1,18 @@ package com.ai.cloud.skywalking.web.dao.impl; +import com.ai.cloud.skywalking.web.dto.AnlyResult; import com.ai.cloud.skywalking.web.dao.inter.ICallChainTreeDao; import com.ai.cloud.skywalking.web.entity.CallChainTree; import com.ai.cloud.skywalking.web.util.HBaseUtils; +import com.google.gson.Gson; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @@ -17,27 +21,28 @@ import java.io.IOException; @Repository public class CallChainTreeDao implements ICallChainTreeDao { + private Logger logger = LogManager.getLogger(CallChainTree.class); + @Autowired private HBaseUtils hBaseUtils; @Override - public CallChainTree queryTreeId(String treeId) throws IOException { + public AnlyResult queryEntranceAnlyResult(String entranceColumnName, String treeId) throws IOException { Table table = hBaseUtils.getConnection().getTable(TableName.valueOf("sw-chain-1day-summary")); Get get = new Get(treeId.getBytes()); Result result = table.get(get); if (result.rawCells().length == 0) { return null; } - CallChainTree chainTree = new CallChainTree(treeId); - for (Cell cell : result.rawCells()) { - if (cell.getValueArray().length > 0) { - String qualifier = Bytes.toString(cell.getQualifierArray(), - cell.getQualifierOffset(), cell.getQualifierLength()); - String[] qualifierArr = qualifier.split("@"); - chainTree.addNode(qualifierArr[0],qualifierArr[1]); - } - + Cell cell = result.getColumnLatestCell("chain_summary".getBytes(), entranceColumnName.getBytes()); + if (cell != null) { + String anlyResultStr = Bytes.toString(cell.getQualifierArray(), + cell.getQualifierOffset(), cell.getQualifierLength()); + logger.debug("traceId: {} , entranceColumnName : {}, anlyResultStr : {}", + treeId, entranceColumnName, anlyResultStr); + return new Gson().fromJson(anlyResultStr, AnlyResult.class); } - return null; + + return new AnlyResult(); } } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/ChainDetailDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/ChainDetailDao.java index d5fa7100b..10664a5a2 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/ChainDetailDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/ChainDetailDao.java @@ -1,5 +1,6 @@ package com.ai.cloud.skywalking.web.dao.impl; +import com.ai.cloud.skywalking.web.dto.HitTreeInfo; import com.ai.cloud.skywalking.web.dao.inter.IChainDetailDao; import com.ai.cloud.skywalking.web.util.DBConnectUtil; import org.apache.logging.log4j.LogManager; @@ -23,9 +24,9 @@ public class ChainDetailDao implements IChainDetailDao { private DBConnectUtil dbConnectUtil; @Override - public List queryChainTreeIds(String uid, String viewpoint) throws SQLException { - List treeIds = new ArrayList(); - String sql = "SELECT treeId FROM sw_chain_detail WHERE uid = ? AND viewpoint like ? "; + public List queryChainTreeIds(String uid, String viewpoint) throws SQLException { + List hitTreeInfos = new ArrayList(); + String sql = "SELECT DISTINCT treeId,traceLevelId, viewpoint FROM sw_chain_detail WHERE uid = ? AND viewpoint like ? "; Connection connection = dbConnectUtil.getConnection(); try { PreparedStatement preparedStatement = connection.prepareStatement(sql); @@ -34,7 +35,15 @@ public class ChainDetailDao implements IChainDetailDao { ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - treeIds.add(resultSet.getString("treeId")); + HitTreeInfo hitTreeInfo = new HitTreeInfo(resultSet.getString("treeId"), uid); + int index = hitTreeInfos.indexOf(hitTreeInfo); + if (index == -1) { + hitTreeInfos.add(hitTreeInfo); + } else { + hitTreeInfo = hitTreeInfos.get(index); + } + + hitTreeInfo.addHitTraceLevelId(resultSet.getString("traceLevelId"), resultSet.getString("viewpoint")); } } catch (Exception e) { logger.error("Failed to query treeIds for Viewpoint[{}]", viewpoint); @@ -44,6 +53,33 @@ public class ChainDetailDao implements IChainDetailDao { connection.close(); } } - return treeIds; + return hitTreeInfos; + } + + @Override + public String queryChainViewPoint(String traceLevelId, String treeId, String uid) throws SQLException { + String viewpoint = null; + String sql = "SELECT DISTINCT viewpoint FROM sw_chain_detail WHERE uid = ? AND treeId = ? AND traceLevelId = ? "; + Connection connection = dbConnectUtil.getConnection(); + try { + PreparedStatement preparedStatement = connection.prepareStatement(sql); + preparedStatement.setString(1, uid); + preparedStatement.setString(2, treeId); + preparedStatement.setString(3, traceLevelId); + + ResultSet resultSet = preparedStatement.executeQuery(); + if (resultSet.next()) { + viewpoint = resultSet.getString("viewpoint"); + } + } catch (Exception e) { + logger.error("Failed to query treeIds for Viewpoint[{}]", viewpoint); + throw new RuntimeException("Failed to query treeIds for " + viewpoint, e); + } finally { + if (connection != null) { + connection.close(); + } + } + + return viewpoint; } } 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 5cb7d3a00..fd9b8ab62 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 @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.web.dao.impl; -import com.ai.cloud.skywalking.web.bo.TraceNodeInfo; -import com.ai.cloud.skywalking.web.bo.TraceTreeInfo; +import com.ai.cloud.skywalking.web.dto.TraceNodeInfo; +import com.ai.cloud.skywalking.web.dto.TraceNodesResult; import com.ai.cloud.skywalking.web.dao.inter.ITraceNodeDao; import com.ai.cloud.skywalking.web.util.Constants; import com.ai.cloud.skywalking.web.util.HBaseUtils; @@ -11,7 +11,6 @@ import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.filter.ColumnCountGetFilter; import org.apache.hadoop.hbase.util.Bytes; @@ -20,9 +19,8 @@ import org.springframework.stereotype.Repository; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -38,58 +36,59 @@ public class TraceNodeDao implements ITraceNodeDao { @Override - public TraceTreeInfo queryTraceNodesByTraceId(String traceId) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { - TraceTreeInfo traceTreeInfo = null; - + public TraceNodesResult queryTraceNodesByTraceId(String traceId) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Table table = hBaseUtils.getConnection().getTable(TableName.valueOf(CALL_CHAIN_TABLE_NAME)); Get g = new Get(Bytes.toBytes(traceId)); - g.setFilter(new ColumnCountGetFilter(10001)); + g.setFilter(new ColumnCountGetFilter(Constants.MAX_SEARCH_SPAN_SIZE + 1)); Result r = table.get(g); Map traceLogMap = new HashMap(); Map rpcMap = new HashMap(); - int totalSize = 10001; - if (r.rawCells().length < 10000) { + TraceNodesResult result = new TraceNodesResult(); + if (r.rawCells().length < Constants.MAX_SEARCH_SPAN_SIZE) { for (Cell cell : r.rawCells()) { - if (cell.getValueArray().length > 0) { - dealSingleSpanCell(traceLogMap, rpcMap, cell); - } + doDealSingleSpan(traceLogMap, rpcMap, cell); } - totalSize = r.rawCells().length; - } else { - g = new Get(Bytes.toBytes(traceId)); - g.addColumn("call-chain".getBytes(), "0".getBytes()); - g.addColumn("call-chain".getBytes(), "0.0".getBytes()); - r = table.get(g); - //获取0和0.0两个节点 - Cell cell = r.getColumnLatestCell("call-chain".getBytes(), "0".getBytes()); - dealSingleSpanCell(traceLogMap, rpcMap, cell); - cell = r.getColumnLatestCell("call-chain".getBytes(), "0.0".getBytes()); - dealSingleSpanCell(traceLogMap, rpcMap, cell); + computeRPCInfo(rpcMap, traceLogMap); + result.setOverMaxQueryNodeNumber(false); + result.setResult(traceLogMap.values()); + }else{ + result.setOverMaxQueryNodeNumber(true); } - computeRPCInfo(rpcMap, traceLogMap); - - if (traceLogMap != null && traceLogMap.size() > 0) { - List nodes = new ArrayList(); - nodes.addAll(traceLogMap.values()); - traceTreeInfo = new TraceTreeInfo(traceId, nodes); - traceTreeInfo.setNodeSize(totalSize); - } - - return traceTreeInfo; + return result; } - private void dealSingleSpanCell(Map traceLogMap, Map rpcMap, Cell cell) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { - if (cell.getValueArray().length == 0) - return; - String colId = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), - cell.getQualifierLength()); - TraceNodeInfo tmpEntry = TraceNodeInfo.convert( - Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()), colId); - // 特殊处理RPC的服务端信息 - if (colId.endsWith(Constants.RPC_END_FLAG)) { - rpcMap.put(colId.substring(0, colId.lastIndexOf(Constants.RPC_END_FLAG)), tmpEntry); - } else { - SortUtil.addCurNodeTreeMapKey(traceLogMap, colId, tmpEntry); + @Override + public Collection queryEntranceNodeByTraceId(String traceId) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { + 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.0".getBytes()); + Result r = table.get(g); + + Map traceLogMap = new HashMap(); + Map rpcMap = new HashMap(); + Cell cell = r.getColumnLatestCell("call-chain".getBytes(), "0".getBytes()); + doDealSingleSpan(traceLogMap, rpcMap, cell); + + cell = r.getColumnLatestCell("call-chain".getBytes(), "0.0".getBytes()); + doDealSingleSpan(traceLogMap, rpcMap, cell); + + computeRPCInfo(rpcMap, traceLogMap); + return traceLogMap.values(); + } + + private void doDealSingleSpan(Map traceLogMap, Map rpcMap, Cell cell) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + if (cell != null && cell.getValueArray().length > 0) { + String colId = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), + cell.getQualifierLength()); + TraceNodeInfo tmpEntry = TraceNodeInfo.convert( + Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()), colId); + // 特殊处理RPC的服务端信息 + if (colId.endsWith(Constants.RPC_END_FLAG)) { + rpcMap.put(colId.substring(0, colId.lastIndexOf(Constants.RPC_END_FLAG)), tmpEntry); + } else { + SortUtil.addCurNodeTreeMapKey(traceLogMap, colId, tmpEntry); + } } } @@ -112,7 +111,7 @@ public class TraceNodeDao implements ITraceNodeDao { clientLog.setAddress(serverLog.getAddress()); if (StringUtil.isBlank(clientLog.getExceptionStack())) { clientLog.setExceptionStack(serverLog.getExceptionStack()); - } else { + }else{ clientLog.setServerExceptionStr(serverLog.getServerExceptionStr()); } System.out.println("1"); diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/UserMaintainDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/UserMaintainDao.java index 594b0cad5..6e91b5368 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/UserMaintainDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/UserMaintainDao.java @@ -2,8 +2,8 @@ package com.ai.cloud.skywalking.web.dao.impl; import com.ai.cloud.skywalking.web.dao.inter.IUserMaintainDao; import com.ai.cloud.skywalking.web.util.DBConnectUtil; -import com.ai.cloud.skywalking.web.bo.LoginUserInfo; -import com.ai.cloud.skywalking.web.bo.SignInUserInfo; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.SignInUserInfo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IApplicationsMaintainDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IApplicationsMaintainDao.java index 3a7cde034..935f7d29e 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IApplicationsMaintainDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IApplicationsMaintainDao.java @@ -1,6 +1,6 @@ package com.ai.cloud.skywalking.web.dao.inter; -import com.ai.cloud.skywalking.web.bo.ApplicationInfo; +import com.ai.cloud.skywalking.web.dto.ApplicationInfo; import com.ai.cloud.skywalking.web.entity.Application; import java.sql.SQLException; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/ICallChainTreeDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/ICallChainTreeDao.java index 3bac962ae..a5d1acd99 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/ICallChainTreeDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/ICallChainTreeDao.java @@ -1,6 +1,6 @@ package com.ai.cloud.skywalking.web.dao.inter; -import com.ai.cloud.skywalking.web.entity.CallChainTree; +import com.ai.cloud.skywalking.web.dto.AnlyResult; import java.io.IOException; @@ -8,5 +8,5 @@ import java.io.IOException; * Created by xin on 16-4-6. */ public interface ICallChainTreeDao { - CallChainTree queryTreeId(String treeId) throws IOException; + AnlyResult queryEntranceAnlyResult(String entranceColumnName, String treeId) throws IOException; } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IChainDetailDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IChainDetailDao.java index 8342ba43b..f3722a53b 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IChainDetailDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IChainDetailDao.java @@ -1,5 +1,7 @@ package com.ai.cloud.skywalking.web.dao.inter; +import com.ai.cloud.skywalking.web.dto.HitTreeInfo; + import java.sql.SQLException; import java.util.List; @@ -7,5 +9,7 @@ import java.util.List; * Created by xin on 16-4-6. */ public interface IChainDetailDao { - List queryChainTreeIds(String uid, String viewpoint) throws SQLException; + List queryChainTreeIds(String uid, String viewpoint) throws SQLException; + + String queryChainViewPoint(String traceLevelId, String treeId, String uid) throws SQLException; } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/ITraceNodeDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/ITraceNodeDao.java index 9a7f47896..b6aae2b2b 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/ITraceNodeDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/ITraceNodeDao.java @@ -1,16 +1,18 @@ package com.ai.cloud.skywalking.web.dao.inter; -import com.ai.cloud.skywalking.web.bo.TraceNodeInfo; -import com.ai.cloud.skywalking.web.bo.TraceTreeInfo; +import com.ai.cloud.skywalking.web.dto.TraceNodeInfo; +import com.ai.cloud.skywalking.web.dto.TraceNodesResult; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.Map; +import java.util.Collection; /** * Created by xin on 16-3-30. */ public interface ITraceNodeDao { - TraceTreeInfo queryTraceNodesByTraceId(String traceId) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException; + TraceNodesResult queryTraceNodesByTraceId(String traceId) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException; + + Collection queryEntranceNodeByTraceId(String traceId) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException; } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IUserMaintainDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IUserMaintainDao.java index 456746ee7..d6492d73b 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IUserMaintainDao.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IUserMaintainDao.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.web.dao.inter; -import com.ai.cloud.skywalking.web.bo.LoginUserInfo; -import com.ai.cloud.skywalking.web.bo.SignInUserInfo; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.SignInUserInfo; import java.sql.SQLException; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/AlarmRuleInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/AlarmRuleInfo.java similarity index 93% rename from skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/AlarmRuleInfo.java rename to skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/AlarmRuleInfo.java index e51bb835f..2a0aae196 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/AlarmRuleInfo.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/AlarmRuleInfo.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.web.bo; +package com.ai.cloud.skywalking.web.dto; import com.ai.cloud.skywalking.web.entity.AlarmRule; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/AnlyResult.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/AnlyResult.java new file mode 100644 index 000000000..17b9c686f --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/AnlyResult.java @@ -0,0 +1,27 @@ +package com.ai.cloud.skywalking.web.dto; + +/** + * Created by xin on 16-4-12. + */ +public class AnlyResult { + private long totalCall; + private long totalCostTime; + private long correctNumber; + private long humanInterruptionNumber; + + public long getTotalCall() { + return totalCall; + } + + public long getTotalCostTime() { + return totalCostTime; + } + + public long getCorrectNumber() { + return correctNumber; + } + + public long getHumanInterruptionNumber() { + return humanInterruptionNumber; + } +} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/ApplicationInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/ApplicationInfo.java similarity index 94% rename from skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/ApplicationInfo.java rename to skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/ApplicationInfo.java index 5dec7db66..40ac498da 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/ApplicationInfo.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/ApplicationInfo.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.web.bo; +package com.ai.cloud.skywalking.web.dto; import com.ai.cloud.skywalking.web.entity.Application; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/ConfigArgs.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/ConfigArgs.java similarity index 93% rename from skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/ConfigArgs.java rename to skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/ConfigArgs.java index 694932787..91232359c 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/ConfigArgs.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/ConfigArgs.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.web.bo; +package com.ai.cloud.skywalking.web.dto; import java.io.Serializable; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/HitTreeInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/HitTreeInfo.java new file mode 100644 index 000000000..41d348cd9 --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/HitTreeInfo.java @@ -0,0 +1,161 @@ +package com.ai.cloud.skywalking.web.dto; + +import com.ai.cloud.skywalking.web.dao.inter.IChainDetailDao; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.sql.SQLException; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by xin on 16-4-11. + */ +public class HitTreeInfo { + private Logger logger = LogManager.getLogger(HitTreeInfo.class); + private String treeId; + private Map hitTraceLevelId; + private String entranceViewPoint; + private String uid; + + public HitTreeInfo(String treeId, String uid) { + this.treeId = treeId; + this.uid = uid; + this.hitTraceLevelId = new HashMap(); + } + + public void addHitTraceLevelId(String traceLevelId, String viewPoint) { + this.hitTraceLevelId.put(traceLevelId, viewPoint); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + HitTreeInfo that = (HitTreeInfo) o; + + return treeId != null ? treeId.equals(that.treeId) : that.treeId == null; + } + + @Override + public int hashCode() { + return treeId != null ? treeId.hashCode() : 0; + } + + public String getTreeId() { + return treeId; + } + + public Map getHitTraceLevelId() { + return hitTraceLevelId; + } + + private String[] spiltParentLevelIdAndLevelId(String levelId) { + String[] result = new String[2]; + int indexOf = levelId.lastIndexOf("."); + if (indexOf == -1) { + // 根节点 + result[0] = ""; + result[1] = levelId; + return result; + } + + result[0] = levelId.substring(0, indexOf - 1); + result[1] = levelId.substring(indexOf + 1); + + return result; + } + + public String getCurrentMonthAnlyTableName() { + Calendar calendar = Calendar.getInstance(); + String monthSuffix = "/" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1); + return getTreeId() + monthSuffix; + } + + public void setEntranceViewPoint(String entranceViewPoint) { + this.entranceViewPoint = entranceViewPoint; + } + + public String getEntranceViewPoint() { + return entranceViewPoint; + } + + public void guessLevelIdAndSearchViewPoint(IChainDetailDao iChainDetailDao) throws SQLException { + String tmpViewpoint; + for (String levelId : hitTraceLevelId.keySet()) { + String[] result = spiltParentLevelIdAndLevelId(levelId); + if (result[0].length() == 0) { + // 根节点,单独处理 + // 当前下级 + tmpViewpoint = iChainDetailDao.queryChainViewPoint(result[0] + ".0", + treeId, uid); + if (tmpViewpoint != null) { + addHitTraceLevelId(getPreBrotherLevelId(result), tmpViewpoint); + } + } else { + //找上级 + guessPreTraceLevelId(iChainDetailDao, result); + //找下级 + guessNextTraceLevelId(iChainDetailDao, result); + } + } + logger.debug("hitTraceLevelId : {}", hitTraceLevelId); + } + + private void guessNextTraceLevelId(IChainDetailDao iChainDetailDao, String[] result) throws SQLException { + String tmpViewpoint = iChainDetailDao.queryChainViewPoint(getSubTraceLevelId(result), + treeId, uid); + String traceLevelId = null; + if (tmpViewpoint != null) { + traceLevelId = getSubTraceLevelId(result); + } else { + traceLevelId = getBrotherOfParentLevelId(result); + if (traceLevelId != null && traceLevelId.length() > 0) + tmpViewpoint = iChainDetailDao.queryChainViewPoint(traceLevelId, treeId, uid); + } + + if (tmpViewpoint != null) { + addHitTraceLevelId(traceLevelId, tmpViewpoint); + } + } + + private void guessPreTraceLevelId(IChainDetailDao iChainDetailDao, String[] result) throws SQLException { + String tmpViewpoint = null; + String traceLevelId = null; + if ((Integer.parseInt(result[1]) - 1) != -1) { + traceLevelId = getPreBrotherLevelId(result); + tmpViewpoint = iChainDetailDao.queryChainViewPoint(traceLevelId, + treeId, uid); + } else { + String[] resultA = spiltParentLevelIdAndLevelId(result[0]); + if (result[0].length() != 0) { + traceLevelId = resultA[0]; + tmpViewpoint = iChainDetailDao.queryChainViewPoint(traceLevelId, + treeId, uid); + } + } + + if (tmpViewpoint != null) { + addHitTraceLevelId(traceLevelId, tmpViewpoint); + } + } + + private String getPreBrotherLevelId(String[] result) { + return result[0] + "." + (Integer.parseInt(result[1]) - 1); + } + + private String getBrotherOfParentLevelId(String[] result) { + String[] resultB = spiltParentLevelIdAndLevelId(result[0]); + if (resultB[1] != null && resultB.length > 0) { + return resultB[0] + (Integer.parseInt(resultB[1]) + 1); + } + + return ""; + } + + private String getSubTraceLevelId(String[] result) { + return result[0] + "." + (Integer.parseInt(result[1]) + 1); + } +} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/LoginUserInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/LoginUserInfo.java similarity index 77% rename from skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/LoginUserInfo.java rename to skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/LoginUserInfo.java index d4a84e7bb..997aa09a4 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/LoginUserInfo.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/LoginUserInfo.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.web.bo; +package com.ai.cloud.skywalking.web.dto; import com.ai.cloud.skywalking.web.entity.UserInfo; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/MailInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/MailInfo.java similarity index 94% rename from skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/MailInfo.java rename to skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/MailInfo.java index 1ab4ac48c..89e3d7268 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/MailInfo.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/MailInfo.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.web.bo; +package com.ai.cloud.skywalking.web.dto; import java.io.Serializable; import java.util.Arrays; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/SignInUserInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/SignInUserInfo.java similarity index 77% rename from skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/SignInUserInfo.java rename to skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/SignInUserInfo.java index 3b80d2d43..aa6152e0d 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/SignInUserInfo.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/SignInUserInfo.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.web.bo; +package com.ai.cloud.skywalking.web.dto; import com.ai.cloud.skywalking.web.entity.UserInfo; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TimeLineEntry.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TimeLineEntry.java similarity index 93% rename from skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TimeLineEntry.java rename to skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TimeLineEntry.java index 600f20ca0..e2b7de692 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TimeLineEntry.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TimeLineEntry.java @@ -1,7 +1,7 @@ /** * */ -package com.ai.cloud.skywalking.web.bo; +package com.ai.cloud.skywalking.web.dto; public class TimeLineEntry { diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TraceNodeInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceNodeInfo.java similarity index 99% rename from skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TraceNodeInfo.java rename to skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceNodeInfo.java index 0bd9b05b7..7bdf97bdd 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TraceNodeInfo.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceNodeInfo.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.web.bo; +package com.ai.cloud.skywalking.web.dto; import com.ai.cloud.skywalking.protocol.Span; import com.ai.cloud.skywalking.web.util.Constants; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceNodesResult.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceNodesResult.java new file mode 100644 index 000000000..912a4660d --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceNodesResult.java @@ -0,0 +1,35 @@ +package com.ai.cloud.skywalking.web.dto; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created by xin on 16-4-13. + */ +public class TraceNodesResult { + private boolean isOverMaxQueryNodeNumber; + + private List result; + + public TraceNodesResult(){ + result = new ArrayList(); + } + + + public boolean isOverMaxQueryNodeNumber() { + return isOverMaxQueryNodeNumber; + } + + public void setOverMaxQueryNodeNumber(boolean overMaxQueryNodeNumber) { + isOverMaxQueryNodeNumber = overMaxQueryNodeNumber; + } + + public List getResult() { + return result; + } + + public void setResult(Collection result) { + this.result.addAll(result); + } +} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TraceTreeInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceTreeInfo.java similarity index 52% rename from skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TraceTreeInfo.java rename to skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceTreeInfo.java index 5ea9fdfd6..37b67ffbb 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TraceTreeInfo.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceTreeInfo.java @@ -1,5 +1,8 @@ -package com.ai.cloud.skywalking.web.bo; +package com.ai.cloud.skywalking.web.dto; +import com.ai.cloud.skywalking.web.util.Constants; + +import java.util.ArrayList; import java.util.List; public class TraceTreeInfo { @@ -8,10 +11,16 @@ public class TraceTreeInfo { private long endTime; private List nodes; private int nodeSize; + private int maxShowNodeSize = Constants.MAX_SHOW_SPAN_SIZE; + private int maxQueryNodeSize = Constants.MAX_SEARCH_SPAN_SIZE; + + public TraceTreeInfo(String traceId) { + this.traceId = traceId; + } public TraceTreeInfo(String traceId, List nodes) { this.traceId = traceId; - this.nodes = nodes; + nodeSize = nodes.size(); } public void setBeginTime(long beginTime) { @@ -42,15 +51,31 @@ public class TraceTreeInfo { return nodes; } - public void setNodes(List nodes) { + public void setHasBeenSpiltNodes(List nodes) { this.nodes = nodes; } - public void setNodeSize(int nodeSize) { + public void setRealNodeSize(int nodeSize) { this.nodeSize = nodeSize; } public int getNodeSize() { return nodeSize; } + + public int getMaxShowNodeSize() { + return maxShowNodeSize; + } + + public void setMaxShowNodeSize(int maxShowNodeSize) { + this.maxShowNodeSize = maxShowNodeSize; + } + + public int getMaxQueryNodeSize() { + return maxQueryNodeSize; + } + + public void setMaxQueryNodeSize(int maxQueryNodeSize) { + this.maxQueryNodeSize = maxQueryNodeSize; + } } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/AlarmRule.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/AlarmRule.java index a62cc9fdc..eca344e87 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/AlarmRule.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/AlarmRule.java @@ -1,6 +1,6 @@ package com.ai.cloud.skywalking.web.entity; -import com.ai.cloud.skywalking.web.bo.ConfigArgs; +import com.ai.cloud.skywalking.web.dto.ConfigArgs; import java.sql.Timestamp; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/Application.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/Application.java index 9a5e39aa9..86c70ac5d 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/Application.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/Application.java @@ -1,6 +1,6 @@ package com.ai.cloud.skywalking.web.entity; -import com.ai.cloud.skywalking.web.bo.ConfigArgs; +import com.ai.cloud.skywalking.web.dto.ConfigArgs; import java.sql.Timestamp; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/CallChainTree.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/CallChainTree.java index 056cc92d9..2f8e46736 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/CallChainTree.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/CallChainTree.java @@ -1,27 +1,30 @@ package com.ai.cloud.skywalking.web.entity; -import java.util.ArrayList; -import java.util.List; +import com.ai.cloud.skywalking.web.dto.AnlyResult; + +import java.util.HashMap; +import java.util.Map; /** * Created by xin on 16-4-6. */ public class CallChainTree { private String treeId; - private List nodes; - private String entranceViewpoint; + private Map nodes; + private AnlyResult entranceAnlyResult; - public CallChainTree(String treeId) { + public CallChainTree(String treeId, String entranceViewpoint) { this.treeId = treeId; - nodes = new ArrayList(); + this.entranceViewpoint = entranceViewpoint; + nodes = new HashMap(); } - public void addNode(String levelId, String viewpoint) { - if ("0".equals(levelId)) { - entranceViewpoint = viewpoint; - } + public void setEntranceAnlyResult(AnlyResult entranceAnlyResult) { + this.entranceAnlyResult = entranceAnlyResult; + } - nodes.add(new CallChainTreeNode(levelId, viewpoint)); + public void addNodes(Map nodes) { + this.nodes.putAll(nodes); } } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/CallChainTreeNode.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/CallChainTreeNode.java index 1816768e5..3ea08a5ab 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/CallChainTreeNode.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/entity/CallChainTreeNode.java @@ -12,4 +12,8 @@ public class CallChainTreeNode { this.traceLevelId = traceLevelId; this.viewPoint = viewpoint; } + + public String getTraceLevelId() { + return traceLevelId; + } } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/filter/AccessControllerFilter.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/filter/AccessControllerFilter.java index 4514a1222..7447ad9c0 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/filter/AccessControllerFilter.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/filter/AccessControllerFilter.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.web.filter; import com.ai.cloud.skywalking.web.util.Constants; -import com.ai.cloud.skywalking.web.bo.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/impl/CallChainTreeService.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/impl/CallChainTreeService.java index 13a973b31..dbde46fce 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/impl/CallChainTreeService.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/impl/CallChainTreeService.java @@ -1,5 +1,6 @@ package com.ai.cloud.skywalking.web.service.impl; +import com.ai.cloud.skywalking.web.dto.HitTreeInfo; import com.ai.cloud.skywalking.web.dao.inter.ICallChainTreeDao; import com.ai.cloud.skywalking.web.dao.inter.IChainDetailDao; import com.ai.cloud.skywalking.web.entity.CallChainTree; @@ -12,7 +13,6 @@ import org.springframework.stereotype.Service; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Calendar; import java.util.List; @Service @@ -28,16 +28,24 @@ public class CallChainTreeService implements ICallChainTreeService { @Override public List queryCurrentMonthCallChainTree(String uid, String viewpoint) throws SQLException, IOException { - List chainTreeIds = iChainDetailDao.queryChainTreeIds(uid,viewpoint); - logger.info("viewpoint key :{}, chainTreeIds : {}", viewpoint, chainTreeIds); + List hitTreeInfos = iChainDetailDao.queryChainTreeIds(uid, viewpoint); + for (HitTreeInfo hitTreeInfo : hitTreeInfos) { + hitTreeInfo.guessLevelIdAndSearchViewPoint(iChainDetailDao); + } + + logger.info("viewpoint key :{}, chainTreeIds : {}", viewpoint, hitTreeInfos); List callChainTrees = new ArrayList(); - Calendar calendar = Calendar.getInstance(); - String monthSuffix = "/" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1); - for (String treeId : chainTreeIds) { - CallChainTree chainTree = chainTreeDao.queryTreeId(treeId + monthSuffix); - if (chainTree == null) { + for (HitTreeInfo hitTreeInfo : hitTreeInfos) { + String entranceViewpoint = iChainDetailDao.queryChainViewPoint("0", hitTreeInfo.getTreeId(), uid); + if (entranceViewpoint == null || entranceViewpoint.length() == 0) { continue; } + hitTreeInfo.setEntranceViewPoint(entranceViewpoint); + CallChainTree chainTree = new CallChainTree(hitTreeInfo.getTreeId(), entranceViewpoint); + chainTree.setEntranceAnlyResult(chainTreeDao.queryEntranceAnlyResult( + "0@" + hitTreeInfo.getEntranceViewPoint(), + hitTreeInfo.getCurrentMonthAnlyTableName())); + chainTree.addNodes(hitTreeInfo.getHitTraceLevelId()); callChainTrees.add(chainTree); } logger.info("viewpoint key :{}, chainTree size : {}", viewpoint, callChainTrees.size()); 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 cd70f04a3..d6fbbb46e 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,15 +1,20 @@ package com.ai.cloud.skywalking.web.service.impl; -import com.ai.cloud.skywalking.web.bo.TraceNodeInfo; -import com.ai.cloud.skywalking.web.bo.TraceTreeInfo; 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 org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; /** * Created by xin on 16-3-30. @@ -22,13 +27,21 @@ public class TraceTreeService implements ITraceTreeService { @Override public TraceTreeInfo queryTraceTreeByTraceId(String traceId) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, IOException { + TraceTreeInfo traceTreeInfo = new TraceTreeInfo(traceId); + TraceNodesResult traceNodesResult = traceTreeDao.queryTraceNodesByTraceId(traceId); + List traceNodeInfoList = traceNodesResult.getResult(); + if (traceNodesResult.isOverMaxQueryNodeNumber()) { + traceNodeInfoList = new ArrayList(); + traceNodeInfoList.addAll(traceTreeDao.queryEntranceNodeByTraceId(traceId)); + traceTreeInfo.setRealNodeSize(Constants.MAX_SEARCH_SPAN_SIZE + 1); + }else{ + traceTreeInfo.setRealNodeSize(traceNodeInfoList.size()); + } - TraceTreeInfo traceTreeInfo = traceTreeDao.queryTraceNodesByTraceId(traceId); - if (traceTreeInfo != null) { - List nodes = traceTreeInfo.getNodes(); + if (traceNodeInfoList.size() > 0){ final List endTime = new ArrayList(); - endTime.add(0, nodes.get(0).getEndDate()); - Collections.sort(nodes, new Comparator() { + endTime.add(0, traceNodeInfoList.get(0).getEndDate()); + Collections.sort(traceNodeInfoList, new Comparator() { @Override public int compare(TraceNodeInfo arg0, TraceNodeInfo arg1) { if (endTime.get(0) < arg0.getEndDate()) { @@ -40,8 +53,14 @@ public class TraceTreeService implements ITraceTreeService { return arg0.getColId().compareTo(arg1.getColId()); } }); - long beginTime = nodes.get(0).getStartDate(); - traceTreeInfo.setBeginTime(beginTime); + + // 截断 + int subIndex = traceNodeInfoList.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)); } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/inter/ITraceTreeService.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/inter/ITraceTreeService.java index c9914c4e0..07c607db1 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/inter/ITraceTreeService.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/inter/ITraceTreeService.java @@ -1,6 +1,6 @@ package com.ai.cloud.skywalking.web.service.inter; -import com.ai.cloud.skywalking.web.bo.TraceTreeInfo; +import com.ai.cloud.skywalking.web.dto.TraceTreeInfo; import java.io.IOException; import java.lang.reflect.InvocationTargetException; diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/Constants.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/Constants.java index 069669f20..bea7dae31 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/Constants.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/Constants.java @@ -41,4 +41,8 @@ public class Constants { put("9", "MISSING"); } }; + + public static int MAX_SEARCH_SPAN_SIZE = 10000; + + public static int MAX_SHOW_SPAN_SIZE = 200; } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/SortUtil.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/SortUtil.java index c3d81f2fc..ab26488ed 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/SortUtil.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/SortUtil.java @@ -3,7 +3,7 @@ */ package com.ai.cloud.skywalking.web.util; -import com.ai.cloud.skywalking.web.bo.TraceNodeInfo; +import com.ai.cloud.skywalking.web.dto.TraceNodeInfo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; 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 7599d48d4..81fa494e1 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 @@ -15,6 +15,9 @@ function changeData(data) { result.traceTree.startTime = data.beginTime; result.traceTree.endTime = data.endTime; result.traceTree.totalSize = data.nodeSize; + result.traceTree.showSize = data.nodes.length; + result.traceTree.maxShowNodeSize = data.maxShowNodeSize; + result.traceTree.maxQueryNodeSize = data.maxQueryNodeSize; result.traceTree.startTimeStr = convertDate(new Date(result.traceTree.startTime)); result.traceTree.callIP = data.nodes[0].address; var tmpNode; diff --git a/skywalking-webui/src/main/webapp/pages/anls-result/analysisResult.ftl b/skywalking-webui/src/main/webapp/pages/anls-result/analysisResult.ftl index bdae3a210..f2ddca6ee 100644 --- a/skywalking-webui/src/main/webapp/pages/anls-result/analysisResult.ftl +++ b/skywalking-webui/src/main/webapp/pages/anls-result/analysisResult.ftl @@ -1,54 +1,25 @@ -<#import "../common/commons.ftl" as common> - - - - - - -<@common.importResources /> - - - - - - - - - - - -<@common.navbar/> -
-
-
- +<#macro analysisResult> + - - + \ No newline at end of file diff --git a/skywalking-webui/src/main/webapp/pages/common/commons.ftl b/skywalking-webui/src/main/webapp/pages/common/commons.ftl index 61f2276f0..61ea15b4d 100644 --- a/skywalking-webui/src/main/webapp/pages/common/commons.ftl +++ b/skywalking-webui/src/main/webapp/pages/common/commons.ftl @@ -60,10 +60,6 @@
@@ -125,7 +145,14 @@
{{>traceId}}
- 调度入口IP:{{>callIP}},开始时间:{{>startTimeStr}},{{if totalSize > 10000}}调用记录大于10000条,无法展示全部,{{else}}{{>totalSize}}条调用记录,{{/if}}消耗总时长:{{>totalTime}}ms。 + 调度入口IP:{{>callIP}},开始时间:{{>startTimeStr}}, + {{if totalSize > maxQueryNodeSize}} + 调用超过{{>maxQueryNodeSize}}个节点,仅展示入口调用, + {{else totalSize > maxShowNodeSize}} + 共{{>totalSize}}个调用节点,仅展示前{{>showSize}}个调用节点, + {{else}} + {{>totalSize}}个调用节点, + {{/if}}消耗总时长:{{>totalTime}}ms。