提交 ecb08224 编写于 作者: Y yong.you

Merge branch 'biz' of github.com:dianping/cat into biz

......@@ -6,14 +6,12 @@ import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.dal.jdbc.DalException;
import org.unidal.dal.jdbc.DalNotFoundException;
import org.unidal.lookup.annotation.Inject;
......@@ -30,9 +28,9 @@ public class DefaultBaselineService implements BaselineService, LogEnabled {
@Inject
private BaselineDao m_baselineDao;
private Map<String, Map<String, Baseline>> m_baselines = new HashMap<String, Map<String, Baseline>>();
private Logger m_logger;
private Map<String, Baseline> m_baselineMaps = new LinkedHashMap<String, Baseline>(1000) {
private Map<String, Baseline> m_baselineMap = new LinkedHashMap<String, Baseline>(1000) {
private static final long serialVersionUID = 1L;
......@@ -41,45 +39,26 @@ public class DefaultBaselineService implements BaselineService, LogEnabled {
return true;
}
};
private Logger m_logger;
@Override
public double[] queryDailyBaseline(String reportName, String key, Date reportPeriod) {
double[] result = new double[24 * 60];
Baseline baseline = queryFromMap(reportName, key, reportPeriod);
String baselineKey = reportName + ":" + key + ":" + reportPeriod;
Baseline baseline = m_baselineMap.get(baselineKey);
if (baseline == null) {
try {
baseline = m_baselineDao
.findByReportNameKeyTime(reportPeriod, reportName, key, BaselineEntity.READSET_FULL);
addBaselineToMap(baseline, reportName, key);
m_baselineMap.put(baselineKey, baseline);
result = parse(baseline.getData());
return result;
} catch (DalNotFoundException e) {
m_logger.info("Baseline not found: " + baselineKey);
} catch (Exception e) {
Cat.logError(e);
}
}
return result;
}
private void addBaselineToMap(Baseline baseline, String reportName, String key) {
Map<String, Baseline> baselineMap = m_baselines.get(reportName);
if (baselineMap == null) {
baselineMap = new HashMap<String, Baseline>();
m_baselines.put(reportName, baselineMap);
}
baselineMap.put(key, baseline);
}
private Baseline queryFromMap(String reportName, String key, Date reportPeriod) {
Map<String, Baseline> baselineMap = m_baselines.get(reportName);
if (baselineMap == null) {
return null;
}
Baseline result = baselineMap.get(key);
if (result != null && result.getReportPeriod().equals(reportPeriod)) {
return result;
}
return null;
}
......@@ -88,19 +67,15 @@ public class DefaultBaselineService implements BaselineService, LogEnabled {
double[] result = new double[60];
Date today = TaskHelper.todayZero(reportPeriod);
int hour = (int) ((reportPeriod.getTime() - today.getTime()) / TimeUtil.ONE_HOUR);
try {
Baseline baseline = m_baselineDao.findByReportNameKeyTime(today, reportName, key, BaselineEntity.READSET_FULL);
double[] dayResult = parse(baseline.getData());
for (int i = 0; i < 60; i++) {
result[i] = dayResult[hour * 60 + i];
}
return result;
} catch (DalNotFoundException e) {
m_logger.warn("base line cant't be fonund!" + reportName + " " + key + " " + reportPeriod);
} catch (Exception e) {
Cat.logError(e);
double[] dayResult = queryDailyBaseline(reportName, key, today);
if (dayResult == null)
return null;
for (int i = 0; i < 60; i++) {
result[i] = dayResult[hour * 60 + i];
}
return null;
return result;
}
@Override
......@@ -108,9 +83,7 @@ public class DefaultBaselineService implements BaselineService, LogEnabled {
try {
baseline.setData(build(baseline.getDataInDoubleArray()));
m_baselineDao.insert(baseline);
} catch (DalException e) {
Cat.logError(e);
} catch (IOException e) {
} catch (Exception e) {
Cat.logError(e);
}
}
......
......@@ -2,6 +2,7 @@ package com.dianping.cat.report.task.metric;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
......@@ -60,9 +61,9 @@ public class MetricAlert implements Task, LogEnabled {
private static final long TEN_SECONDS = 10 * 1000;
private static final int DURATION_IN_MINUTE = 1;
private static final long DURATION = 1 * TimeUtil.ONE_MINUTE;
private static final long DURATION = DURATION_IN_MINUTE * TimeUtil.ONE_MINUTE;
private Set<AlertInfo> alertInfoSet = new HashSet<AlertInfo>();
@Override
public void enableLogging(Logger logger) {
......@@ -98,69 +99,105 @@ public class MetricAlert implements Task, LogEnabled {
}
}
private List<Integer> check(double[] realDatas, double[] baseLineDatas, BaselineConfig config) {
int size = realDatas.length;
for (int i = 0; i <= size; i++) {
}
return null;
}
protected void metricAlert(Date date) {
protected List<AlertInfo> metricAlert(Date date) {
long current = date.getTime() / 1000 / 60;
int minute = (int) (current % (60));
if (minute == 0) {
alertInfoSet = new HashSet<AlertInfo>();
}
Set<String> productLines = m_productLineConfigManager.queryProductLines().keySet();
List<AlertInfo> alerts = new ArrayList<AlertInfo>();
for (String productLine : productLines) {
MetricReport report = queryMetricReport(productLine);
if (report == null) {
continue;
}
for (MetricItem item : report.getMetricItems().values()) {
String key = item.getId();
MetricItemConfig metricConfig = m_metricConfigManager.queryMetricItemConfig(key);
List<Integer> alerts = new ArrayList<Integer>();
MetricItemConfig metricConfig = m_metricConfigManager.queryMetricItemConfig(item.getId());
if (metricConfig == null) {
continue;
}
if (metricConfig.isShowCount()) {
alerts.addAll(buildAlertInfo(date, MetricType.COUNT, item, key));
alerts.addAll(buildAlertInfo(date, productLine, MetricType.COUNT, item, minute));
}
if (metricConfig.isShowAvg()) {
alerts.addAll(buildAlertInfo(date, MetricType.AVG, item, key));
alerts.addAll(buildAlertInfo(date, productLine, MetricType.AVG, item, minute));
}
if (metricConfig.isShowSum()) {
alerts.addAll(buildAlertInfo(date, MetricType.SUM, item, key));
alerts.addAll(buildAlertInfo(date, productLine, MetricType.SUM, item, minute));
}
if (alerts.size() > 0) {
String alertInfo = buildAlertInfo(alerts, minute);
m_logger.info(alertInfo);
}
}
List<AlertInfo> result = new ArrayList<AlertInfo>();
if (alerts.size() > 0) {
for (AlertInfo alert : alerts) {
if (!alertInfoSet.contains(alert)) {
m_logger.info(alert.toString());
result.add(alert);
alertInfoSet.add(alert);
}
}
}
return result;
}
private String buildAlertInfo(List<Integer> alerts, int minute) {
return null;
protected class AlertInfo {
Date date;
MetricType metricType;
String productLine;
String metricId;
public AlertInfo(Date date, MetricType metricType, String productLine, String metricId) {
super();
this.date = date;
this.metricType = metricType;
this.productLine = productLine;
this.metricId = metricId;
}
@Override
public String toString() {
return "AlertInfo [date=" + date + ", metricType=" + metricType + ", productLine=" + productLine
+ ", metricId=" + metricId + "]";
}
}
private List<Integer> buildAlertInfo(Date date, MetricType type, MetricItem item, String key) {
String baseLineKey = key + ":" + type;
private List<AlertInfo> buildAlertInfo(Date date, String productLine, MetricType type, MetricItem item, int minute) {
List<AlertInfo> result = new ArrayList<AlertInfo>();
String id = item.getId();
String baseLineKey = id + ":" + type;
double[] baseline = m_baselineService.queryHourlyBaseline(METRIC, baseLineKey, date);
if (baseline != null) {
double[] realDatas = extractDatasFromReport(item, type);
double[] realDatas = m_parser.buildHourlyData(item, type);
if (realDatas == null) {
return result;
}
BaselineConfig baselineConfig = m_baselineConfigManager.queryBaseLineConfig(baseLineKey);
return check(baseline, realDatas, baselineConfig);
List<Integer> minutes = checkData(baseline, realDatas, minute, baselineConfig);
for (int resultMinuteInHour : minutes) {
long current = date.getTime() / TimeUtil.ONE_MINUTE;
long resultMinute = current - minute + resultMinuteInHour;
Date resultDate = new Date(resultMinute * TimeUtil.ONE_MINUTE);
AlertInfo info = new AlertInfo(resultDate, type, productLine, item.getId());
result.add(info);
}
}
return new ArrayList<Integer>();
}
private double[] extractDatasFromReport(MetricItem item, MetricType type) {
return m_parser.queryOneHourData(item, type);
return result;
}
private MetricReport queryMetricReport(String product) {
ModelRequest request = new ModelRequest(product, ModelPeriod.CURRENT.getStartTime());
if (m_service.isEligable(request)) {
ModelResponse<MetricReport> response = m_service.invoke(request);
if (response == null) {
return null;
}
MetricReport report = response.getModel();
return report;
} else {
......@@ -170,12 +207,10 @@ public class MetricAlert implements Task, LogEnabled {
private List<Integer> checkData(double[] baseline, double[] datas, int minute, BaselineConfig config) {
List<Integer> result = new ArrayList<Integer>();
int start = minute / DURATION_IN_MINUTE;
int end = minute / DURATION_IN_MINUTE + DURATION_IN_MINUTE;
double minValue = config.getMinValue();
double lowerLimit = config.getLowerLimit();
double upperLimit = config.getUpperLimit();
for (int i = start; i < end; i++) {
for (int i = 0; i <= minute; i++) {
if (baseline[i] < 0) {
continue;
} else if (baseline[i] == 0) {
......
......@@ -87,7 +87,7 @@ public class MetricBaselineReportBuilder implements ReportTaskBuilder {
reports.add(reportItem);
}
double[] oneDayValue = m_parser.queryOneDayData(reports, type);
double[] oneDayValue = m_parser.buildDailyData(reports, type);
values.add(oneDayValue);
}
......
......@@ -10,7 +10,7 @@ public class MetricPointParser {
private static final int POINT_NUMBER = 60;
public double[] queryOneHourData(MetricItem item, MetricType type) {
public double[] buildHourlyData(MetricItem item, MetricType type) {
double[] result = new double[POINT_NUMBER];
Map<Integer, Point> map = item.getAbtests().get("-1").getGroups().get("").getPoints();
for (Integer minute : map.keySet()) {
......@@ -26,7 +26,7 @@ public class MetricPointParser {
return result;
}
public double[] queryOneDayData(List<MetricItem> items, MetricType type) {
public double[] buildDailyData(List<MetricItem> items, MetricType type) {
int size = items.size();
double[] values = new double[24 * POINT_NUMBER];
......@@ -36,14 +36,14 @@ public class MetricPointParser {
for (int hour = 0; hour < size; hour++) {
MetricItem item = items.get(hour);
try {
double[] oneHourValues = queryOneHourData(item, type);
double[] oneHourValues = buildHourlyData(item, type);
for (int minute = 0; minute < 60; minute++) {
int index = hour * 60 + minute;
values[index] = oneHourValues[minute];
}
} catch (NullPointerException e) {
// Do Nothing
continue;
}
}
return values;
......
......@@ -132,7 +132,7 @@ public class ReportFacade implements LogEnabled, Initializable {
m_reportBuilders.put("sql", m_sqlReportBuilder);
m_reportBuilders.put("state", m_stateReportBuilder);
m_reportBuilders.put("dependency", m_dependendcyReportBuilder);
m_reportBuilders.put("metricBaseline", m_metricBaselineReportBuilder);
m_reportBuilders.put("metric", m_metricBaselineReportBuilder);
}
}
......@@ -2,6 +2,11 @@ package com.dianping.cat.report.task.metric;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import junit.framework.Assert;
import org.junit.Test;
import org.unidal.helper.Files;
......@@ -10,7 +15,12 @@ import org.xml.sax.SAXException;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.metric.model.transform.DefaultSaxParser;
import com.dianping.cat.home.dal.report.Baseline;
import com.dianping.cat.report.baseline.BaselineConfig;
import com.dianping.cat.report.baseline.BaselineConfigManager;
import com.dianping.cat.report.baseline.BaselineService;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.task.metric.MetricAlert.AlertInfo;
import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.service.ModelResponse;
......@@ -21,13 +31,60 @@ public class MetricAlertTest extends ComponentTestCase {
MetricAlert alert = lookup(MetricAlert.class);
ModelService<MetricReport> modelService = new MyModelService();
alert.m_service = modelService;
alert.m_baselineConfigManager = new MyBaselineConfigManager();
alert.m_baselineService = new MyBaselineService();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
alert.metricAlert(format.parse("2013-07-10 10:00:00"));
List<AlertInfo> alerts = alert.metricAlert(format.parse("2013-07-10 10:00:00"));
Assert.assertEquals(1, alerts.size());
Assert.assertEquals(format.parse("2013-07-10 10:00:00"), alerts.get(0).date);
Assert.assertEquals("TuanGouWeb:URL:/index", alerts.get(0).metricId);
} catch (Exception e) {
e.printStackTrace();
}
}
private class MyBaselineService implements BaselineService {
@Override
public double[] queryDailyBaseline(String reportName, String key, Date reportPeriod) {
return null;
}
@Override
public double[] queryHourlyBaseline(String reportName, String key, Date reportPeriod) {
double[] result = { 4935.6, 4866.6, 4988.8, 4875.2, 4847.0, 5185.4, 5616.4, 5727.4, 5529.8, 5487.2, 5416.8,
5452.0, 5483.6, 5510.2, 5582.8, 5585.4, 5401.2, 5528.0, 5567.2, 5518.0, 5630.4, 5900.0, 5666.8, 5697.4,
5639.6, 5672.6, 5705.2, 5935.4, 5889.0, 5780.0, 5724.8, 5925.4, 5912.2, 5882.6, 5866.8, 5443.0, 5678.2,
5436.6, 5391.8, 5777.6, 5725.8, 5276.8, 5401.2, 5340.4, 6110.25, 5159.8, 5045.6, 4919.8, 5080.2, 5220.4,
5517.2, 6349.25, 5355.4, 5241.4, 6198.0, 6244.25, 6327.75, 6575.0, 6474.75, 6250.5 };
return result;
}
@Override
public void insertBaseline(Baseline baseline) {
}
}
private class MyBaselineConfigManager extends BaselineConfigManager {
@Override
public BaselineConfig queryBaseLineConfig(String key) {
BaselineConfig config = new BaselineConfig();
Integer[] days = { 0, -1, -2, -3, -4 };
Double[] weights = { 1.0, 1.0, 1.0, 1.0, 1.0 };
config.setDays(Arrays.asList(days));
config.setId(1);
config.setKey(key);
config.setLowerLimit(1);
config.setMinValue(1);
config.setTargetDate(1);
config.setUpperLimit(1);
config.setWeights(Arrays.asList(weights));
return config;
}
}
private class MyModelService implements ModelService<MetricReport> {
@Override
......@@ -38,6 +95,9 @@ public class MetricAlertTest extends ComponentTestCase {
@Override
public ModelResponse<MetricReport> invoke(ModelRequest request) {
ModelResponse<MetricReport> response = new ModelResponse<MetricReport>();
if (!request.getDomain().equals("TuanGou")) {
return null;
}
String xml;
try {
xml = Files.forIO().readFrom(getClass().getResourceAsStream("metricReport.xml"), "utf-8");
......
<?xml version="1.0" encoding="utf-8"?>
<metric-report product="TuanGou" startTime="2013-07-10 11:00:00" endTime="2013-07-01 11:59:59">
<metric-item id="/index" type="C">
<metric-item id="TuanGouWeb:URL:/index" type="C">
<abtest run-id="66">
<group name="">
<point id="0" count="1622" sum="4.56243375E8" avg="281284.44821208384"/>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册