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 47771b9bf0d705055062d55df081cf273820fe62..85e14e23f58909f837270ac7cb04852a5dcfdaef 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 @@ -30,31 +30,102 @@ public class CallChainTreeNode { * key: treeId + 小时 * value: 当前树的当前小时范围内的,所有分钟和节点的统计数据 */ - private Map chainNodeContainer; + private Map chainNodeSpecificMinSummaryContainer; + + /** + * key: treeId + 天 + * value: 当前树的当前天范围内的,所有小时和节点的统计数据 + */ + private Map chainNodeSpecificHourSummaryContainer; + + /** + * key: treeId + 月 + * value: 当前树的当前月范围内的,所有天和节点的统计数据 + */ + private Map chainNodeSpecificDaySummaryContainer; + + /** + * key: treeId + 年 + * value: 当前树的当前年范围内的,所有月份和节点的统计数据 + */ + private Map chainNodeSpecificMonthSummaryContainer; public CallChainTreeNode(ChainNode node) { this.traceLevelId = node.getTraceLevelId(); - chainNodeContainer = new HashMap(); + chainNodeSpecificMinSummaryContainer = new HashMap(); + chainNodeSpecificHourSummaryContainer = new HashMap(); + chainNodeSpecificDaySummaryContainer = new HashMap(); + chainNodeSpecificMonthSummaryContainer = new HashMap(); this.viewPointId = node.getViewPoint(); } public void summary(String treeId, ChainNode node) throws IOException { Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date(node.getStartDate())); - /** - * 按分钟维度进行汇总
- * chainNodeContainer以treeId和时间(精确到分钟)为key,value为当前时间范围内的所有分钟的汇总数据 - */ + + summaryMinResult(treeId, node, calendar); + summaryHourResult(treeId, node, calendar); + summaryDayResult(treeId, node, calendar); + summaryMonthResult(treeId, node, calendar); + } + + private void summaryMonthResult(String treeId, ChainNode node, Calendar calendar) { + String keyOfMonthSummaryTable = generateKeyOfMonthSummaryTable(treeId, calendar); + ChainNodeSpecificMonthSummary monthSummary = chainNodeSpecificMonthSummaryContainer.get(keyOfMonthSummaryTable); + if (monthSummary == null) { + monthSummary = HBaseUtil.loadSpecificMonthSummary(keyOfMonthSummaryTable, getTreeNodeId()); + chainNodeSpecificMonthSummaryContainer.put(keyOfMonthSummaryTable, monthSummary); + } + monthSummary.summary(String.valueOf(calendar.get(Calendar.YEAR)), node); + } + + private void summaryDayResult(String treeId, ChainNode node, Calendar calendar) { + String keyOfDaySummaryTable = generateKeyOfDaySummaryTable(treeId, calendar); + ChainNodeSpecificDaySummary daySummary = chainNodeSpecificDaySummaryContainer.get(keyOfDaySummaryTable); + if (daySummary == null) { + daySummary = HBaseUtil.loadSpecificDaySummary(keyOfDaySummaryTable, getTreeNodeId()); + chainNodeSpecificDaySummaryContainer.put(keyOfDaySummaryTable, daySummary); + } + daySummary.summary(String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)), node); + } + + private void summaryHourResult(String treeId, ChainNode node, Calendar calendar) { + String keyOfHourSummaryTable = generateKeyOfHourSummaryTable(treeId, calendar); + ChainNodeSpecificHourSummary hourSummary = chainNodeSpecificHourSummaryContainer.get(keyOfHourSummaryTable); + if (hourSummary == null) { + hourSummary = HBaseUtil.loadSpecificHourSummary(keyOfHourSummaryTable, getTreeNodeId()); + chainNodeSpecificHourSummaryContainer.put(keyOfHourSummaryTable, hourSummary); + } + hourSummary.summary(String.valueOf(calendar.get(Calendar.HOUR)), node); + } + + /** + * 按分钟维度进行汇总
+ * chainNodeContainer以treeId和时间(精确到分钟)为key,value为当前时间范围内的所有分钟的汇总数据 + */ + private void summaryMinResult(String treeId, ChainNode node, Calendar calendar) throws IOException { String keyOfMinSummaryTable = generateKeyOfMinSummaryTable(treeId, calendar); - ChainNodeSpecificMinSummary minSummary = chainNodeContainer.get(keyOfMinSummaryTable); + ChainNodeSpecificMinSummary minSummary = chainNodeSpecificMinSummaryContainer.get(keyOfMinSummaryTable); if (minSummary == null) { minSummary = HBaseUtil.loadSpecificMinSummary(keyOfMinSummaryTable, getTreeNodeId()); - chainNodeContainer.put(keyOfMinSummaryTable, minSummary); + chainNodeSpecificMinSummaryContainer.put(keyOfMinSummaryTable, minSummary); } - minSummary.summary(String.valueOf(calendar.get(Calendar.MINUTE)), node); } + private String generateKeyOfMonthSummaryTable(String treeId, Calendar calendar) { + return treeId + "/" + calendar.get(Calendar.YEAR); + } + + private String generateKeyOfDaySummaryTable(String treeId, Calendar calendar) { + return treeId + "/" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1); + } + + private String generateKeyOfHourSummaryTable(String treeId, Calendar calendar) { + return treeId + "/" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + + calendar.get(Calendar.DAY_OF_MONTH); + } + private String generateKeyOfMinSummaryTable(String treeId, Calendar calendar) { return treeId + "/" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH) + " " + calendar.get(Calendar.HOUR) + ":00:00"; @@ -76,7 +147,7 @@ public class CallChainTreeNode { */ public void saveSummaryResultToHBase() throws IOException, InterruptedException { List puts = new ArrayList(); - for (Map.Entry entry : chainNodeContainer.entrySet()) { + for (Map.Entry entry : chainNodeSpecificMinSummaryContainer.entrySet()) { Put put = new Put(entry.getKey().getBytes()); put.addColumn(HBaseTableMetaData.TABLE_CHAIN_ONE_MINUTE_SUMMARY.COLUMN_FAMILY_NAME.getBytes() , getTreeNodeId().getBytes(), entry.getValue().toString().getBytes()); diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificDaySummary.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificDaySummary.java new file mode 100644 index 0000000000000000000000000000000000000000..ed801f832b8a86ebb940c393b589bebd7815f2c8 --- /dev/null +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificDaySummary.java @@ -0,0 +1,47 @@ +package com.ai.cloud.skywalking.analysis.chainbuild.entity; + +import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainNode; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by xin on 16-3-10. + */ +public class ChainNodeSpecificDaySummary { + + /** + * key : 天 + */ + private Map summaryValueMap; + + public ChainNodeSpecificDaySummary(String originData) { + JsonObject jsonObject = (JsonObject) new JsonParser().parse(originData); + summaryValueMap = new Gson().fromJson(jsonObject.get("summaryValueMap").toString(), + new TypeToken>() { + }.getType()); + } + + public ChainNodeSpecificDaySummary() { + summaryValueMap = new HashMap(); + } + + public void summary(String minute, ChainNode node) { + ChainNodeSpecificTimeWindowSummaryValue summarValue = summaryValueMap.get(minute); + if (summarValue == null) { + summarValue = new ChainNodeSpecificTimeWindowSummaryValue(); + summaryValueMap.put(minute, summarValue); + } + + summarValue.summary(node); + } + + @Override + public String toString() { + return new Gson().toJson(this); + } +} diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificHourSummary.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificHourSummary.java new file mode 100644 index 0000000000000000000000000000000000000000..8b841738db46fb11c92bc73ee7bca70bdf18462b --- /dev/null +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificHourSummary.java @@ -0,0 +1,43 @@ +package com.ai.cloud.skywalking.analysis.chainbuild.entity; + +import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainNode; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +import java.util.HashMap; +import java.util.Map; + +public class ChainNodeSpecificHourSummary { + /** + * key : 小时 + */ + private Map summaryValueMap; + + public ChainNodeSpecificHourSummary(String originData) { + JsonObject jsonObject = (JsonObject) new JsonParser().parse(originData); + summaryValueMap = new Gson().fromJson(jsonObject.get("summaryValueMap").toString(), + new TypeToken>() { + }.getType()); + } + + public ChainNodeSpecificHourSummary() { + summaryValueMap = new HashMap(); + } + + public void summary(String minute, ChainNode node) { + ChainNodeSpecificTimeWindowSummaryValue summarValue = summaryValueMap.get(minute); + if (summarValue == null) { + summarValue = new ChainNodeSpecificTimeWindowSummaryValue(); + summaryValueMap.put(minute, summarValue); + } + + summarValue.summary(node); + } + + @Override + public String toString() { + return new Gson().toJson(this); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..b474ddcd6a5b4c222a2911d92b9cbaf28ea62c70 --- /dev/null +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificMonthSummary.java @@ -0,0 +1,46 @@ +package com.ai.cloud.skywalking.analysis.chainbuild.entity; + +import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainNode; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by xin on 16-3-10. + */ +public class ChainNodeSpecificMonthSummary { + /** + * key : 月 + */ + private Map summaryValueMap; + + public ChainNodeSpecificMonthSummary(String originData) { + JsonObject jsonObject = (JsonObject) new JsonParser().parse(originData); + summaryValueMap = new Gson().fromJson(jsonObject.get("summaryValueMap").toString(), + new TypeToken>() { + }.getType()); + } + + public ChainNodeSpecificMonthSummary() { + summaryValueMap = new HashMap(); + } + + public void summary(String minute, ChainNode node) { + ChainNodeSpecificTimeWindowSummaryValue summarValue = summaryValueMap.get(minute); + if (summarValue == null) { + summarValue = new ChainNodeSpecificTimeWindowSummaryValue(); + summaryValueMap.put(minute, summarValue); + } + + summarValue.summary(node); + } + + @Override + public String toString() { + return new Gson().toJson(this); + } +} diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/util/HBaseUtil.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/util/HBaseUtil.java index 834b4200f5dfb4d6b1db19102186e7fac7439257..a86ed888e0900eb8e627b035740ddd6a02185f2f 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/util/HBaseUtil.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/util/HBaseUtil.java @@ -4,6 +4,9 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import com.ai.cloud.skywalking.analysis.chainbuild.entity.ChainNodeSpecificDaySummary; +import com.ai.cloud.skywalking.analysis.chainbuild.entity.ChainNodeSpecificHourSummary; +import com.ai.cloud.skywalking.analysis.chainbuild.entity.ChainNodeSpecificMonthSummary; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.HBaseConfiguration; @@ -155,4 +158,16 @@ public class HBaseUtil { index++; } } + + public static ChainNodeSpecificHourSummary loadSpecificHourSummary(String keyOfHourSummaryTable, String treeNodeId) { + return null; + } + + public static ChainNodeSpecificDaySummary loadSpecificDaySummary(String keyOfDaySummaryTable, String treeNodeId) { + return null; + } + + public static ChainNodeSpecificMonthSummary loadSpecificMonthSummary(String keyOfMonthSummaryTable, String treeNodeId) { + return null; + } }