From 624a46df03195150839a03ef6d035355e5c85e0e Mon Sep 17 00:00:00 2001 From: wusheng Date: Tue, 8 Mar 2016 17:16:33 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=8F=90=E4=BA=A4=E5=A4=A7=E9=87=8F=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=202.=E4=BF=AE=E6=94=B9CallChainTree.nodes=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chainbuild/entity/CallChainTree.java | 22 ++++--- .../chainbuild/entity/CallChainTreeNode.java | 64 +++++++++++-------- .../entity/ChainNodeSpecificMinSummary.java | 12 ++-- ...ainNodeSpecificTimeWindowSummaryValue.java | 1 - .../analysis/chainbuild/util/HBaseUtil.java | 34 ++++++---- 5 files changed, 79 insertions(+), 54 deletions(-) diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/CallChainTree.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/CallChainTree.java index 0ea2ad2c5..c055e2e8e 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/CallChainTree.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/CallChainTree.java @@ -1,19 +1,22 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainInfo; import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainNode; import com.ai.cloud.skywalking.analysis.chainbuild.util.TokenGenerator; -import java.io.IOException; -import java.util.*; - public class CallChainTree { - private String callEntrance; private String treeToken; - //合并之后的节点 - // key : trace level Id + + /** + * 命名规则:levelId + @ + viewPoint + * 存放各级的各个viewpoint节点的统计数值 + */ private Map nodes; public CallChainTree(String callEntrance) { @@ -29,10 +32,11 @@ public class CallChainTree { public void summary(ChainInfo chainInfo) throws IOException { for (ChainNode node : chainInfo.getNodes()) { - CallChainTreeNode callChainTreeNode = nodes.get(node.getTraceLevelId()); + CallChainTreeNode newCallChainTreeNode = new CallChainTreeNode(node); + CallChainTreeNode callChainTreeNode = nodes.get(newCallChainTreeNode.getTreeNodeId()); if (callChainTreeNode == null) { - callChainTreeNode = new CallChainTreeNode(node); - nodes.put(node.getTraceLevelId() + "@" + node.getViewPoint(), callChainTreeNode); + callChainTreeNode = newCallChainTreeNode; + nodes.put(newCallChainTreeNode.getTreeNodeId(), callChainTreeNode); } callChainTreeNode.summary(treeToken, node); } 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 c47f7c6f9..8638ef58a 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 @@ -1,55 +1,58 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.hbase.client.Put; + import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainNode; import com.ai.cloud.skywalking.analysis.chainbuild.util.HBaseUtil; import com.ai.cloud.skywalking.analysis.config.HBaseTableMetaData; import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import com.google.gson.annotations.Expose; -import org.apache.hadoop.hbase.client.Put; - -import java.io.IOException; -import java.util.*; +/** + * + * 调用树的每个traceLevelId + "@" + viewPointId构成一个树节点
+ * 虚拟化节点概念。节点存储落地时,按照节点对应的时间戳
+ * + * @author wusheng + * + */ public class CallChainTreeNode { @Expose private String traceLevelId; @Expose private String viewPointId; - // key: treeId + 小时 + /** + * key: treeId + 小时 + * value: 当前树的当前小时范围内的,所有分钟和节点的统计数据 + */ private Map chainNodeContainer; - public CallChainTreeNode(ChainNode node) { this.traceLevelId = node.getTraceLevelId(); chainNodeContainer = new HashMap(); this.viewPointId = node.getViewPoint(); } - public CallChainTreeNode(String originData) { - JsonObject jsonObject = (JsonObject) new JsonParser().parse(originData); - traceLevelId = jsonObject.get("traceLevelId").getAsString(); - viewPointId = jsonObject.get("viewPointId").getAsString(); - // 每次都只load对应的节点统计结果,不全部load出来 - chainNodeContainer = new HashMap(); - } - - public void mergeIfNess(ChainNode node) { - if (!chainNodeContainer.containsKey(node.getNodeToken())) { - chainNodeContainer.put(node.getNodeToken(), new ChainNodeSpecificMinSummary()); - } - } - public void summary(String treeId, ChainNode node) throws IOException { Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date(node.getStartDate())); - // summary min + /** + * 按分钟维度进行汇总
+ * chainNodeContainer以treeId和时间(精确到分钟)为key,value为当前时间范围内的所有分钟的汇总数据 + */ String keyOfMinSummaryTable = generateKeyOfMinSummaryTable(treeId, calendar); ChainNodeSpecificMinSummary minSummary = chainNodeContainer.get(keyOfMinSummaryTable); if (minSummary == null) { - minSummary = HBaseUtil.loadSpecificMinSummary(keyOfMinSummaryTable, getTreeNodeDesc()); + minSummary = HBaseUtil.loadSpecificMinSummary(keyOfMinSummaryTable, getTreeNodeId()); chainNodeContainer.put(keyOfMinSummaryTable, minSummary); } @@ -66,19 +69,28 @@ public class CallChainTreeNode { return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(this); } + /** + * 存储入库时
+ * hbase的key 为 treeId + 小时
+ * 列族中,列为节点id,规则为:traceLevelId + "@" + viewPointId
+ * 列的值,为当前节点按小时内各分钟的汇总
+ * + * @throws IOException + * @throws InterruptedException + */ public void saveSummaryResultToHBase() throws IOException, InterruptedException { List puts = new ArrayList(); for (Map.Entry entry : chainNodeContainer.entrySet()) { Put put = new Put(entry.getKey().getBytes()); put.addColumn(HBaseTableMetaData.TABLE_CHAIN_ONE_MINUTE_SUMMARY.COLUMN_FAMILY_NAME.getBytes() - , getTreeNodeDesc().getBytes(), entry.getValue().toString().getBytes()); + , getTreeNodeId().getBytes(), entry.getValue().toString().getBytes()); puts.add(put); } HBaseUtil.batchSaveMinSummaryResult(puts); } - public String getTreeNodeDesc() { + public String getTreeNodeId() { return traceLevelId + "@" + viewPointId; } } diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificMinSummary.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificMinSummary.java index 414366ca9..600c27dce 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificMinSummary.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificMinSummary.java @@ -1,17 +1,19 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity; +import java.util.HashMap; +import java.util.Map; + 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 org.apache.hadoop.hbase.client.Put; - -import java.util.HashMap; -import java.util.Map; public class ChainNodeSpecificMinSummary { - // key : 分钟 + /** + * key : 分钟 + * value: 各节点统计数据 + */ private Map summaryValueMap; public ChainNodeSpecificMinSummary(String originData) { diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificTimeWindowSummaryValue.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificTimeWindowSummaryValue.java index 9aabee5c8..6c80f6225 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificTimeWindowSummaryValue.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/ChainNodeSpecificTimeWindowSummaryValue.java @@ -3,7 +3,6 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity; import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainNode; public class ChainNodeSpecificTimeWindowSummaryValue { - private long totalCall; private long totalCostTime; private long correctNumber; 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 05cce08d4..834b4200f 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 @@ -1,23 +1,31 @@ package com.ai.cloud.skywalking.analysis.chainbuild.util; -import com.ai.cloud.skywalking.analysis.chainbuild.entity.CallChainTree; -import com.ai.cloud.skywalking.analysis.chainbuild.entity.CallChainTreeNode; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.hbase.HColumnDescriptor; +import org.apache.hadoop.hbase.HTableDescriptor; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Admin; +import org.apache.hadoop.hbase.client.Connection; +import org.apache.hadoop.hbase.client.ConnectionFactory; +import org.apache.hadoop.hbase.client.Get; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.client.Table; +import org.apache.hadoop.hbase.util.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.ai.cloud.skywalking.analysis.chainbuild.entity.ChainNodeSpecificMinSummary; import com.ai.cloud.skywalking.analysis.config.Config; import com.ai.cloud.skywalking.analysis.config.HBaseTableMetaData; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.*; -import org.apache.hadoop.hbase.client.*; -import org.apache.hadoop.hbase.util.Bytes; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; public class HBaseUtil { private static Logger logger = LoggerFactory.getLogger(HBaseUtil.class.getName());