Commit b0c4674d authored by zhang.xin's avatar zhang.xin
Browse files

1. 新增天,月,小时的统计

parent 65679624
Loading
Loading
Loading
Loading
+81 −10
Original line number Diff line number Diff line
@@ -30,31 +30,102 @@ public class CallChainTreeNode {
     * key: treeId + 小时
     * value: 当前树的当前小时范围内的,所有分钟和节点的统计数据
     */
    private Map<String, ChainNodeSpecificMinSummary> chainNodeContainer;
    private Map<String, ChainNodeSpecificMinSummary> chainNodeSpecificMinSummaryContainer;

    /**
     * key: treeId + 天
     * value: 当前树的当前天范围内的,所有小时和节点的统计数据
     */
    private Map<String, ChainNodeSpecificHourSummary> chainNodeSpecificHourSummaryContainer;

    /**
     * key: treeId + 月
     * value: 当前树的当前月范围内的,所有天和节点的统计数据
     */
    private Map<String, ChainNodeSpecificDaySummary> chainNodeSpecificDaySummaryContainer;

    /**
     * key: treeId + 年
     * value: 当前树的当前年范围内的,所有月份和节点的统计数据
     */
    private Map<String, ChainNodeSpecificMonthSummary> chainNodeSpecificMonthSummaryContainer;

    public CallChainTreeNode(ChainNode node) {
        this.traceLevelId = node.getTraceLevelId();
        chainNodeContainer = new HashMap<String, ChainNodeSpecificMinSummary>();
        chainNodeSpecificMinSummaryContainer = new HashMap<String, ChainNodeSpecificMinSummary>();
        chainNodeSpecificHourSummaryContainer = new HashMap<String, ChainNodeSpecificHourSummary>();
        chainNodeSpecificDaySummaryContainer = new HashMap<String, ChainNodeSpecificDaySummary>();
        chainNodeSpecificMonthSummaryContainer = new HashMap<String, ChainNodeSpecificMonthSummary>();
        this.viewPointId = node.getViewPoint();
    }

    public void summary(String treeId, ChainNode node) throws IOException {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date(node.getStartDate()));

        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);
    }

    /**
     * 按分钟维度进行汇总<br/>
     * 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<Put> puts = new ArrayList<Put>();
        for (Map.Entry<String, ChainNodeSpecificMinSummary> entry : chainNodeContainer.entrySet()) {
        for (Map.Entry<String, ChainNodeSpecificMinSummary> 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());
+47 −0
Original line number Diff line number Diff line
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<String, ChainNodeSpecificTimeWindowSummaryValue> summaryValueMap;

    public ChainNodeSpecificDaySummary(String originData) {
        JsonObject jsonObject = (JsonObject) new JsonParser().parse(originData);
        summaryValueMap = new Gson().fromJson(jsonObject.get("summaryValueMap").toString(),
                new TypeToken<Map<String, ChainNodeSpecificTimeWindowSummaryValue>>() {
                }.getType());
    }

    public ChainNodeSpecificDaySummary() {
        summaryValueMap = new HashMap<String, ChainNodeSpecificTimeWindowSummaryValue>();
    }

    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);
    }
}
+43 −0
Original line number Diff line number Diff line
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<String, ChainNodeSpecificTimeWindowSummaryValue> summaryValueMap;

    public ChainNodeSpecificHourSummary(String originData) {
        JsonObject jsonObject = (JsonObject) new JsonParser().parse(originData);
        summaryValueMap = new Gson().fromJson(jsonObject.get("summaryValueMap").toString(),
                new TypeToken<Map<String, ChainNodeSpecificTimeWindowSummaryValue>>() {
                }.getType());
    }

    public ChainNodeSpecificHourSummary() {
        summaryValueMap = new HashMap<String, ChainNodeSpecificTimeWindowSummaryValue>();
    }

    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);
    }
}
+46 −0
Original line number Diff line number Diff line
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<String, ChainNodeSpecificTimeWindowSummaryValue> summaryValueMap;

    public ChainNodeSpecificMonthSummary(String originData) {
        JsonObject jsonObject = (JsonObject) new JsonParser().parse(originData);
        summaryValueMap = new Gson().fromJson(jsonObject.get("summaryValueMap").toString(),
                new TypeToken<Map<String, ChainNodeSpecificTimeWindowSummaryValue>>() {
                }.getType());
    }

    public ChainNodeSpecificMonthSummary() {
        summaryValueMap = new HashMap<String, ChainNodeSpecificTimeWindowSummaryValue>();
    }

    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);
    }
}
+15 −0
Original line number Diff line number Diff line
@@ -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;
    }
}