Package com.dianping.cat.report.task.event

Source Code of com.dianping.cat.report.task.event.EventGraphCreator

package com.dianping.cat.report.task.event;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

import com.dianping.cat.consumer.event.model.entity.EventName;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.event.model.entity.EventType;
import com.dianping.cat.consumer.event.model.entity.Machine;
import com.dianping.cat.consumer.event.model.entity.Range;
import com.dianping.cat.core.dal.Graph;
import com.dianping.cat.report.task.spi.GraphLine;

public class EventGraphCreator {

  private long[] arrayAdd(long[] src, long added[]) {
    int size = added.length;
    if (src == null) {
      src = new long[size];
    }
    for (int i = 0; i < size; i++) {
      src[i] = src[i] + added[i];
    }
    return src;
  }

  private String arrayToString(long[] array) {
    StringBuilder sb = new StringBuilder();
    int size = 60;
    for (int i = 0; i < size; i++) {
      sb.append(array[i]);
      if (i < 59) {
        sb.append(',');
      }
    }
    return sb.toString();
  }

  private long[] getFailsCount(List<Range> ranges) {
    long[] value = new long[60];
    for (Range range : ranges) {
      int minute = range.getValue();
      value[minute] = range.getFails();
    }
    return value;
  }

  private long[] getTotalCount(List<Range> ranges) {
    long[] value = new long[60];
    for (Range range : ranges) {
      int minute = range.getValue();
      value[minute] = range.getCount();
    }
    return value;
  }

  public List<Graph> splitReportToGraphs(Date reportPeriod, String domainName, String reportName,
        EventReport eventReport) {
    Set<String> ips = eventReport.getIps();
    List<Graph> graphs = new ArrayList<Graph>(ips.size() + 1);
    Map<String, GraphLine> allDetailCache = new TreeMap<String, GraphLine>();
    Map<String, GraphLine> allSummaryCache = new TreeMap<String, GraphLine>();
    Date creationDate = new Date();
    for (String ip : ips) {
      Graph graph = new Graph();
      graph.setIp(ip);
      graph.setDomain(domainName);
      graph.setName(reportName);
      graph.setPeriod(reportPeriod);
      graph.setType(3);
      graph.setCreationDate(creationDate);
      Machine machine = eventReport.getMachines().get(ip);
      Map<String, EventType> types = machine.getTypes();
      StringBuilder detailBuilder = new StringBuilder();
      StringBuilder summaryBuilder = new StringBuilder();
      for (Entry<String, EventType> eventEntry : types.entrySet()) {
        EventType eventType = eventEntry.getValue();
        long[] typeCounts = new long[60];
        long[] typeFails = new long[60];

        Map<String, EventName> names = eventType.getNames();
        for (Entry<String, EventName> nameEntry : names.entrySet()) {
          EventName eventName = nameEntry.getValue();
          List<Range> ranges = new ArrayList<Range>(eventName.getRanges().values());
          detailBuilder.append(eventType.getId());
          detailBuilder.append('\t');
          detailBuilder.append(eventName.getId());
          detailBuilder.append('\t');

          long[] totalCount = getTotalCount(ranges);
          detailBuilder.append(arrayToString(totalCount));
          detailBuilder.append('\t');
          long[] failCount = getFailsCount(ranges);
          detailBuilder.append(arrayToString(failCount));
          detailBuilder.append('\n');

          String key = eventType.getId() + "\t" + eventName.getId();
          GraphLine detailLine = allDetailCache.get(key);
          if (detailLine == null) {
            detailLine = new GraphLine();
            allDetailCache.put(key, detailLine);
          }

          detailLine.totalCounts = arrayAdd(detailLine.totalCounts, totalCount);
          detailLine.failCounts = arrayAdd(detailLine.failCounts, failCount);

          typeCounts = arrayAdd(typeCounts, totalCount);
          typeFails = arrayAdd(typeFails, failCount);
        }

        String summaryKey = eventType.getId();
        GraphLine summaryLine = allSummaryCache.get(summaryKey);
        if (summaryLine == null) {
          summaryLine = new GraphLine();
          allSummaryCache.put(summaryKey, summaryLine);
        }
        summaryLine.totalCounts = arrayAdd(summaryLine.totalCounts, typeCounts);
        summaryLine.failCounts = arrayAdd(summaryLine.failCounts, typeFails);

        summaryBuilder.append(eventType.getId());
        summaryBuilder.append('\t');
        summaryBuilder.append(arrayToString(typeCounts));
        summaryBuilder.append('\t');
        summaryBuilder.append(arrayToString(typeFails));
        summaryBuilder.append('\n');
      }
      graph.setDetailContent(detailBuilder.toString());
      graph.setSummaryContent(summaryBuilder.toString());
      graphs.add(graph);
    }

    Graph allGraph = new Graph();
    allGraph.setIp("all");
    allGraph.setDomain(domainName);
    allGraph.setName(reportName);
    allGraph.setPeriod(reportPeriod);
    allGraph.setType(3);
    allGraph.setCreationDate(creationDate);

    StringBuilder detailSb = new StringBuilder();
    for (Entry<String, GraphLine> entry : allDetailCache.entrySet()) {
      detailSb.append(entry.getKey());
      detailSb.append('\t');
      GraphLine value = entry.getValue();
      detailSb.append(arrayToString(value.totalCounts));
      detailSb.append('\t');
      detailSb.append(arrayToString(value.failCounts));
      detailSb.append('\t');
      detailSb.append('\n');
    }
    allGraph.setDetailContent(detailSb.toString());

    StringBuilder summarySb = new StringBuilder();
    for (Entry<String, GraphLine> entry : allSummaryCache.entrySet()) {
      summarySb.append(entry.getKey());
      summarySb.append('\t');
      GraphLine value = entry.getValue();
      summarySb.append(arrayToString(value.totalCounts));
      summarySb.append('\t');
      summarySb.append(arrayToString(value.failCounts));
      summarySb.append('\n');
    }
    allGraph.setSummaryContent(summarySb.toString());
    graphs.add(allGraph);
    return graphs;
  }
}
TOP

Related Classes of com.dianping.cat.report.task.event.EventGraphCreator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.