diff --git a/QA/SERVER_RUNNING_STAUTS.md b/QA/SERVER_RUNNING_STAUTS.md new file mode 100644 index 000000000..7b6d41961 --- /dev/null +++ b/QA/SERVER_RUNNING_STAUTS.md @@ -0,0 +1,95 @@ +### 通过服务器日志的Server Health Collector Report分析运行情况 +- Health Report会在服务器定时出现,报告在两次报告时间段内的运行情况 + +1. ServerReceiver反映服务端接收数据的情况 +1. DataBufferThread反映接收到的数据,异步写入log文件的情况 +1. PersistenceThread反映log文件中的内容读取情况 +1. PersistenceThread extra:hbase反映log文件中的内容,持久化到hbase的情况 +1. RedisInspectorThread反映和redis的连接池检测情况 + +- Health Report示例如下 +``` +---------Server Health Collector Report--------- +id +[INFO]DataBuffer flush data to local file:1460445849010-a4ea1e20927b40d290ebd4f5f3e08705(t:1460598787106) + +id +[INFO]DataBuffer flush data to local file:1460445849012-0ec5a44474bc4969a9194fa1b1cadf73(t:1460598848608) + +id +[INFO]DataBuffer flush data to local file:1460445849012-4182e3d0205e48968b59fe9fbb0923b4(t:1460598668464) + +id +[INFO]DataBuffer flush data to local file:1460445849013-54216553363343fe8b39221a0691cf40(t:1460598788488) + +id +[INFO]DataBuffer flush data to local file:1460445849013-531a955690764a56ac0490db531bec10(t:1460598727104) + +id +[INFO]DataBuffer flush data to local file:1460445849014-e0163d8c8b8446d6812a11e89cd48b0e(t:1460598787722) + +id +[INFO]DataBuffer flush data to local file:1460445849014-340435a1dd9e49f088af039c2e9e85af(t:1460598787510) + +id +[INFO]DataBuffer flush data to local file:1460445849015-5dacc5f6fb38442eb484b50a240568df(t:1460598727508) + +id +[INFO]read 224 chars from local file:1460445849014-340435a1dd9e49f088af039c2e9e85af(t:1460598787534) + +id +[INFO]save 1 BuriedPointEntries.(t:1460598787549) + +id +[INFO]read 268 chars from local file:1460445849013-531a955690764a56ac0490db531bec10(t:1460598727121) + +id +[INFO]save 1 BuriedPointEntries.(t:1460598727129) + +id +[INFO]read 238 chars from local file:1460445849013-54216553363343fe8b39221a0691cf40(t:1460598788522) + +id +[INFO]save 1 BuriedPointEntries.(t:1460598788532) + +id +[INFO]read 526 chars from local file:1460445849014-e0163d8c8b8446d6812a11e89cd48b0e(t:1460598787770) + +id +[INFO]save 1 BuriedPointEntries.(t:1460598787775) + +id +[INFO]read 238 chars from local file:1460445849010-a4ea1e20927b40d290ebd4f5f3e08705(t:1460598787126) + +id +[INFO]save 1 BuriedPointEntries.(t:1460598787135) + +id +[INFO]read 583 chars from local file:1460445849012-4182e3d0205e48968b59fe9fbb0923b4(t:1460598668466) + +id +[INFO]save 1 BuriedPointEntries.(t:1460598668473) + +id +[INFO]read 819 chars from local file:1460445849015-5dacc5f6fb38442eb484b50a240568df(t:1460598727531) + +id +[INFO]save 2 BuriedPointEntries.(t:1460598727542) + +id +[INFO]read 462 chars from local file:1460445849012-0ec5a44474bc4969a9194fa1b1cadf73(t:1460598848648) + +id +[INFO]save 3 BuriedPointEntries.(t:1460598848757) + +id +[INFO]alarm redis connectted.(t:1460598845054) + +id +[INFO]flush memory register to file.(t:1460598848748) + +id +[INFO]DataBuffer reveiving data.(t:1460598845300) + +------------------------------------------------ +``` \ No newline at end of file diff --git a/README.md b/README.md index ccbaf31f2..c212de19d 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,7 @@ export SKYWALKING_RUN=true # QA - [SkyWalking SDK是否已经工作? Is SkyWalking SDK Running?](QA/IS_RUNNING.md) - [tid在web-ui上无法查询. tid can't be search on web-ui](QA/TID_CANNOT_BE_SEARCH.md) +- [SkyWalking Server的运行情况. The status of SkyWalking Server](QA/SERVER_RUNNING_STAUTS.md) # 源代码说明 * [追踪日志明细存储结构说明. the storage structure of tracking logs](skywalking-server/doc/hbase_table_desc.md) diff --git a/pom.xml b/pom.xml index 220406eda..b5756b6db 100644 --- a/pom.xml +++ b/pom.xml @@ -55,4 +55,5 @@ + \ No newline at end of file diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/DBCallChainInfoDao.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/DBCallChainInfoDao.java index 39a0e4dbf..33ebf83be 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/DBCallChainInfoDao.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/DBCallChainInfoDao.java @@ -41,8 +41,7 @@ public class DBCallChainInfoDao { preparedStatement.setString(1, callChainDetailForMysql.getTreeToken()); preparedStatement.setString(2, callChainDetailForMysql.getUserId()); preparedStatement.setString(3, chainNode.getTraceLevelId()); - preparedStatement.setString(4, chainNode.getViewPoint() + ":" - + chainNode.getBusinessKey()); + preparedStatement.setString(4, chainNode.getViewPoint()); preparedStatement.setTimestamp(5, new Timestamp(System.currentTimeMillis())); preparedStatement.addBatch(); diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/SpanEntry.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/SpanEntry.java index 7f90ea56b..e90d339d5 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/SpanEntry.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/SpanEntry.java @@ -89,24 +89,31 @@ public class SpanEntry { return serverSpan.getBusinessKey(); } + public void setBusinessKey(String businessKey) { + if (clientSpan != null) { + clientSpan.setBusinessKey(businessKey); + } + serverSpan.setBusinessKey(businessKey); + } + public ChainNode.NodeStatus getSpanStatus() { if (clientSpan != null) { if (clientSpan.getExceptionStack() != null && clientSpan.getExceptionStack().length() > 0) { - if(clientSpan.getStatusCode() == 1){ - return ChainNode.NodeStatus.ABNORMAL; - }else{ - return ChainNode.NodeStatus.HUMAN_INTERRUPTION; - } + if (clientSpan.getStatusCode() == 1) { + return ChainNode.NodeStatus.ABNORMAL; + } else { + return ChainNode.NodeStatus.HUMAN_INTERRUPTION; + } } } if (serverSpan != null) { if (serverSpan.getExceptionStack() != null && serverSpan.getExceptionStack().length() > 0) { - if(clientSpan != null && clientSpan.getStatusCode() == 1){ - return ChainNode.NodeStatus.ABNORMAL; - }else{ - return ChainNode.NodeStatus.HUMAN_INTERRUPTION; - } + if (clientSpan != null && clientSpan.getStatusCode() == 1) { + return ChainNode.NodeStatus.ABNORMAL; + } else { + return ChainNode.NodeStatus.HUMAN_INTERRUPTION; + } } } diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/CallChainTreeNode.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/CallChainTreeNode.java index 38d6a49ff..557aa0d60 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/CallChainTreeNode.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/CallChainTreeNode.java @@ -81,7 +81,7 @@ public class CallChainTreeNode { } chainNodeSpecificMonthSummaryContainer.put(keyOfMonthSummaryTable, monthSummary); } - monthSummary.summary(String.valueOf(calendar.get(Calendar.YEAR)), node); + monthSummary.summary(String.valueOf(calendar.get(Calendar.MONTH) + 1), node); } private void summaryDayResult(String treeId, ChainNode node, Calendar calendar) throws IOException { diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificMonthSummary.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificMonthSummary.java index b474ddcd6..3a699b09a 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificMonthSummary.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificMonthSummary.java @@ -29,11 +29,11 @@ public class ChainNodeSpecificMonthSummary { summaryValueMap = new HashMap(); } - public void summary(String minute, ChainNode node) { - ChainNodeSpecificTimeWindowSummaryValue summarValue = summaryValueMap.get(minute); + public void summary(String month, ChainNode node) { + ChainNodeSpecificTimeWindowSummaryValue summarValue = summaryValueMap.get(month); if (summarValue == null) { summarValue = new ChainNodeSpecificTimeWindowSummaryValue(); - summaryValueMap.put(minute, summarValue); + summaryValueMap.put(month, summarValue); } summarValue.summary(node); diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/filter/impl/JDBCBusinessKeyHandleFilter.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/filter/impl/JDBCBusinessKeyHandleFilter.java new file mode 100644 index 000000000..211308bc1 --- /dev/null +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/filter/impl/JDBCBusinessKeyHandleFilter.java @@ -0,0 +1,39 @@ +package com.ai.cloud.skywalking.analysis.chainbuild.filter.impl; + +import com.ai.cloud.skywalking.analysis.chainbuild.SpanEntry; +import com.ai.cloud.skywalking.analysis.chainbuild.filter.SpanNodeProcessFilter; +import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainNode; +import com.ai.cloud.skywalking.analysis.chainbuild.util.SubLevelSpanCostCounter; + +public class JDBCBusinessKeyHandleFilter extends SpanNodeProcessFilter { + @Override + public void doFilter(SpanEntry spanEntry, ChainNode node, SubLevelSpanCostCounter costMap) { + String businessKey = spanEntry.getBusinessKey(); + if (businessKey != null) { + int index = businessKey.lastIndexOf(":"); + if (index != -1) { + businessKey = businessKey.substring(index + 1).trim(); + String key = businessKey.toUpperCase(); + if (key.startsWith("SELECT")) { + businessKey = subBusinessKey(businessKey, key, "WHERE"); + } else if (key.startsWith("UPDATE")) { + businessKey = subBusinessKey(businessKey, key, "SET"); + } else if (key.startsWith("DELETE")) { + businessKey = subBusinessKey(businessKey, key, "WHERE"); + } else if (key.startsWith("INSERT")) { + businessKey = subBusinessKey(businessKey, key, "VALUES"); + } + } + } + spanEntry.setBusinessKey(businessKey); + this.doNext(spanEntry, node, costMap); + } + + private String subBusinessKey(String businessKey, String key,String keyWord) { + int whereIndex = key.indexOf(keyWord); + if (whereIndex != -1) { + businessKey = businessKey.substring(0, whereIndex - 1).trim(); + } + return businessKey; + } +} diff --git a/skywalking-analysis/src/main/resources/viewpointfilter.conf b/skywalking-analysis/src/main/resources/viewpointfilter.conf index 788b82387..19d5bc8b6 100644 --- a/skywalking-analysis/src/main/resources/viewpointfilter.conf +++ b/skywalking-analysis/src/main/resources/viewpointfilter.conf @@ -1,3 +1,3 @@ # default=CopyAttrFilter->ReplaceAddressFilter->ProcessCostTimeFilter->TokenGenerateFilter -J=CopyAttrFilter->AppendBusinessKeyFilter->ProcessCostTimeFilter->TokenGenerateFilter +J=CopyAttrFilter->JDBCBusinessKeyHandleFilter->AppendBusinessKeyFilter->ProcessCostTimeFilter->TokenGenerateFilter diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ApplicationExceptionHandler.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ApplicationExceptionHandler.java index 60e361129..209422554 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ApplicationExceptionHandler.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ApplicationExceptionHandler.java @@ -5,31 +5,42 @@ import static com.ai.cloud.skywalking.conf.Config.BuriedPoint.EXCLUSIVE_EXCEPTIO import java.util.HashSet; import java.util.Set; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import com.ai.cloud.skywalking.api.IExceptionHandler; import com.ai.cloud.skywalking.conf.Config; import com.ai.cloud.skywalking.context.Context; import com.ai.cloud.skywalking.protocol.Span; public class ApplicationExceptionHandler implements IExceptionHandler { + private static Logger logger = LogManager + .getLogger(ApplicationExceptionHandler.class); + private static String EXCEPTION_SPLIT = ","; - + private static Set exclusiveExceptionSet = null; @Override public void handleException(Throwable th) { - if (exclusiveExceptionSet == null) { - Set exclusiveExceptions = new HashSet(); - - String[] exceptions = EXCLUSIVE_EXCEPTIONS.split(EXCEPTION_SPLIT); - for(String exception : exceptions){ - exclusiveExceptions.add(exception); - } - exclusiveExceptionSet = exclusiveExceptions; - } + try { + if (exclusiveExceptionSet == null) { + Set exclusiveExceptions = new HashSet(); - Span span = Context.getLastSpan(); - span.handleException(th, exclusiveExceptionSet, - Config.BuriedPoint.MAX_EXCEPTION_STACK_LENGTH); + String[] exceptions = EXCLUSIVE_EXCEPTIONS + .split(EXCEPTION_SPLIT); + for (String exception : exceptions) { + exclusiveExceptions.add(exception); + } + exclusiveExceptionSet = exclusiveExceptions; + } + + Span span = Context.getLastSpan(); + span.handleException(th, exclusiveExceptionSet, + Config.BuriedPoint.MAX_EXCEPTION_STACK_LENGTH); + } catch (Throwable t) { + logger.error(t.getMessage(), t); + } } } diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java index bdcd5b7f4..fcfbb0620 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java @@ -14,42 +14,57 @@ import com.ai.cloud.skywalking.model.Identification; import com.ai.cloud.skywalking.protocol.Span; import com.ai.cloud.skywalking.util.ContextGenerator; -public class LocalBuriedPointSender extends ApplicationExceptionHandler implements IBuriedPointSender { +public class LocalBuriedPointSender extends ApplicationExceptionHandler + implements IBuriedPointSender { - private static Logger logger = LogManager.getLogger(LocalBuriedPointSender.class); + private static Logger logger = LogManager + .getLogger(LocalBuriedPointSender.class); - public ContextData beforeSend(Identification id) { - if (!AuthDesc.isAuth()) - return new EmptyContextData(); + public ContextData beforeSend(Identification id) { + try { + if (!AuthDesc.isAuth()) + return new EmptyContextData(); - Span spanData = ContextGenerator.generateSpanFromThreadLocal(id); - // 将新创建的Context存放到ThreadLocal栈中。 - Context.append(spanData); - // 并将当前的Context返回回去 - return new ContextData(spanData); - } + Span spanData = ContextGenerator.generateSpanFromThreadLocal(id); + // 将新创建的Context存放到ThreadLocal栈中。 + Context.append(spanData); + // 并将当前的Context返回回去 + return new ContextData(spanData); + } catch (Throwable t) { + logger.error(t.getMessage(), t); + return new EmptyContextData(); + } + } - public void afterSend() { - if (!AuthDesc.isAuth()) - return; + public void afterSend() { + try { + if (!AuthDesc.isAuth()) + return; - // 弹出上下文的栈顶中的元素 - Span spanData = Context.removeLastSpan(); - if (spanData == null) { - return; - } + // 弹出上下文的栈顶中的元素 + Span spanData = Context.removeLastSpan(); + if (spanData == null) { + return; + } - // 加上花费时间 - spanData.setCost(System.currentTimeMillis() - spanData.getStartDate()); + // 加上花费时间 + spanData.setCost(System.currentTimeMillis() + - spanData.getStartDate()); - if (Config.BuriedPoint.PRINTF) { - logger.debug("TraceId:" + spanData.getTraceId() + "\tviewpointId:" + spanData.getViewPointId() + "\tParentLevelId:" + spanData. - getParentLevel() + "\tLevelId:" + spanData.getLevelId() + "\tbusinessKey:" + spanData.getBusinessKey()); - } + if (Config.BuriedPoint.PRINTF) { + logger.debug("TraceId:" + spanData.getTraceId() + + "\tviewpointId:" + spanData.getViewPointId() + + "\tParentLevelId:" + spanData.getParentLevel() + + "\tLevelId:" + spanData.getLevelId() + + "\tbusinessKey:" + spanData.getBusinessKey()); + } - // 存放到本地发送进程中 - if (!Config.Sender.IS_OFF) { - ContextBuffer.save(spanData); - } - } + // 存放到本地发送进程中 + if (!Config.Sender.IS_OFF) { + ContextBuffer.save(spanData); + } + } catch (Throwable t) { + logger.error(t.getMessage(), t); + } + } } diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/RPCBuriedPointReceiver.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/RPCBuriedPointReceiver.java index 0358b1202..50ac1b3e5 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/RPCBuriedPointReceiver.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/RPCBuriedPointReceiver.java @@ -13,35 +13,49 @@ import com.ai.cloud.skywalking.model.Identification; import com.ai.cloud.skywalking.protocol.Span; import com.ai.cloud.skywalking.util.ContextGenerator; -public class RPCBuriedPointReceiver extends ApplicationExceptionHandler implements IBuriedPointReceiver { +public class RPCBuriedPointReceiver extends ApplicationExceptionHandler + implements IBuriedPointReceiver { - private static Logger logger = LogManager.getLogger(RPCBuriedPointReceiver.class); + private static Logger logger = LogManager + .getLogger(RPCBuriedPointReceiver.class); - public void afterReceived() { - if (!AuthDesc.isAuth()) - return; + public void afterReceived() { + try { + if (!AuthDesc.isAuth()) + return; - // 获取上下文的栈顶中的元素 - Span spanData = Context.removeLastSpan(); - // 填上必要信息 - spanData.setCost(System.currentTimeMillis() - spanData.getStartDate()); - // 存放到本地发送进程中 - ContextBuffer.save(spanData); - } + // 获取上下文的栈顶中的元素 + Span spanData = Context.removeLastSpan(); + // 填上必要信息 + spanData.setCost(System.currentTimeMillis() + - spanData.getStartDate()); + // 存放到本地发送进程中 + ContextBuffer.save(spanData); + } catch (Throwable t) { + logger.error(t.getMessage(), t); + } + } - public void beforeReceived(ContextData context, Identification id) { - if (!AuthDesc.isAuth()) - return; + public void beforeReceived(ContextData context, Identification id) { + try { + if (!AuthDesc.isAuth()) + return; - Span spanData = ContextGenerator.generateSpanFromContextData(context, id); - //设置是否为接收端 - spanData.setReceiver(true); + Span spanData = ContextGenerator.generateSpanFromContextData( + context, id); + // 设置是否为接收端 + spanData.setReceiver(true); - if (Config.BuriedPoint.PRINTF) { - logger.debug("TraceId:" + spanData.getTraceId() + "\tviewpointId:" + spanData.getViewPointId() + "\tParentLevelId:" + spanData. - getParentLevel() + "\tLevelId:" + spanData.getLevelId()); - } + if (Config.BuriedPoint.PRINTF) { + logger.debug("TraceId:" + spanData.getTraceId() + + "\tviewpointId:" + spanData.getViewPointId() + + "\tParentLevelId:" + spanData.getParentLevel() + + "\tLevelId:" + spanData.getLevelId()); + } - Context.append(spanData); - } + Context.append(spanData); + } catch (Throwable t) { + logger.error(t.getMessage(), t); + } + } } diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadBuriedPointSender.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadBuriedPointSender.java index 2c8195d65..79b6be4c5 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadBuriedPointSender.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadBuriedPointSender.java @@ -15,7 +15,13 @@ import com.ai.cloud.skywalking.protocol.Span; import com.ai.cloud.skywalking.util.BuriedPointMachineUtil; import com.ai.cloud.skywalking.util.TraceIdGenerator; - +/** + * 暂不确定多线程的实现方式 + * + * @author wusheng + * + */ +@Deprecated public class ThreadBuriedPointSender extends ApplicationExceptionHandler implements IBuriedPointSender { private static Logger logger = LogManager.getLogger(ThreadBuriedPointSender.class); diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadFactoryBuriedPointSender.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadFactoryBuriedPointSender.java index d1097a8e9..ff09f42bd 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadFactoryBuriedPointSender.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadFactoryBuriedPointSender.java @@ -14,6 +14,13 @@ import com.ai.cloud.skywalking.model.Identification; import com.ai.cloud.skywalking.protocol.Span; import com.ai.cloud.skywalking.util.ContextGenerator; +/** + * 暂不确定多线程的实现方式 + * + * @author wusheng + * + */ +@Deprecated public class ThreadFactoryBuriedPointSender extends ApplicationExceptionHandler implements IBuriedPointSender { private static Logger logger = LogManager.getLogger(ThreadBuriedPointSender.class); diff --git a/skywalking-sdk-plugin/httpclient-4.2.x-plugin/pom.xml b/skywalking-sdk-plugin/httpclient-4.2.x-plugin/pom.xml index aec102bfe..9b2e0c501 100644 --- a/skywalking-sdk-plugin/httpclient-4.2.x-plugin/pom.xml +++ b/skywalking-sdk-plugin/httpclient-4.2.x-plugin/pom.xml @@ -7,10 +7,10 @@ 4.0.0 - skywalking-httpClient-4.2.x-plugin + skywalking-httpclient-4.2.x-plugin jar - httpClient-4.2.x-plugin + httpclient-4.2.x-plugin http://maven.apache.org diff --git a/skywalking-sdk-plugin/spring-plugin/pom.xml b/skywalking-sdk-plugin/spring-plugin/pom.xml index ad5900add..c94b52120 100644 --- a/skywalking-sdk-plugin/spring-plugin/pom.xml +++ b/skywalking-sdk-plugin/spring-plugin/pom.xml @@ -1,81 +1,87 @@ - - skywalking-sdk-plugin - com.ai.cloud - 1.0-SNAPSHOT - - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + skywalking-sdk-plugin + com.ai.cloud + 1.0-SNAPSHOT + + 4.0.0 - skywalking-spring-plugin - jar + skywalking-spring-plugin + jar - spring-plugin - http://maven.apache.org + spring-plugin + http://maven.apache.org - - UTF-8 - + + UTF-8 + - - - org.aspectj - aspectjweaver - 1.8.7 - compile - - - com.ai.cloud - skywalking-api - ${project.version} - - - junit - junit - 3.8.1 - test - - - org.springframework - spring-context - 3.2.0.RELEASE - compile - - - com.ai.cloud - skywalking-auth - ${project.version} - test - - - org.springframework - spring-tx - 3.2.0.RELEASE - test - - - org.springframework - spring-jdbc - 3.2.9.RELEASE - test - - - org.apache.commons - commons-dbcp2 - 2.1.1 - test - + + + org.aspectj + aspectjweaver + 1.8.7 + compile + + + com.ai.cloud + skywalking-api + ${project.version} + + + junit + junit + 3.8.1 + test + + + org.apache.logging.log4j + log4j-core + 2.4.1 + test + + + org.springframework + spring-context + 3.2.0.RELEASE + compile + + + com.ai.cloud + skywalking-auth + ${project.version} + test + + + org.springframework + spring-tx + 3.2.0.RELEASE + test + + + org.springframework + spring-jdbc + 3.2.9.RELEASE + test + + + org.apache.commons + commons-dbcp2 + 2.1.1 + test + - - mysql - mysql-connector-java - 5.1.38 - test - - - - - + + mysql + mysql-connector-java + 5.1.38 + test + + + + + maven-compiler-plugin @@ -93,24 +99,24 @@ ${project.build.sourceEncoding} - - org.apache.maven.plugins - maven-deploy-plugin - - - - org.apache.maven.plugins - maven-source-plugin - - - - attach-sources - - jar - - - - + + org.apache.maven.plugins + maven-deploy-plugin + + + + org.apache.maven.plugins + maven-source-plugin + + + + attach-sources + + jar + + + + diff --git a/skywalking-sdk-plugin/spring-plugin/src/main/java/com/ai/cloud/skywalking/plugin/spring/TracingAspect.java b/skywalking-sdk-plugin/spring-plugin/src/main/java/com/ai/cloud/skywalking/plugin/spring/TracingAspect.java index f03af1193..358800148 100644 --- a/skywalking-sdk-plugin/spring-plugin/src/main/java/com/ai/cloud/skywalking/plugin/spring/TracingAspect.java +++ b/skywalking-sdk-plugin/spring-plugin/src/main/java/com/ai/cloud/skywalking/plugin/spring/TracingAspect.java @@ -9,19 +9,7 @@ public class TracingAspect { public Object doTracing(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { LocalBuriedPointSender _sender = new LocalBuriedPointSender(); try { - StringBuilder viewPoint = new StringBuilder(); - viewPoint.append(proceedingJoinPoint.getTarget().getClass().getName() + "." + proceedingJoinPoint.getSignature().getName() + "("); - boolean first = true; - for (Object arg : proceedingJoinPoint.getArgs()) { - if (!first) { - viewPoint.append(","); - } else { - first = false; - } - viewPoint.append(arg.getClass().getName()); - } - viewPoint.append(")"); - _sender.beforeSend(Identification.newBuilder().viewPoint(viewPoint.toString()).spanType(SpringBuriedPointType.instance()).build()); + _sender.beforeSend(Identification.newBuilder().viewPoint(proceedingJoinPoint.getSignature().toString()).spanType(SpringBuriedPointType.instance()).build()); return proceedingJoinPoint.proceed(); } catch (Throwable e) { _sender.handleException(e); diff --git a/skywalking-sdk-plugin/spring-plugin/src/test/java/com/ai/cloud/skywalking/plugin/spring/test/TestBean.java b/skywalking-sdk-plugin/spring-plugin/src/test/java/com/ai/cloud/skywalking/plugin/spring/test/TestBean.java index d728a6e77..20a0464fb 100644 --- a/skywalking-sdk-plugin/spring-plugin/src/test/java/com/ai/cloud/skywalking/plugin/spring/test/TestBean.java +++ b/skywalking-sdk-plugin/spring-plugin/src/test/java/com/ai/cloud/skywalking/plugin/spring/test/TestBean.java @@ -5,7 +5,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service -@Transactional +//@Transactional public class TestBean/* implements TestInterface*/ { private String value; diff --git a/skywalking-sdk-plugin/spring-plugin/src/test/resources/log4j2.xml b/skywalking-sdk-plugin/spring-plugin/src/test/resources/log4j2.xml new file mode 100644 index 000000000..852698762 --- /dev/null +++ b/skywalking-sdk-plugin/spring-plugin/src/test/resources/log4j2.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skywalking-sdk-plugin/spring-plugin/src/test/resources/sky-walking.auth b/skywalking-sdk-plugin/spring-plugin/src/test/resources/sky-walking.auth new file mode 100644 index 000000000..c794ea37c --- /dev/null +++ b/skywalking-sdk-plugin/spring-plugin/src/test/resources/sky-walking.auth @@ -0,0 +1,47 @@ +#skyWalking用户ID +skywalking.user_id=123 +#skyWalking应用编码 +skywalking.application_code=test +#skywalking auth的环境变量名字 +skywalking.auth_system_env_name=SKYWALKING_RUN +#skywalking数据编码 +skywalking.charset=UTF-8 + +#是否打印数据 +buriedpoint.printf=true +#埋点异常的最大长度 +buriedpoint.max_exception_stack_length=4000 +#业务字段的最大长度 +buriedpoint.businesskey_max_length=300 +#过滤异常 +buriedpoint.exclusive_exceptions=java.lang.RuntimeException + +#最大发送者的连接数阀比例 +sender.connect_percent=100 +#发送服务端配置 +sender.servers_addr=127.0.0.1:34000 +#最大发送的副本数量 +sender.max_copy_num=2 +#发送的最大长度 +sender.max_send_length=20000 +#当没有Sender时,尝试获取sender的等待周期 +sender.retry_get_sender_wait_interval=2000 +#是否开启发送消息 +sender.is_off=false + + +#最大消费线程数 +consumer.max_consumer=2 +#消费者最大等待时间 +consumer.max_wait_time=5 +#发送失败等待时间 +consumer.consumer_fail_retry_wait_interval=50 + +#每个Buffer的最大个数 +buffer.buffer_max_size=18000 +#Buffer池的最大长度 +buffer.pool_size=5 + +#发送检查线程检查周期 +senderchecker.check_polling_time=200 + diff --git a/skywalking-webui/pom.xml b/skywalking-webui/pom.xml index 853e10d55..3fa6afd3b 100644 --- a/skywalking-webui/pom.xml +++ b/skywalking-webui/pom.xml @@ -82,12 +82,6 @@ log4j-1.2-api 2.2 - - org.apache.logging.log4j - log4j-slf4j-impl - 2.2 - - javax.servlet javax.servlet-api 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/bo/TraceTreeInfo.java deleted file mode 100644 index 18820a3f1..000000000 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/bo/TraceTreeInfo.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ai.cloud.skywalking.web.bo; - -import java.util.List; - -public class TraceTreeInfo { - private String traceId; - private long beginTime; - private long endTime; - private List nodes; - - public TraceTreeInfo(String traceId, List nodes) { - this.traceId = traceId; - this.nodes = nodes; - } - - public void setBeginTime(long beginTime) { - this.beginTime = beginTime; - } - - public void setEndTime(long endTime) { - this.endTime = endTime; - } - - public String getTraceId() { - return traceId; - } - - public void setTraceId(String traceId) { - this.traceId = traceId; - } - - public long getBeginTime() { - return beginTime; - } - - public long getEndTime() { - return endTime; - } - - public List getNodes() { - return nodes; - } - - public void setNodes(List nodes) { - this.nodes = nodes; - } -} 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/MainPageController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/MainPageController.java index 68ff11b1c..cd2092fe7 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/MainPageController.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/MainPageController.java @@ -13,8 +13,9 @@ import javax.servlet.http.HttpServletRequest; public class MainPageController extends BaseController{ @RequestMapping("/mainPage") - public String mainPage(String loadType, HttpServletRequest request){ + public String mainPage(String loadType, String key,HttpServletRequest request){ request.setAttribute("loadType", loadType); + request.setAttribute("key", key); return "main"; } } 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 84adbbcc9..71e32dda5 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,15 +1,18 @@ 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.common.BaseController; +import com.ai.cloud.skywalking.web.dto.AnlyResult; +import com.ai.cloud.skywalking.web.dto.CallChainNode; +import com.ai.cloud.skywalking.web.dto.LoginUserInfo; +import com.ai.cloud.skywalking.web.dto.TraceTreeInfo; import com.ai.cloud.skywalking.web.entity.CallChainTree; import com.ai.cloud.skywalking.web.service.inter.ICallChainTreeService; import com.ai.cloud.skywalking.web.service.inter.ITraceTreeService; +import com.ai.cloud.skywalking.web.util.Constants; import com.ai.cloud.skywalking.web.util.StringUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.google.gson.Gson; +import com.google.gson.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +20,7 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; @@ -47,9 +51,9 @@ public class SearchController extends BaseController { return ""; } - @RequestMapping(value = "/search/traceId/{traceId:.+}", produces = "application/json; charset=UTF-8") + @RequestMapping(value = "/search/traceId", produces = "application/json; charset=UTF-8") @ResponseBody - public String loadTraceTree(@PathVariable("traceId") String traceId) { + public String loadTraceTree(@RequestParam("traceId") String traceId) { JSONObject jsonObject = new JSONObject(); try { if (StringUtil.isBlank(traceId)) { @@ -67,6 +71,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"); } @@ -79,13 +84,13 @@ public class SearchController extends BaseController { System.out.println("search Trace....."); request.setAttribute("key", traceId); request.setAttribute("searchType", "TRACE_ID"); - request.setAttribute("loadType","showTraceInfo"); + request.setAttribute("loadType", "showTraceInfo"); return "main"; } @RequestMapping(value = "/search/chainTree", produces = "application/json; charset=UTF-8") @ResponseBody - public String searchCallChainTree(String key, HttpServletRequest request) { + public String searchCallChainTree(String key, HttpServletRequest request, int pageSize) { JSONObject jsonObject = new JSONObject(); try { if (StringUtil.isBlank(key)) { @@ -97,9 +102,19 @@ public class SearchController extends BaseController { LoginUserInfo loginUserInfo = fetchLoginUserInfoFromSession(request); List callChainTreeList = - callChainTreeService.queryCurrentMonthCallChainTree(loginUserInfo.getUid(), key); + callChainTreeService.queryCallChainTreeByKey(loginUserInfo.getUid(), key, pageSize); + //List callChainTreeList = generateCallChainTree(); + JsonObject result = new JsonObject(); + if (callChainTreeList.size() > Constants.MAX_ANALYSIS_RESULT_PAGE_SIZE) { + result.addProperty("hasNextPage", true); + callChainTreeList.remove(callChainTreeList.size() - 1); + } else { + result.addProperty("hasNexPage", false); + } + JsonElement jsonElements = new JsonParser().parse(new Gson().toJson(callChainTreeList)); + result.add("children", jsonElements); jsonObject.put("code", "200"); - jsonObject.put("result", new Gson().toJson(callChainTreeList)); + jsonObject.put("result", result.toString()); } catch (Exception e) { logger.error("Failed to search chain tree:{}", key, e); jsonObject.put("code", "500"); @@ -108,4 +123,29 @@ public class SearchController extends BaseController { return jsonObject.toJSONString(); } + private List generateCallChainTree() { + List callChainTrees = new ArrayList(); + CallChainTree chainTree = new CallChainTree("test"); + chainTree.setEntranceViewpoint("test"); + chainTree.setTreeId("test tree id"); + List callChainNodes = new ArrayList<>(); + CallChainNode callChainNode = new CallChainNode("0.0", "test view point id", true); + CallChainNode callChainNode1 = new CallChainNode("0.0.0", "test view point id", true); + CallChainNode callChainNode2 = new CallChainNode("0.1", "test view point id", true); + CallChainNode callChainNode3 = new CallChainNode("0.2", "test view point id", true); + callChainNodes.add(callChainNode); + callChainNodes.add(callChainNode1); + callChainNodes.add(callChainNode2); + callChainNodes.add(callChainNode3); + chainTree.setNodes(callChainNodes); + callChainTrees.add(chainTree); + AnlyResult anlyResult = new AnlyResult(); + anlyResult.setTotalCostTime(1000); + anlyResult.setTotalCall(20); + anlyResult.setHumanInterruptionNumber(10); + anlyResult.setCorrectNumber(10); + chainTree.setEntranceAnlyResult(anlyResult); + return callChainTrees; + } + } 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..7d3092db5 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,43 +1,68 @@ package com.ai.cloud.skywalking.web.dao.impl; import com.ai.cloud.skywalking.web.dao.inter.ICallChainTreeDao; +import com.ai.cloud.skywalking.web.dto.AnlyResult; import com.ai.cloud.skywalking.web.entity.CallChainTree; import com.ai.cloud.skywalking.web.util.HBaseUtils; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; 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; import java.io.IOException; +import java.util.Calendar; +import java.util.Map; @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 { - Table table = hBaseUtils.getConnection().getTable(TableName.valueOf("sw-chain-1day-summary")); + public AnlyResult queryEntranceAnlyResult(String entranceColumnName, String treeId) throws IOException { + String columnName = null; + if (entranceColumnName.lastIndexOf(":") != -1) { + columnName = entranceColumnName.substring(0, entranceColumnName.length() - 1); + } + Table table = hBaseUtils.getConnection().getTable(TableName.valueOf("sw-chain-1month-summary")); Get get = new Get(treeId.getBytes()); Result result = table.get(get); if (result.rawCells().length == 0) { - return null; + Calendar calendar = Calendar.getInstance(); + return new AnlyResult(calendar.get(Calendar.YEAR) + "",(calendar.get(Calendar.MONTH)+1) + ""); + } + AnlyResult anlyResult = null; + Cell cell = result.getColumnLatestCell("chain_summary".getBytes(), columnName.getBytes()); + if (cell != null) { + String anlyResultStr = Bytes.toString(cell.getValueArray(), + cell.getValueOffset(), cell.getValueLength()); + logger.debug("traceId: {} , entranceColumnName : {}, anlyResultStr : {}", + treeId, columnName, anlyResultStr); + JsonObject jsonObject = (JsonObject) new JsonParser().parse(anlyResultStr); + Map resultMap = new Gson().fromJson(jsonObject.getAsJsonObject("summaryValueMap"), + new TypeToken>() { + }.getType()); + anlyResult = resultMap.get((Calendar.getInstance().get(Calendar.MONTH)+1) + ""); } - 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]); - } + if(anlyResult == null){ + anlyResult = new AnlyResult(); } - return null; + anlyResult.setYearOfAnlyResult((Calendar.getInstance().get(Calendar.YEAR)) + ""); + anlyResult.setMonthOfAnlyResult((Calendar.getInstance().get(Calendar.MONTH)+1) + ""); + return 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..a4f7996c8 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,6 +1,8 @@ package com.ai.cloud.skywalking.web.dao.impl; import com.ai.cloud.skywalking.web.dao.inter.IChainDetailDao; +import com.ai.cloud.skywalking.web.dto.HitTreeInfo; +import com.ai.cloud.skywalking.web.util.Constants; import com.ai.cloud.skywalking.web.util.DBConnectUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,7 +14,9 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Repository public class ChainDetailDao implements IChainDetailDao { @@ -23,18 +27,25 @@ 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, int pageSize) throws SQLException { + List hitTreeInfos = new ArrayList(); + String sql = "SELECT DISTINCT treeId FROM sw_chain_detail WHERE uid = ? AND viewpoint like ? LIMIT ?, ?"; Connection connection = dbConnectUtil.getConnection(); try { PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, uid); preparedStatement.setString(2, "%" + viewpoint + "%"); - + preparedStatement.setInt(3, (pageSize - 1) * Constants.MAX_ANALYSIS_RESULT_PAGE_SIZE); + preparedStatement.setInt(4, Constants.MAX_ANALYSIS_RESULT_PAGE_SIZE + 1); + logger.info("startsize : {} ", (pageSize - 1) * Constants.MAX_ANALYSIS_RESULT_PAGE_SIZE); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - treeIds.add(resultSet.getString("treeId")); + HitTreeInfo hitTreeInfo = new HitTreeInfo(resultSet.getString("treeId"), uid); + Map result = queryChainTreeId(uid, hitTreeInfo.getTreeId(), viewpoint); + for (Map.Entry entry : result.entrySet()) { + hitTreeInfo.addHitTraceLevelId(entry.getKey(), entry.getValue()); + } + hitTreeInfos.add(hitTreeInfo); } } catch (Exception e) { logger.error("Failed to query treeIds for Viewpoint[{}]", viewpoint); @@ -44,6 +55,59 @@ public class ChainDetailDao implements IChainDetailDao { connection.close(); } } - return treeIds; + logger.info("hitTreeInfos : {}", hitTreeInfos.size()); + return hitTreeInfos; + } + + private Map queryChainTreeId(String uid, String treeId, String viewpoint) throws SQLException { + Map result = new HashMap(); + String sql = "SELECT DISTINCT traceLevelId, viewpoint FROM sw_chain_detail WHERE uid = ? AND treeId=? AND viewpoint like ?"; + Connection connection = dbConnectUtil.getConnection(); + try { + PreparedStatement preparedStatement = connection.prepareStatement(sql); + preparedStatement.setString(1, uid); + preparedStatement.setString(2, treeId); + preparedStatement.setString(3, "%" + viewpoint + "%"); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + result.put(resultSet.getString("traceLevelId"), 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 result; + } + + + @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 f5812694b..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,6 +1,7 @@ package com.ai.cloud.skywalking.web.dao.impl; -import com.ai.cloud.skywalking.web.bo.TraceNodeInfo; +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,12 +12,14 @@ 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.filter.ColumnCountGetFilter; import org.apache.hadoop.hbase.util.Bytes; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -33,28 +36,60 @@ public class TraceNodeDao implements ITraceNodeDao { @Override - public Map queryTraceNodesByTraceId(String traceId) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { + 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(Constants.MAX_SEARCH_SPAN_SIZE + 1)); Result r = table.get(g); Map traceLogMap = new HashMap(); Map rpcMap = new HashMap(); - for (Cell cell : r.rawCells()) { - if (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); - } + TraceNodesResult result = new TraceNodesResult(); + if (r.rawCells().length < Constants.MAX_SEARCH_SPAN_SIZE) { + for (Cell cell : r.rawCells()) { + doDealSingleSpan(traceLogMap, rpcMap, cell); + } + computeRPCInfo(rpcMap, traceLogMap); + result.setOverMaxQueryNodeNumber(false); + result.setResult(traceLogMap.values()); + }else{ + result.setOverMaxQueryNodeNumber(true); + } + return result; + } + + @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); } } - computeRPCInfo(rpcMap, traceLogMap); - return traceLogMap; } private void computeRPCInfo(Map rpcMap, Map traceLogMap) { 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..0655b4cae 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, int pageSize) 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 686e6c638..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,15 +1,18 @@ package com.ai.cloud.skywalking.web.dao.inter; -import com.ai.cloud.skywalking.web.bo.TraceNodeInfo; +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 { - Map 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..0c51156e6 --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/AnlyResult.java @@ -0,0 +1,69 @@ +package com.ai.cloud.skywalking.web.dto; + +/** + * Created by xin on 16-4-12. + */ +public class AnlyResult { + private String yearOfAnlyResult; + private String monthOfAnlyResult; + 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; + } + + public void setTotalCall(long totalCall) { + this.totalCall = totalCall; + } + + public void setTotalCostTime(long totalCostTime) { + this.totalCostTime = totalCostTime; + } + + public void setCorrectNumber(long correctNumber) { + this.correctNumber = correctNumber; + } + + public void setHumanInterruptionNumber(long humanInterruptionNumber) { + this.humanInterruptionNumber = humanInterruptionNumber; + } + + public String getMonthOfAnlyResult() { + return monthOfAnlyResult; + } + + public void setMonthOfAnlyResult(String monthOfAnlyResult) { + this.monthOfAnlyResult = monthOfAnlyResult; + } + + public AnlyResult(String yearOfAnlyResult, String monthOfAnlyResult) { + this.yearOfAnlyResult = yearOfAnlyResult; + this.monthOfAnlyResult = monthOfAnlyResult; + } + + public AnlyResult() { + } + + public String getYearOfAnlyResult() { + return yearOfAnlyResult; + } + + public void setYearOfAnlyResult(String yearOfAnlyResult) { + this.yearOfAnlyResult = yearOfAnlyResult; + } +} 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/dto/CallChainNode.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/CallChainNode.java new file mode 100644 index 000000000..ede75e76a --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/CallChainNode.java @@ -0,0 +1,55 @@ +package com.ai.cloud.skywalking.web.dto; + +import com.ai.cloud.skywalking.web.util.ViewPointBeautiUtil; + +/** + * Created by xin on 16-4-14. + */ +public class CallChainNode { + private String traceLevelId=""; + private String viewPoint; + private boolean isGuess; + public CallChainNode(String traceLevelId, String viewPoint, boolean isGuess) { + this.traceLevelId = traceLevelId; + this.viewPoint = viewPoint; + this.isGuess = isGuess; + } + + public String getTraceLevelId() { + return traceLevelId; + } + + public void setTraceLevelId(String traceLevelId) { + this.traceLevelId = traceLevelId; + } + + public String getViewPoint() { + return viewPoint; + } + + public void setViewPoint(String viewPoint) { + this.viewPoint = viewPoint; + } + + public void beautiViewPointString(String searchKey) { + if (viewPoint.length() > 100) { + viewPoint = ViewPointBeautiUtil.beautifulViewPoint(viewPoint, searchKey); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CallChainNode that = (CallChainNode) o; + + return traceLevelId != null ? traceLevelId.equals(that.traceLevelId) : that.traceLevelId == null; + + } + + @Override + public int hashCode() { + return traceLevelId != null ? traceLevelId.hashCode() : 0; + } +} 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..7011ec1ea --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/HitTreeInfo.java @@ -0,0 +1,237 @@ +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.*; + +/** + * 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); + result[1] = levelId.substring(indexOf + 1); + + return result; + } + + public String getCurrentMonthAnlyTableName() { + Calendar calendar = Calendar.getInstance(); + String monthSuffix = "/" + calendar.get(Calendar.YEAR); + return getTreeId() + monthSuffix; + } + + public void setEntranceViewPoint(String entranceViewPoint) { + this.entranceViewPoint = entranceViewPoint; + } + + public String getEntranceViewPoint() { + return entranceViewPoint; + } + + public void guessLevelIdAndSearchViewPoint(IChainDetailDao iChainDetailDao) throws SQLException { + Set levelIds = new HashSet<>(); + for (String levelId : levelIds) { + String[] levelIdArray = levelId.split("."); + if (levelId.length() < 2) { + // 当前节点为根节点 + String tmpViewpoint = iChainDetailDao.queryChainViewPoint("0.0", + treeId, uid); + if (tmpViewpoint != null) { + addHitTraceLevelId("0.0", tmpViewpoint); + } + } else { + // 找上级 + guessPreLevelId(iChainDetailDao, levelId); + //找下级 + guessNexLevelId(iChainDetailDao, levelId); + } + } + } + + private void guessNexLevelId(IChainDetailDao iChainDetailDao, String levelId) throws SQLException { + String[] levelIdArray = levelId.split("."); + String parentLevelId = levelId.substring(0, levelId.lastIndexOf('.')); + String nextLevelId = parentLevelId +"." + (Integer.parseInt(levelIdArray[levelIdArray.length - 1]) + 1); + String tmpViewpoint = iChainDetailDao.queryChainViewPoint(nextLevelId, + treeId, uid); + if (tmpViewpoint != null) { + addHitTraceLevelId(nextLevelId, tmpViewpoint); + } else { + levelIdArray = parentLevelId.split("."); + parentLevelId = levelId.substring(0, levelId.lastIndexOf('.')); + nextLevelId = parentLevelId + "." + (Integer.parseInt(levelIdArray[levelIdArray.length - 1]) + 1); + tmpViewpoint = iChainDetailDao.queryChainViewPoint(nextLevelId, + treeId, uid); + if (tmpViewpoint != null) { + addHitTraceLevelId(nextLevelId, tmpViewpoint); + } + } + + logger.info("LevelId :{}, nextLevelId :{} ", levelId, nextLevelId); + } + + private void guessPreLevelId(IChainDetailDao iChainDetailDao, String levelId) throws SQLException { + String[] levelIdArray = levelId.split("."); + String parentLevelId = levelId.substring(0, levelId.lastIndexOf('.')); + if (levelIdArray.length == 2 && "0".equals(parentLevelId)) { + //当前节点的父节点位根节点,不查询 + return; + } + + if ("0".equals(levelIdArray[levelIdArray.length - 1])) { + String tmpViewpoint = iChainDetailDao.queryChainViewPoint(parentLevelId, + treeId, uid); + if (tmpViewpoint != null) { + addHitTraceLevelId(parentLevelId, tmpViewpoint); + } + } else { + parentLevelId += "." + (Integer.parseInt(levelIdArray[levelIdArray.length - 1]) - 1); + String tmpViewpoint = iChainDetailDao.queryChainViewPoint(parentLevelId, + treeId, uid); + if (tmpViewpoint != null) { + addHitTraceLevelId(parentLevelId, tmpViewpoint); + } + } + + logger.info("LevelId :{}, preLevelId :{} ", levelId, parentLevelId); + } + + public void guessLevelIdAndSearchViewPoint1(IChainDetailDao iChainDetailDao) throws SQLException { + String tmpViewpoint; + Set leveIds = new HashSet(); + leveIds.addAll(hitTraceLevelId.keySet()); + for (String levelId : leveIds) { + 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, levelId); + //找下级 + guessNextTraceLevelId(iChainDetailDao, levelId); + } + } + logger.debug("hitTraceLevelId : {}", hitTraceLevelId); + } + + private void guessNextTraceLevelId(IChainDetailDao iChainDetailDao, String levelId) throws SQLException { + String traceLevelId = getSubTraceLevelId(levelId); + if (hitTraceLevelId.containsKey(traceLevelId)) { + return; + } + String tmpViewpoint = iChainDetailDao.queryChainViewPoint(traceLevelId, + treeId, uid); + if (tmpViewpoint == null) { + traceLevelId = getBrotherOfParentLevelId(levelId); + if (traceLevelId.length() > 0) + tmpViewpoint = iChainDetailDao.queryChainViewPoint(traceLevelId, treeId, uid); + } + + if (tmpViewpoint != null) { + addHitTraceLevelId(traceLevelId, tmpViewpoint); + } + } + + private void guessPreTraceLevelId(IChainDetailDao iChainDetailDao, String levelId) throws SQLException { + String tmpViewpoint = null; + String traceLevelId = null; + String[] result = spiltParentLevelIdAndLevelId(levelId); + if (result[0].length() > 0 && (Integer.parseInt(result[1]) - 1) != -1) { + traceLevelId = getPreBrotherLevelId(result); + tmpViewpoint = iChainDetailDao.queryChainViewPoint(traceLevelId, + treeId, uid); + } else { + if (result[0].length() > 0) { + traceLevelId = result[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 levelId) { + String[] result = spiltParentLevelIdAndLevelId(levelId); + if (result[0].length() > 0) { + result = spiltParentLevelIdAndLevelId(result[0]); + if (result[1] != null && result[1].length() > 0) { + return result[0] + (Integer.parseInt(result[1]) + 1); + } + } + + return ""; + } + + private String getSubTraceLevelId(String levelId) { + String[] result = spiltParentLevelIdAndLevelId(levelId); + return result[0] + "." + (Integer.parseInt(result[1]) + 1); + } + + public String getUid() { + return uid; + } +} 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/dto/TraceTreeInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceTreeInfo.java new file mode 100644 index 000000000..37b67ffbb --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dto/TraceTreeInfo.java @@ -0,0 +1,81 @@ +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 { + private String traceId; + private long beginTime; + 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; + nodeSize = nodes.size(); + } + + public void setBeginTime(long beginTime) { + this.beginTime = beginTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public String getTraceId() { + return traceId; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + public long getBeginTime() { + return beginTime; + } + + public long getEndTime() { + return endTime; + } + + public List getNodes() { + return nodes; + } + + public void setHasBeenSpiltNodes(List nodes) { + this.nodes = nodes; + } + + 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..919cb5b84 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,90 @@ package com.ai.cloud.skywalking.web.entity; -import java.util.ArrayList; -import java.util.List; +import com.ai.cloud.skywalking.web.dto.AnlyResult; +import com.ai.cloud.skywalking.web.dto.CallChainNode; +import com.ai.cloud.skywalking.web.util.ViewPointBeautiUtil; + +import java.util.*; /** * Created by xin on 16-4-6. */ public class CallChainTree { private String treeId; - private List nodes; - private String entranceViewpoint; + private List nodes; + private AnlyResult entranceAnlyResult; public CallChainTree(String treeId) { this.treeId = treeId; - nodes = new ArrayList(); + nodes = new ArrayList(); } - public void addNode(String levelId, String viewpoint) { - if ("0".equals(levelId)) { - entranceViewpoint = viewpoint; + public void setEntranceAnlyResult(AnlyResult entranceAnlyResult) { + this.entranceAnlyResult = entranceAnlyResult; + } + + public void addHitNodes(Map nodes) { + for (Map.Entry entry : nodes.entrySet()) { + CallChainNode callChainNode = new CallChainNode(entry.getKey(), entry.getValue(), false); + this.nodes.add(callChainNode); + } + } + + public void beautiViewPointString(String searchKey) { + if (entranceViewpoint.length() > 100) { + entranceViewpoint = ViewPointBeautiUtil.beautifulViewPoint(entranceViewpoint, searchKey); + // } - nodes.add(new CallChainTreeNode(levelId, viewpoint)); + for (CallChainNode chainNode : nodes) { + //高亮 + chainNode.beautiViewPointString(searchKey); + } + } + + public void sortNodes() { + Collections.sort(nodes, new Comparator() { + @Override + public int compare(CallChainNode o1, CallChainNode o2) { + return o1.getTraceLevelId().compareTo(o2.getTraceLevelId()); + } + }); + } + + public void addGuessNodesAndRemoveDuplicate(List nodes) { + for (CallChainNode node : nodes) { + if (!this.nodes.contains(node)) { + this.nodes.add(node); + } + } + } + + public void setEntranceViewpoint(String entranceViewpoint) { + this.entranceViewpoint = entranceViewpoint; + } + + public AnlyResult getEntranceAnlyResult() { + return entranceAnlyResult; + } + + public List getNodes() { + return nodes; + } + + public String getTreeId() { + return treeId; + } + + public String getEntranceViewpoint() { + return entranceViewpoint; + } + + public void setTreeId(String treeId) { + this.treeId = treeId; + } + + public void setNodes(List nodes) { + this.nodes = 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..4e0a95006 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; @@ -24,6 +24,7 @@ public class AccessControllerFilter implements Filter { contained.add("addApplication"); contained.add("createGlobalApplication"); contained.add("modifyApplication"); + contained.add("showAnlyResult"); } @Override 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..dc3ba0312 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 @@ -2,6 +2,9 @@ package com.ai.cloud.skywalking.web.service.impl; import com.ai.cloud.skywalking.web.dao.inter.ICallChainTreeDao; import com.ai.cloud.skywalking.web.dao.inter.IChainDetailDao; +import com.ai.cloud.skywalking.web.dto.AnlyResult; +import com.ai.cloud.skywalking.web.dto.CallChainNode; +import com.ai.cloud.skywalking.web.dto.HitTreeInfo; import com.ai.cloud.skywalking.web.entity.CallChainTree; import com.ai.cloud.skywalking.web.service.inter.ICallChainTreeService; import org.apache.logging.log4j.LogManager; @@ -12,7 +15,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 @@ -21,26 +23,113 @@ public class CallChainTreeService implements ICallChainTreeService { private Logger logger = LogManager.getLogger(CallChainTreeService.class); @Autowired - private IChainDetailDao iChainDetailDao; + private IChainDetailDao chainDetailDao; @Autowired private ICallChainTreeDao chainTreeDao; @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 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) { - continue; - } - callChainTrees.add(chainTree); + public List queryCallChainTreeByKey(String uid, String viewpoint, int pageSize) throws SQLException, IOException { + List trees = new ArrayList(); + List hitTrees = chainDetailDao.queryChainTreeIds(uid, viewpoint, pageSize); + for (HitTreeInfo hitTree : hitTrees) { + CallChainTree chainTree = new CallChainTree(hitTree.getTreeId()); + chainTree.setEntranceViewpoint(chainDetailDao.queryChainViewPoint("0", hitTree.getTreeId(), uid)); + + chainTree.addHitNodes(hitTree.getHitTraceLevelId()); + //臆测TraceLevelId + chainTree.addGuessNodesAndRemoveDuplicate(doGuessNodes(hitTree)); + //获取统计结果 + AnlyResult anlyResult = chainTreeDao.queryEntranceAnlyResult("0@" + chainTree.getEntranceViewpoint(), hitTree.getCurrentMonthAnlyTableName()); + chainTree.setEntranceAnlyResult(anlyResult); + chainTree.sortNodes(); + //美化显示 + chainTree.beautiViewPointString(viewpoint); + trees.add(chainTree); } - logger.info("viewpoint key :{}, chainTree size : {}", viewpoint, callChainTrees.size()); - return callChainTrees; + return trees; } + + private List doGuessNodes(HitTreeInfo hitTraceLevelIds) throws SQLException { + List guessNodes = new ArrayList(); + for (String traceLevelId : hitTraceLevelIds.getHitTraceLevelId().keySet()) { + // + CallChainNode preTraceLevelNode = guessPreTraceLevelId(traceLevelId, hitTraceLevelIds.getTreeId(), hitTraceLevelIds.getUid()); + if (preTraceLevelNode != null) { + guessNodes.add(preTraceLevelNode); + logger.info("treeId:{}, traceLevelId :{}, preTraceLevelId:{}", hitTraceLevelIds.getTreeId(), traceLevelId, preTraceLevelNode.getTraceLevelId()); + } + + // + CallChainNode nextTraceLevelNode = guessNextTraceLevelId(traceLevelId, hitTraceLevelIds.getTreeId(), hitTraceLevelIds.getUid()); + if (nextTraceLevelNode != null) { + guessNodes.add(nextTraceLevelNode); + logger.info("treeId:{}, traceLevelId :{}, nextTraceLevelId:{}", hitTraceLevelIds.getTreeId(), traceLevelId, nextTraceLevelNode.getTraceLevelId()); + } + + } + + return guessNodes; + } + + private CallChainNode guessNextTraceLevelId(String traceLevelId, String treeId, String uid) throws SQLException { + String[] levelIdArray = traceLevelId.split("\\."); + if (traceLevelId.lastIndexOf('.') == -1) { + return null; + } + String parentLevelId = traceLevelId.substring(0, traceLevelId.lastIndexOf('.')); + if (levelIdArray.length == 0) + return null; + String subLevelId = parentLevelId + "." + (Integer.parseInt(levelIdArray[levelIdArray.length - 1]) + 1); + String tmpViewpoint = chainDetailDao.queryChainViewPoint(subLevelId, + treeId, uid); + CallChainNode result = null; + if (tmpViewpoint == null) { + levelIdArray = parentLevelId.split("\\."); + if (levelIdArray.length != 1) { + // 不为根节点 + String grandParentLevelId = traceLevelId.substring(0, parentLevelId.lastIndexOf('.')); + subLevelId = grandParentLevelId + "." + (Integer.parseInt(levelIdArray[levelIdArray.length - 1]) + 1); + tmpViewpoint = chainDetailDao.queryChainViewPoint(subLevelId, + treeId, uid); + logger.info("treeId:{} TreeLevelId:{}, subLevel[{}] is null, find the brother of parent LevelId :{}", treeId, subLevelId, traceLevelId, subLevelId); + } + } + + if (tmpViewpoint != null) { + result = new CallChainNode(subLevelId, tmpViewpoint, true); + } + + return result; + } + + private CallChainNode guessPreTraceLevelId(String traceLevelId, String treeId, String uid) throws SQLException { + String[] levelIdArray = traceLevelId.split("\\."); + if (levelIdArray.length <= 2) { + //上级节点为根节点,不用臆测,页面自动展示 + return null; + } + + CallChainNode result = null; + String parentLevelId = traceLevelId.substring(0, traceLevelId.lastIndexOf('.')); + if ("0".equals(levelIdArray[levelIdArray.length - 1])) { + // 本机节点为0,找父级 + String tmpViewpoint = chainDetailDao.queryChainViewPoint(parentLevelId, + treeId, uid); + if (tmpViewpoint != null) { + result = new CallChainNode(parentLevelId, tmpViewpoint, true); + } + } else { + // 本机节点不为0,找上级 + String preLevelId = parentLevelId + "." + (Integer.parseInt(levelIdArray[levelIdArray.length - 1]) - 1); + String tmpViewpoint = chainDetailDao.queryChainViewPoint(preLevelId, + treeId, uid); + if (tmpViewpoint != null) { + result = new CallChainNode(preLevelId, tmpViewpoint, true); + } + } + + return result; + } + } 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 c8d112a18..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,15 +27,21 @@ public class TraceTreeService implements ITraceTreeService { @Override public TraceTreeInfo queryTraceTreeByTraceId(String traceId) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, IOException { - TraceTreeInfo traceTreeInfo = null; + 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()); + } - Map traceLogMap = traceTreeDao.queryTraceNodesByTraceId(traceId); - if (traceLogMap != null && traceLogMap.size() > 0) { - List nodes = new ArrayList(); - nodes.addAll(traceLogMap.values()); + 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()) { @@ -42,9 +53,14 @@ public class TraceTreeService implements ITraceTreeService { return arg0.getColId().compareTo(arg1.getColId()); } }); - long beginTime = nodes.get(0).getStartDate(); - traceTreeInfo = new TraceTreeInfo(traceId, nodes); - 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/ICallChainTreeService.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/inter/ICallChainTreeService.java index dd64aa89e..48a1f8002 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/inter/ICallChainTreeService.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/service/inter/ICallChainTreeService.java @@ -10,5 +10,5 @@ import java.util.List; * Created by xin on 16-4-6. */ public interface ICallChainTreeService { - List queryCurrentMonthCallChainTree(String uid, String viewpoint) throws SQLException, IOException; + List queryCallChainTreeByKey(String uid, String viewpoint, int pageSize) throws SQLException, IOException; } 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..37e219a0c 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,10 @@ public class Constants { put("9", "MISSING"); } }; + + public static int MAX_SEARCH_SPAN_SIZE = 10000; + + public static int MAX_SHOW_SPAN_SIZE = 200; + + public static int MAX_ANALYSIS_RESULT_PAGE_SIZE = 10; } 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/java/com/ai/cloud/skywalking/web/util/ViewPointBeautiUtil.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/ViewPointBeautiUtil.java new file mode 100644 index 000000000..7d4204a77 --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/ViewPointBeautiUtil.java @@ -0,0 +1,71 @@ +package com.ai.cloud.skywalking.web.util; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by xin on 16-4-19. + */ +public class ViewPointBeautiUtil { + + + public static String beautifulViewPoint(String viewPoint, String searchKey) { + String highLightViewPoint = ViewPointBeautiUtil.addViewPoint(viewPoint, searchKey); + return ViewPointBeautiUtil.highLightViewPoint(highLightViewPoint, searchKey); + } + + private static String highLightViewPoint(String viewPoint, String searchKey) { + int index = viewPoint.indexOf(searchKey); + if (index == -1) { + return viewPoint; + } + StringBuilder result = new StringBuilder(viewPoint.substring(0, index - 1)); + result.append(""); + result.append(searchKey); + result.append(""); + result.append(viewPoint.substring(index + searchKey.length() + 1)); + return result.toString(); + } + + private static String addViewPoint(String viewPoint, String searchKey) { + StringBuilder result = new StringBuilder(); + int startSize = 0; + int index = viewPoint.indexOf(searchKey); + int suffixLength = 50; + if (index > suffixLength) { + result.append(viewPoint.substring(0, suffixLength)); + result.append("..."); + result.append(viewPoint.substring(index, index + searchKey.length())); + startSize = index + searchKey.length(); + } else if (index == suffixLength) { + result.append(viewPoint.substring(0, suffixLength + searchKey.length())); + startSize = suffixLength + searchKey.length(); + } else { + result.append(viewPoint.substring(0, suffixLength)); + startSize = suffixLength; + } + if (startSize < viewPoint.length() - 40) { + result.append("..."); + result.append(viewPoint.substring(viewPoint.length() - 40, viewPoint.length() - 20)); + result.append("...."); + } else if (startSize == viewPoint.length() - 40) { + result.append(viewPoint.substring(viewPoint.length() - 40, viewPoint.length() - 20)); + result.append("...."); + } else { + result.append(viewPoint.substring(startSize, viewPoint.length() - 10)); + } + return result.toString(); + } + + public static void main(String[] args) { + List list = new ArrayList<>(); + list.add("tracing:jdbc:oracle:thin:@10.1.1.61:1521:OAPROD(aisse)preaparedStatement.executeQuery:select a.ACCOUNT_TYPE,a.PHONE_ACCOUNT,a.PHONE_NUMBER,a.ATTRIBUTE4 from AISSE_EMPLOYEE_MOBILE_INFO_V a where PHONE_NUMBER is not null and NT_ACCOUNT = ? and ACCOUNT_TYPE not in ('统一充值','United Voucher'):preaparedStatement.executeQuery:select a.ACCOUNT_TYPE,a.PHONE_ACCOUNT,a.PHONE_NUMBER,a.ATTRIBUTE4 from AISSE_EMPLOYEE_MOBILE_INFO_V a where PHONE_NUMBER is not null and NT_ACCOUNT = ? and ACCOUNT_TYPE not in ('统一充值','United Voucher')"); + list.add("tracing:jdbc:oracle:thin:@10.1.1.61:1521:OAPROD(aisse)preaparedStatement.executeQuery:select a.ACCOUNT_TYPE,a.PHONE_ACCOUNT,a.PHONE_NUMBER,a.ATTRIBUTE4 from AISSE_EMPLOYEE_MOBILE_INFO_V a where lower(a.NT_ACCOUNT) = ?:preaparedStatement.executeQuery:select a.ACCOUNT_TYPE,a.PHONE_ACCOUNT,a.PHONE_NUMBER,a.ATTRIBUTE4 from AISSE_EMPLOYEE_MOBILE_INFO_V a where lower(a.NT_ACCOUNT) = ?"); + list.add("dubbo://aisse-mobile-web/com.ai.aisse.core.rest.ExpenseInitApi.searchMembersinfo(String):"); + list.add("com.ai.aisse.core.dao.impl.QueryUserMessageDaoImpl.selectDemoList(java.lang.String):"); + list.add("com.ai.aisse.controller.common.CommonController.toAisseMobilePage(com.ai.net.xss.wrapper.XssRequestWrapper,org.apache.catalina.connector.ResponseFacade,org.springframework.validation.support.BindingAwareModelMap):"); + for (String string : list) { + System.out.println(beautifulViewPoint(string, "ACCOUNT_TYPE")); + } + } +} diff --git a/skywalking-webui/src/main/resources/config.properties b/skywalking-webui/src/main/resources/config.properties index e930f433a..5ce38db81 100644 --- a/skywalking-webui/src/main/resources/config.properties +++ b/skywalking-webui/src/main/resources/config.properties @@ -1,2 +1,2 @@ -hbaseconfig.quorum=10.1.241.18,10.1.241.19,10.1.241.20 +hbaseconfig.quorum=10.1.235.197,10.1.235.198,10.1.235.199 hbaseconfig.client_port=29181 \ No newline at end of file diff --git a/skywalking-webui/src/main/resources/jdbc.properties b/skywalking-webui/src/main/resources/jdbc.properties index fcbb2a288..2cbdf3dac 100644 --- a/skywalking-webui/src/main/resources/jdbc.properties +++ b/skywalking-webui/src/main/resources/jdbc.properties @@ -1,7 +1,7 @@ jdbc.driverClassName=com.mysql.jdbc.Driver -jdbc.url=jdbc:mysql://10.1.241.20:31306/sw_db -jdbc.username=sw_dbusr01 -jdbc.password=sw_dbusr01 +jdbc.url=jdbc:mysql://10.1.228.202:31316/test +jdbc.username=devrdbusr21 +jdbc.password=devrdbusr21 jdbc.maxTotal=200 jdbc.maxIdle=50 jdbc.maxWaitMillis=1000 diff --git a/skywalking-webui/src/main/resources/log4j2.xml b/skywalking-webui/src/main/resources/log4j2.xml index 862afd156..5d274655b 100644 --- a/skywalking-webui/src/main/resources/log4j2.xml +++ b/skywalking-webui/src/main/resources/log4j2.xml @@ -1,18 +1,13 @@ - + - + - - - - - + \ No newline at end of file diff --git a/skywalking-webui/src/main/webapp/bower_components/skywalking/css/tracelog.css b/skywalking-webui/src/main/webapp/bower_components/skywalking/css/tracelog.css index 1e349df6b..83eb4b1f7 100644 --- a/skywalking-webui/src/main/webapp/bower_components/skywalking/css/tracelog.css +++ b/skywalking-webui/src/main/webapp/bower_components/skywalking/css/tracelog.css @@ -29,4 +29,8 @@ .progress-bar-c { background-color: #5bc0de; -} \ No newline at end of file +} + +.highlight-viewpoint { + background-color: #baec7e; +} diff --git a/skywalking-webui/src/main/webapp/bower_components/skywalking/js/analysisresult.js b/skywalking-webui/src/main/webapp/bower_components/skywalking/js/analysisresult.js new file mode 100644 index 000000000..551cbdc8a --- /dev/null +++ b/skywalking-webui/src/main/webapp/bower_components/skywalking/js/analysisresult.js @@ -0,0 +1,139 @@ +function toSearchAnlyResult(searchKey) { + loadAnalyResult(searchKey, 1); +} + +function bindPagerBtn() { + $("#doPreviousPageBtn").click(function () { + var pageSize = $("#pageSize").val(); + $("#anlyResultmPanel").empty(); + loadAnalyResult(parseInt(pageSize) - 1); + }); + + $("#doNextPageBtn").click(function () { + var pageSize = $("#pageSize").val(); + $("#anlyResultmPanel").empty(); + loadAnalyResult(parseInt(pageSize) + 1); + }); +} + +function loadAnalyResult(searchKey, pageSize) { + var baseUrl = $("#baseUrl").text(); + var url = baseUrl + '/search/chainTree?key=' + searchKey; + $.ajax({ + type: 'POST', + url: url, + dataType: 'json', + data: { + pageSize: pageSize + }, + success: function (data) { + if (data.code == '200') { + var template = $.templates("#anlyResultDisplayTmpl"); + var jsonValue = JSON.parse(data.result); + var showResult = jsonValue.children; + if (showResult != undefined && showResult.length > 0) { + for (var i = 0; i < showResult.length; i++) { + var tmpNodes = showResult[i].nodes; + var preNodesTraceleveId = "0"; + for (var j = 0; j < tmpNodes.length; j++) { + //preNodeLenght = spiltArray.length; + tmpNodes[j].isPrintSlipDot = !compareTraceLevelId(preNodesTraceleveId, tmpNodes[j].traceLevelId); + if (tmpNodes[j].isPrintSlipDot) { + tmpNodes[j].marginLeftSize = 0; + } else { + var spiltArray = tmpNodes[j].traceLevelId.split("."); + var preSplitArray = preNodesTraceleveId.split("."); + var flag = false; + var length = spiltArray.length; + if (length > preSplitArray.length) { + length = preSplitArray.length; + flag = true; + } + if (preSplitArray[length - 1] == spiltArray[length - 1]) { + if (flag){ + tmpNodes[j].marginLeftSize = 10; + }else{ + tmpNodes[j].marginLeftSize = 0; + } + } else if (preSplitArray[length - 1] < spiltArray[length - 1]) { + //异常情况 + tmpNodes[j].marginLeftSize = 0; + } else { + tmpNodes[j].marginLeftSize = 10; + } + } + preNodesTraceleveId = tmpNodes[j].traceLevelId; + } + if (showResult[i].entranceAnlyResult.totalCall != 0) { + showResult[i].correctRate = (parseFloat(showResult[i].entranceAnlyResult.correctNumber) + / parseFloat(showResult[i].entranceAnlyResult.totalCall) * 100).toFixed(2); + } else { + showResult[i].correctRate = (0).toFixed(2); + } + } + + var htmlOutput = template.render(jsonValue.children); + $("#anlyResultmPanel").empty(); + $("#anlyResultmPanel").html(htmlDecode(htmlOutput)); + + template = $.templates("#pageInfoTmpl"); + var hasPreviousPage = true; + if (pageSize == 1) { + hasPreviousPage = false; + } + htmlOutput = template.render({ + "pageSize": pageSize, + "hasPreviousPage": hasPreviousPage, + "hasNextPage": jsonValue.hasNextPage + }); + $("#anlyResultmPanel").append(htmlOutput); + bindPagerBtn(); + } + } + }, + error: function () { + $("#errorMessage").text("Fatal Error, please try it again."); + $("#alertMessageBox").show(); + } + }); +} +function htmlDecode(str) { + var _str = ''; + if (str.length == 0) return ''; + _str = str.replace(/</g, '<'); + _str = _str.replace(/>/g, '>'); + _str = _str.replace(/'/g, "'"); + return _str; +} + +function compareTraceLevelId(preTraceLevelId, currentTraceLevelId) { + var preLevelArray = preTraceLevelId.split('.'); + var curLevelArray = currentTraceLevelId.split('.'); + + if (Math.abs(preLevelArray.length - curLevelArray.length) > 1) { + return false; + } + + var length = preLevelArray.length; + if (curLevelArray.length > length) { + length = curLevelArray.length; + } + + var result = true; + for (var index = 0; index < length; index++) { + var value = parseInt(preLevelArray[index]) - parseInt(curLevelArray[index]); + if (value < -1) { + result = false; + break; + } + + if (value == -1) { + if (preLevelArray.length < index + 1 && curLevelArray[index + 1] != "0") { + result = false; + break; + } + } + } + + return result; +} \ No newline at end of file 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 914d1852d..29dd40e93 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 @@ -14,7 +14,10 @@ function changeData(data) { var totalTime = result.traceTree.totalTime; result.traceTree.startTime = data.beginTime; result.traceTree.endTime = data.endTime; - result.traceTree.totalSize = data.nodes.length; + 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; @@ -88,12 +91,13 @@ function changeData(data) { } function loadTraceTreeData(baseUrl) { - var url = baseUrl + "/search/traceId/" + $("#searchKey").val(); + var url = baseUrl + "/search/traceId"; $.ajax({ type: 'POST', url: url, dataType: 'json', - async: true, + data: {traceId:$("#searchKey").val()}, + async: false, success: function (data) { if (data.code == '200') { var changedData = changeData(jQuery.parseJSON(data.result)); 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..7d60e80f9 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,58 @@ -<#import "../common/commons.ftl" as common> - - - - - - -<@common.importResources /> - - - - - - - - - - - -<@common.navbar/> -
+<#macro anlyResultTmpl> + - - + + +<#macro anlyResultDisplayTmpl> + + + +<#macro pageInfoTmpl> + + \ 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}},{{>totalSize}}条调用记录,消耗总时长:{{>totalTime}}ms。 + 调度入口IP:{{>callIP}},开始时间:{{>startTimeStr}}, + {{if totalSize > maxQueryNodeSize}} + 调用超过{{>maxQueryNodeSize}}个节点,仅展示入口调用, + {{else totalSize > maxShowNodeSize}} + 共{{>totalSize}}个调用节点,仅展示前{{>showSize}}个调用节点, + {{else}} + {{>totalSize}}个调用节点, + {{/if}}消耗总时长:{{>totalTime}}ms。