Package com.dianping.cat.report.page.state

Source Code of com.dianping.cat.report.page.state.StateGraphs

package com.dianping.cat.report.page.state;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.unidal.lookup.annotation.Inject;

import com.dianping.cat.consumer.state.model.entity.Detail;
import com.dianping.cat.consumer.state.model.entity.Message;
import com.dianping.cat.consumer.state.model.entity.ProcessDomain;
import com.dianping.cat.consumer.state.model.entity.StateReport;
import com.dianping.cat.helper.TimeHelper;
import com.dianping.cat.report.page.LineChart;
import com.dianping.cat.report.service.ReportServiceManager;

public class StateGraphs {

  @Inject
  private ReportServiceManager m_reportService;

  public LineChart buildGraph(StateReport report, String domain, Date start, Date end, String reportType, String key,
        String ip) {
    if (reportType.equalsIgnoreCase("graph")) {
      return getHourlyGraph(report, domain, start, end, key, ip);
    } else {
      return getDailyGraph(domain, start, end, key, ip);
    }
  }

  private LineChart getDailyGraph(String domain, Date start, Date end, String key, String ip) {
    List<StateReport> reports = new ArrayList<StateReport>();

    for (long date = start.getTime(); date < end.getTime(); date = date + TimeHelper.ONE_HOUR) {
      StateReport report = getHourlyReport(date, domain, ip);

      if (report != null) {
        reports.add(report);
      }
    }
    int day = (int) ((end.getTime() - start.getTime()) / TimeHelper.ONE_HOUR);
    LineChart item = new LineChart();

    item.setStart(start).setSize(day).setTitle(key).setStep(TimeHelper.ONE_HOUR);
    item.addSubTitle(key);
    item.addValue(getDataFromHourlySummary(reports, start.getTime(), day, key, ip));
    return item;
  }

  private double[] getDataFromHourlyDetail(StateReport report, long start, int size, String key, String ip) {
    double[] result = new double[size];
    StateShow show = new StateShow(ip);
    show.visitStateReport(report);
    Map<Long, Detail> datas = null;
    String domain = "";
    int index = key.indexOf(':');
    if (index != -1) {
      domain = key.substring(0, index);
      key = key.substring(index + 1);
      ProcessDomain processDomain = show.getProcessDomainMap().get(domain);
      if (processDomain != null) {
        datas = processDomain.getDetails();
      }
    }

    Map<Long, Message> messages = show.getMessagesMap();
    for (int i = 0; i < size; i++) {
      if (index != -1) {
        if (datas == null) {
          continue;
        }
        Detail detail = datas.get(i * 60 * 1000L + start);
        if (detail == null) {
          continue;
        }
        if (key.equalsIgnoreCase("total")) {
          result[i] = detail.getTotal();
        } else if (key.equalsIgnoreCase("totalLoss")) {
          result[i] = detail.getTotalLoss();
        } else if (key.equalsIgnoreCase("size")) {
          result[i] = detail.getSize() / 1024 / 1024;
        }
        continue;
      }
      Message message = messages.get(i * 60 * 1000L + start);

      if (message != null) {
        if (key.equalsIgnoreCase("total")) {
          result[i] = message.getTotal();
        } else if (key.equalsIgnoreCase("totalLoss")) {
          result[i] = message.getTotalLoss();
        } else if (key.equalsIgnoreCase("avgTps")) {
          result[i] = message.getTotal();
        } else if (key.equalsIgnoreCase("maxTps")) {
          result[i] = message.getTotal();
        } else if (key.equalsIgnoreCase("dump")) {
          result[i] = message.getDump();
        } else if (key.equalsIgnoreCase("dumpLoss")) {
          result[i] = message.getDumpLoss();
        } else if (key.equalsIgnoreCase("pigeonTimeError")) {
          result[i] = message.getPigeonTimeError();
        } else if (key.equalsIgnoreCase("networkTimeError")) {
          result[i] = message.getNetworkTimeError();
        } else if (key.equalsIgnoreCase("blockTotal")) {
          result[i] = message.getBlockTotal();
        } else if (key.equalsIgnoreCase("blockLoss")) {
          result[i] = message.getBlockLoss();
        } else if (key.equalsIgnoreCase("blockTime")) {
          result[i] = message.getBlockTime() * 1.0 / 60 / 1000;
        } else if (key.equalsIgnoreCase("size")) {
          result[i] = message.getSize() / 1024 / 1024;
        } else if (key.equalsIgnoreCase("delayAvg")) {
          if (message.getDelayCount() > 0) {
            result[i] = message.getDelaySum() / message.getDelayCount();
          }
        }
      }
    }
    return result;
  }

  private double[] getDataFromHourlySummary(List<StateReport> reports, long start, int size, String key, String ip) {
    double[] result = new double[size];

    for (StateReport report : reports) {
      Date startTime = report.getStartTime();
      StateShow show = new StateShow(ip);

      show.visitStateReport(report);
      int i = (int) ((startTime.getTime() - start) / TimeHelper.ONE_HOUR);

      if (key.equalsIgnoreCase("total")) {
        result[i] = show.getTotal().getTotal();
      } else if (key.equalsIgnoreCase("totalLoss")) {
        result[i] = show.getTotal().getTotalLoss();
      } else if (key.equalsIgnoreCase("avgTps")) {
        result[i] = show.getTotal().getAvgTps();
      } else if (key.equalsIgnoreCase("maxTps")) {
        result[i] = show.getTotal().getMaxTps();
      } else if (key.equalsIgnoreCase("dump")) {
        result[i] = show.getTotal().getDump();
      } else if (key.equalsIgnoreCase("dumpLoss")) {
        result[i] = show.getTotal().getDumpLoss();
      } else if (key.equalsIgnoreCase("pigeonTimeError")) {
        result[i] = show.getTotal().getPigeonTimeError();
      } else if (key.equalsIgnoreCase("networkTimeError")) {
        result[i] = show.getTotal().getNetworkTimeError();
      } else if (key.equalsIgnoreCase("blockTotal")) {
        result[i] = show.getTotal().getBlockTotal();
      } else if (key.equalsIgnoreCase("blockLoss")) {
        result[i] = show.getTotal().getBlockLoss();
      } else if (key.equalsIgnoreCase("blockTime")) {
        result[i] = show.getTotal().getBlockTime() * 1.0 / 60 / 1000;
      } else if (key.equalsIgnoreCase("size")) {
        result[i] = show.getTotal().getSize() / 1024 / 1024;
      } else if (key.equalsIgnoreCase("delayAvg")) {
        if (show.getTotal().getDelayCount() > 0) {
          result[i] = show.getTotal().getDelaySum() / show.getTotal().getDelayCount();
        }
      }
    }
    return result;
  }

  private LineChart getHourlyGraph(StateReport report, String domain, Date start, Date end, String key, String ip) {
    LineChart item = new LineChart();

    item.setStart(start).setSize(60).setTitle(key).setStep(TimeHelper.ONE_MINUTE);
    item.addSubTitle(key);
    item.addValue(getDataFromHourlyDetail(report, start.getTime(), 60, key, ip));
    return item;
  }

  private StateReport getHourlyReport(long date, String domain, String ip) {
    return m_reportService.queryStateReport(domain, new Date(date), new Date(date + TimeHelper.ONE_HOUR));
  }
}
TOP

Related Classes of com.dianping.cat.report.page.state.StateGraphs

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.