Package com.dianping.cat.report.task.heartbeat

Source Code of com.dianping.cat.report.task.heartbeat.HeartbeatGraphCreator

/**
*
*/
package com.dianping.cat.report.task.heartbeat;

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.heartbeat.model.entity.Detail;
import com.dianping.cat.consumer.heartbeat.model.entity.Disk;
import com.dianping.cat.consumer.heartbeat.model.entity.Extension;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.heartbeat.model.entity.Period;
import com.dianping.cat.core.dal.Graph;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.GraphLine;

public class HeartbeatGraphCreator  {

  private void cacheHeartbeatColumn(Map<String, GraphLine> detailCache, int minute, Number value, String key) {
    GraphLine detailLine = detailCache.get(key);
    if (detailLine == null) {
      detailLine = new GraphLine();
      detailLine.minuteNumbers = new double[60];
      detailCache.put(key, detailLine);
    }
    detailLine.minuteNumbers[minute] = value.doubleValue();
  }

  public List<Graph> splitReportToGraphs(Date reportPeriod, String domainName, String reportName,
        HeartbeatReport heartbeatReport) {
    Set<String> ips = heartbeatReport.getIps();
    List<Graph> graphs = new ArrayList<Graph>(ips.size());

    for (String ip : ips) {
      Graph graph = new Graph();
      graph.setIp(ip);
      graph.setDomain(domainName);
      graph.setName(reportName);
      graph.setPeriod(reportPeriod);
      graph.setType(3);
      com.dianping.cat.consumer.heartbeat.model.entity.Machine machine = heartbeatReport.getMachines().get(ip);

      if (machine == null) {
        continue;
      }
      List<Period> periods = machine.getPeriods();
      Map<String, GraphLine> detailCache = new TreeMap<String, GraphLine>();

      for (Period period : periods) {
        int minute = period.getMinute();

        String key = "CatMessageSize";
        Number value = period.getCatMessageSize();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "CatMessageOverflow";
        value = period.getCatMessageOverflow();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "CatMessageProduced";
        value = period.getCatMessageProduced();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        List<Disk> disks = period.getDisks();
        for (Disk d : disks) {
          key = "Disk " + d.getPath();
          value = d.getFree();
          cacheHeartbeatColumn(detailCache, minute, value, key);
        }

        key = "MemoryFree";
        value = period.getMemoryFree();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "HeapUsage";
        value = period.getHeapUsage();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "NoneHeapUsage";
        value = period.getNoneHeapUsage();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "SystemLoadAverage";
        value = period.getSystemLoadAverage();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "OldGcCount";
        value = period.getOldGcCount();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "NewGcCount";
        value = period.getNewGcCount();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "PigeonStartedThread";
        value = period.getPigeonThreadCount();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "CatThreadCount";
        value = period.getCatThreadCount();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "TotalStartedThread";
        value = period.getTotalStartedCount();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "DaemonThread";
        value = period.getDaemonCount();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "ActiveThread";
        value = period.getThreadCount();
        cacheHeartbeatColumn(detailCache, minute, value, key);

        key = "HttpThread";
        value = period.getHttpThreadCount();
        cacheHeartbeatColumn(detailCache, minute, value, key);
       
        for(Extension ext : period.getExtensions().values()){
          for(Entry<String,Detail> detail : ext.getDetails().entrySet()){
            key = detail.getValue().getId();
            value = detail.getValue().getValue();
            cacheHeartbeatColumn(detailCache, minute, value, key);
          }
        }
      }

      for (Entry<String, GraphLine> entry : detailCache.entrySet()) {
        GraphLine line = entry.getValue();
        double[] numbers = line.minuteNumbers;
        double minValue = numbers[0];
        double maxValue = minValue;
        double sum = minValue;
        double sum2 = sum * sum;

        for (int i = 1; i < numbers.length; i++) {
          double n = numbers[i];
          if (n > maxValue) {
            maxValue = n;
          }
          if (n < minValue) {
            minValue = n;
          }
          sum += n;
          sum2 += n * n;
        }

        line.min = minValue;
        line.max = maxValue;
        line.sum = sum;
        line.sum2 = sum2;
      }

      StringBuilder sb = new StringBuilder(64 * detailCache.size());
      for (Entry<String, GraphLine> entry : detailCache.entrySet()) {
        GraphLine value = entry.getValue();
        sb.append(entry.getKey());
        sb.append('\t');
        sb.append(value.min);
        sb.append('\t');
        sb.append(value.max);
        sb.append('\t');
        sb.append(value.sum);
        sb.append('\t');
        sb.append(value.sum2);
        sb.append('\t');
        sb.append(TaskHelper.join(value.minuteNumbers, ','));
        sb.append('\n');
      }

      graph.setDetailContent(sb.toString());
      graph.setCreationDate(new Date());
      graphs.add(graph);
    }
    return graphs;
  }
}
TOP

Related Classes of com.dianping.cat.report.task.heartbeat.HeartbeatGraphCreator

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.