diff --git a/skywalking-analysis/pom.xml b/skywalking-analysis/pom.xml
index d0c82b291..bd22c8694 100644
--- a/skywalking-analysis/pom.xml
+++ b/skywalking-analysis/pom.xml
@@ -47,6 +47,11 @@
4.12
test
+
+ com.google.code.gson
+ gson
+ 2.2.2
+
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/Config.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/Config.java
index 8f9d4fef2..7cb876a55 100644
--- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/Config.java
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/Config.java
@@ -15,6 +15,8 @@ public class Config {
public static String TABLE_CALL_CHAIN_RELATIONSHIP = "sw_chain_relationship";
+ public static String TABLE_CHAIN_INFO = "sw_chain_info";
+
}
public static class TraceInfo {
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/impl/CopyAttrFilter.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/impl/CopyAttrFilter.java
index 1f52e9bfd..e8efbe3a7 100644
--- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/impl/CopyAttrFilter.java
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/impl/CopyAttrFilter.java
@@ -16,6 +16,7 @@ public class CopyAttrFilter extends SpanNodeProcessFilter {
node.setViewPoint(spanEntry.getViewPoint());
node.setUserId(spanEntry.getUserId());
node.setBusinessKey(spanEntry.getBusinessKey());
+ node.setStartDate(spanEntry.getStartDate());
this.doNext(spanEntry, node, costMap);
}
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/CategorizedChainInfo.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/CategorizedChainInfo.java
new file mode 100644
index 000000000..376f52caa
--- /dev/null
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/CategorizedChainInfo.java
@@ -0,0 +1,42 @@
+package com.ai.cloud.skywalking.analysis.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+public class CategorizedChainInfo {
+ private String chainToken;
+ private String chainStr;
+
+ private List children_Token;
+
+ public CategorizedChainInfo(ChainInfo chainInfo) {
+ chainToken = chainInfo.getChainToken();
+
+ StringBuilder stringBuilder = new StringBuilder();
+ boolean flag = false;
+ for (ChainNode chainNode : chainInfo.getNodes()) {
+ if (flag) {
+ stringBuilder.append(";");
+ }
+ stringBuilder.append(chainNode.getTraceLevelId() + "-" + chainNode.getViewPoint());
+ flag = true;
+ }
+
+ chainStr = stringBuilder.toString();
+ children_Token = new ArrayList();
+ }
+
+ public String getChainStr() {
+ return chainStr;
+ }
+
+ public boolean isContained(UncategorizeChainInfo uncategorizeChainInfo) {
+ Pattern pattern = Pattern.compile(uncategorizeChainInfo.getNodeRegEx());
+ return pattern.matcher(getChainStr()).find();
+ }
+
+ public void add(UncategorizeChainInfo uncategorizeChainInfo) {
+ children_Token.add(uncategorizeChainInfo.getChainToken());
+ }
+}
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainInfo.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainInfo.java
index 4a4f1d1bd..927a44525 100644
--- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainInfo.java
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainInfo.java
@@ -15,6 +15,7 @@ public class ChainInfo implements Writable {
private List nodes;
private String userId = null;
private ChainNode firstChainNode;
+ private long startDate;
public ChainInfo() {
this.nodes = new ArrayList();
@@ -55,7 +56,7 @@ public class ChainInfo implements Writable {
chainNode.setParentLevelId(in.readLine());
chainNode.setLevelId(in.readInt());
chainNode.setBusinessKey(in.readLine());
-
+
nodes.add(chainNode);
}
}
@@ -99,6 +100,7 @@ public class ChainInfo implements Writable {
if ((chainNode.getParentLevelId() == null || chainNode.getParentLevelId().length() == 0)
&& chainNode.getLevelId() == 0) {
firstChainNode = chainNode;
+ startDate = chainNode.getStartDate();
}
}
@@ -137,6 +139,14 @@ public class ChainInfo implements Writable {
}
}
}
+
+ public void setChainToken(String chainToken) {
+ this.chainToken = chainToken;
+ }
+
+ public long getStartDate() {
+ return startDate;
+ }
}
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainNode.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainNode.java
index febbb721f..9acdf2156 100644
--- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainNode.java
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainNode.java
@@ -11,6 +11,7 @@ public class ChainNode {
private String parentLevelId;
private int levelId;
private String callType;
+ private long startDate;
// 不参与序列化
private String userId;
@@ -79,14 +80,26 @@ public class ChainNode {
this.businessKey = businessKey;
}
- public String getCallType() {
- return callType;
- }
-
public String getBusinessKey() {
return businessKey;
}
+ public String getTraceLevelId() {
+ StringBuilder stringBuilder = new StringBuilder();
+ if (getParentLevelId() != null && getParentLevelId().length() > 0) {
+ stringBuilder.append(getParentLevelId() + ".");
+ }
+ return stringBuilder.append(getLevelId()).toString();
+ }
+
+ public void setStartDate(long startDate) {
+ this.startDate = startDate;
+ }
+
+ public long getStartDate() {
+ return startDate;
+ }
+
public enum NodeStatus {
NORMAL('N'), ABNORMAL('A');
private char value;
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainNodeSummaryResult.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainNodeSummaryResult.java
new file mode 100644
index 000000000..55c177195
--- /dev/null
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/model/ChainNodeSummaryResult.java
@@ -0,0 +1,52 @@
+package com.ai.cloud.skywalking.analysis.model;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+
+import java.util.Map;
+
+public class ChainNodeSummaryResult {
+
+ private String traceLevelId;
+
+ private Map summerResultMap;
+
+ public ChainNodeSummaryResult(String value) {
+ JsonObject jsonObject = new Gson().fromJson(value, JsonObject.class);
+ traceLevelId = jsonObject.get("traceLevelId").getAsString();
+ summerResultMap = new Gson().fromJson(jsonObject.get("summerResultMap").getAsString(),
+ new TypeToken