예제 #1
0
파일: BaseAlert.java 프로젝트: nanin/cat
  protected AlertResultEntity computeAlertInfo(
      int minute, String product, String metricKey, MetricType type) {
    double[] value = null;
    double[] baseline = null;
    List<Config> configs = m_ruleConfigManager.queryConfigs(product, metricKey, type);
    Pair<Integer, List<Condition>> resultPair = queryCheckMinuteAndConditions(configs);
    int maxMinute = resultPair.getKey();
    List<Condition> conditions = resultPair.getValue();

    if (minute >= maxMinute - 1) {
      MetricReport report = fetchMetricReport(product, ModelPeriod.CURRENT);

      if (report != null) {
        int start = minute + 1 - maxMinute;
        int end = minute;

        value = queryRealData(start, end, metricKey, report, type);
        baseline =
            queryBaseLine(
                start, end, metricKey, new Date(ModelPeriod.CURRENT.getStartTime()), type);

        return m_dataChecker.checkData(value, baseline, conditions);
      }
    } else if (minute < 0) {
      MetricReport lastReport = fetchMetricReport(product, ModelPeriod.LAST);

      if (lastReport != null) {
        int start = 60 + minute + 1 - (maxMinute);
        int end = 60 + minute;

        value = queryRealData(start, end, metricKey, lastReport, type);
        baseline =
            queryBaseLine(start, end, metricKey, new Date(ModelPeriod.LAST.getStartTime()), type);
        return m_dataChecker.checkData(value, baseline, conditions);
      }
    } else {
      MetricReport currentReport = fetchMetricReport(product, ModelPeriod.CURRENT);
      MetricReport lastReport = fetchMetricReport(product, ModelPeriod.LAST);

      if (currentReport != null && lastReport != null) {
        int currentStart = 0, currentEnd = minute;
        double[] currentValue =
            queryRealData(currentStart, currentEnd, metricKey, currentReport, type);
        double[] currentBaseline =
            queryBaseLine(
                currentStart,
                currentEnd,
                metricKey,
                new Date(ModelPeriod.CURRENT.getStartTime()),
                type);

        int lastStart = 60 + 1 - (maxMinute - minute);
        int lastEnd = 59;
        double[] lastValue = queryRealData(lastStart, lastEnd, metricKey, lastReport, type);
        double[] lastBaseline =
            queryBaseLine(
                lastStart, lastEnd, metricKey, new Date(ModelPeriod.LAST.getStartTime()), type);

        value = mergerArray(lastValue, currentValue);
        baseline = mergerArray(lastBaseline, currentBaseline);
        return m_dataChecker.checkData(value, baseline, conditions);
      }
    }
    return null;
  }