提交 49b1fb81 编写于 作者: S sunryuan

refactor

上级 eae51786
......@@ -33,6 +33,7 @@ import com.dianping.cat.report.task.heartbeat.HeartbeatReportBuilder;
import com.dianping.cat.report.task.matrix.MatrixReportBuilder;
import com.dianping.cat.report.task.metric.MetricAlert;
import com.dianping.cat.report.task.metric.MetricBaselineReportBuilder;
import com.dianping.cat.report.task.metric.MetricPointParser;
import com.dianping.cat.report.task.problem.ProblemGraphCreator;
import com.dianping.cat.report.task.problem.ProblemMerger;
import com.dianping.cat.report.task.problem.ProblemReportBuilder;
......@@ -44,7 +45,6 @@ import com.dianping.cat.report.task.transaction.TransactionGraphCreator;
import com.dianping.cat.report.task.transaction.TransactionMerger;
import com.dianping.cat.report.task.transaction.TransactionReportBuilder;
public class TaskComponentConfigurator extends AbstractResourceConfigurator {
@Override
public List<Component> defineComponents() {
......@@ -62,21 +62,19 @@ public class TaskComponentConfigurator extends AbstractResourceConfigurator {
all.add(C(EventMerger.class));
all.add(C(ProblemMerger.class));
all.add(C(SqlMerger.class));
all.add(C(BaselineCreator.class,DefaultBaselineCreator.class));
all.add(C(BaselineService.class,DefaultBaselineService.class)
.req(BaselineDao.class));
all.add(C(BaselineConfigManager.class,BaselineConfigManager.class));
all.add(C(MetricBaselineReportBuilder.class)
.req(ReportService.class)//
.req(MetricConfigManager.class,ProductLineConfigManager.class)//
.req(BaselineCreator.class,BaselineService.class,BaselineConfigManager.class));
all.add(C(MetricAlert.class)
.req(ReportService.class,ServerConfigManager.class)//
.req(MetricConfigManager.class,ProductLineConfigManager.class)//
.req(BaselineService.class,BaselineConfigManager.class)
all.add(C(MetricPointParser.class));
all.add(C(BaselineCreator.class, DefaultBaselineCreator.class));
all.add(C(BaselineService.class, DefaultBaselineService.class).req(BaselineDao.class));
all.add(C(BaselineConfigManager.class, BaselineConfigManager.class));
all.add(C(MetricBaselineReportBuilder.class).req(ReportService.class, MetricPointParser.class)//
.req(MetricConfigManager.class, ProductLineConfigManager.class)//
.req(BaselineCreator.class, BaselineService.class, BaselineConfigManager.class));
all.add(C(MetricAlert.class).req(ReportService.class, ServerConfigManager.class, MetricPointParser.class)//
.req(MetricConfigManager.class, ProductLineConfigManager.class)//
.req(BaselineService.class, BaselineConfigManager.class)//
.req(ModelService.class, "metric"));
all.add(C(TransactionReportBuilder.class) //
......@@ -109,9 +107,12 @@ public class TaskComponentConfigurator extends AbstractResourceConfigurator {
TopologyGraphDao.class));
all.add(C(ReportFacade.class)//
.req(TransactionReportBuilder.class, EventReportBuilder.class, ProblemReportBuilder.class //
,HeartbeatReportBuilder.class, MatrixReportBuilder.class, CrossReportBuilder.class //
,SqlReportBuilder.class,StateReportBuilder.class, DependencyReportBuilder.class,MetricBaselineReportBuilder.class));
.req(TransactionReportBuilder.class, EventReportBuilder.class,
ProblemReportBuilder.class //
, HeartbeatReportBuilder.class, MatrixReportBuilder.class,
CrossReportBuilder.class //
, SqlReportBuilder.class, StateReportBuilder.class, DependencyReportBuilder.class,
MetricBaselineReportBuilder.class));
return all;
}
......
......@@ -6,6 +6,8 @@ import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.unidal.dal.jdbc.DalException;
import org.unidal.lookup.annotation.Inject;
......@@ -23,16 +25,43 @@ public class DefaultBaselineService implements BaselineService {
@Inject
private BaselineDao m_baselineDao;
private Map<String, Map<String, Baseline>> m_baselineMap = new HashMap<String, Map<String, Baseline>>();
@Override
public double[] queryDailyBaseline(String reportName, String key, Date reportPeriod) throws DalException,
IOException {
double[] result = new double[24 * 60];
Baseline baseline = m_baselineDao.findByReportNameKeyTime(reportPeriod, reportName, key,
BaselineEntity.READSET_FULL);
Baseline baseline = queryFromMap(reportName, key, reportPeriod);
if (baseline == null) {
baseline = m_baselineDao.findByReportNameKeyTime(reportPeriod, reportName, key, BaselineEntity.READSET_FULL);
addBaselineToMap(m_baselineMap, baseline, reportName, key);
}
result = parse(baseline.getData());
return result;
}
private void addBaselineToMap(Map<String, Map<String, Baseline>> allBaselineMap, Baseline baseline,
String reportName, String key) {
Map<String, Baseline> baselineMap = m_baselineMap.get(reportName);
if (baselineMap == null) {
baselineMap = new HashMap<String, Baseline>();
m_baselineMap.put(reportName, baselineMap);
}
baselineMap.put(key, baseline);
}
private Baseline queryFromMap(String reportName, String key, Date reportPeriod) {
Map<String, Baseline> baselineMap = m_baselineMap.get(reportName);
if (baselineMap == null) {
return null;
}
Baseline result = baselineMap.get(key);
if (result != null && result.getReportPeriod().equals(reportPeriod)) {
return result;
}
return null;
}
@Override
public double[] queryHourlyBaseline(String reportName, String key, Date reportPeriod) throws DalException,
IOException {
......
......@@ -26,7 +26,6 @@ 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.service.ReportService;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.service.ModelPeriod;
import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.service.ModelResponse;
......@@ -53,9 +52,14 @@ public class MetricAlert implements Task, LogEnabled {
@Inject(type = ModelService.class, value = "metric")
protected ModelService<MetricReport> m_service;
@Inject
protected MetricPointParser m_parser;
private Logger m_logger;
private static final long TEN_SECONDS = 10 * TimeUtil.ONE_MINUTE;
private static final int DURATION_IN_MINUTE = 1;
private static final long DURATION = DURATION_IN_MINUTE * TimeUtil.ONE_MINUTE;
......@@ -72,7 +76,7 @@ public class MetricAlert implements Task, LogEnabled {
Transaction t = Cat.newTransaction("MetricAlert", "Redo");
long current = System.currentTimeMillis();
try {
Date reportPeriod = new Date(new Date().getTime() - DURATION);
Date reportPeriod = new Date(new Date().getTime() - DURATION - TEN_SECONDS);
metricAlert(reportPeriod);
t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
......@@ -95,9 +99,8 @@ public class MetricAlert implements Task, LogEnabled {
protected void metricAlert(Date reportPeriod) {
Map<String, MetricItemConfig> metricConfigMap = m_metricConfigManager.getMetricConfig().getMetricItemConfigs();
Map<String, double[]> baselineMap = new HashMap<String, double[]>();
Date hourStart = TaskHelper.thisHour(reportPeriod);
Map<String,MetricReport> metricReportMap = new HashMap<String,MetricReport>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(reportPeriod);
int minute = calendar.get(Calendar.MINUTE);
......@@ -108,13 +111,18 @@ public class MetricAlert implements Task, LogEnabled {
for (MetricType type : MetricType.values()) {
String key = metricID + ":" + type;
BaselineConfig baselineConfig = m_baselineConfigManager.queryBaseLineConfig(key);
String baselineKey = key + "+" + reportPeriod.getTime();
double[] baseline = queryBaseline(baselineMap, baselineKey, key, reportPeriod);
if (baseline == null) {
continue;
double[] baseline = null;
try {
baseline = m_baselineService.queryHourlyBaseline("metric", key, reportPeriod);
} catch (Exception e) {
continue;
}
MetricReport report = metricReportMap.get(productLine);
if(report == null){
report = queryMetricReport(productLine);
metricReportMap.put(productLine, report);
}
MetricReport report = queryMetricReport(productLine, hourStart.getTime());
double[] datas = extractDatasFromReport(report, metricConfig, type);
if (datas == null) {
continue;
......@@ -128,30 +136,17 @@ public class MetricAlert implements Task, LogEnabled {
}
}
private double[] queryBaseline(Map<String, double[]> baselineMap, String baselineKey, String key, Date reportPeriod) {
double[] result = baselineMap.get(baselineKey);
if (result == null) {
try {
result = m_baselineService.queryHourlyBaseline("metric", key, reportPeriod);
baselineMap.put(baselineKey, result);
} catch (Exception e) {
return null;
}
}
return result;
}
private double[] extractDatasFromReport(MetricReport report, MetricItemConfig metricConfig, MetricType type) {
try {
MetricItem reportItem = report.getMetricItems().get(metricConfig.getMetricKey());
double[] datas = MetricPointParser.getOneHourData(reportItem, type);
double[] datas = m_parser.getOneHourData(reportItem, type);
return datas;
} catch (NullPointerException e) {
return null;
}
}
private MetricReport queryMetricReport(String product, long dateTime) {
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);
......
......@@ -2,8 +2,10 @@ package com.dianping.cat.report.task.metric;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import org.unidal.lookup.annotation.Inject;
......@@ -40,17 +42,22 @@ public class MetricBaselineReportBuilder implements ReportTaskBuilder {
@Inject
protected BaselineService m_baselineService;
@Inject
protected MetricPointParser m_parser;
private static final int POINT_NUMBER = 60 * 24;
@Override
public boolean buildDailyTask(String reportName, String domain, Date reportPeriod) {
Map<String, MetricReport> reportMap = new HashMap<String, MetricReport>();
for (String metricID : m_configManager.getMetricConfig().getMetricItemConfigs().keySet()) {
buildDailyReportInternal(reportName, metricID, reportPeriod);
buildDailyReportInternal(reportMap, reportName, metricID, reportPeriod);
}
return true;
}
protected void buildDailyReportInternal(String reportName, String metricID, Date reportPeriod) {
protected void buildDailyReportInternal(Map<String, MetricReport> reportMap, String reportName, String metricID,
Date reportPeriod) {
MetricItemConfig metricConfig = m_configManager.getMetricConfig().getMetricItemConfigs().get(metricID);
String metricKey = metricConfig.getMetricKey();
String metricDomain = metricConfig.getDomain();
......@@ -67,12 +74,17 @@ public class MetricBaselineReportBuilder implements ReportTaskBuilder {
Date relatedHour = new Date(reportPeriod.getTime() + day * TimeUtil.ONE_DAY);
for (int i = 0; i < 24; i++) {
Date hourEnd = new Date(relatedHour.getTime() + TimeUtil.ONE_HOUR);
MetricReport report = m_reportService.queryMetricReport(productLine, relatedHour, hourEnd);
String metricReportKey = productLine + ":" + relatedHour.getTime();
MetricReport report = reportMap.get(metricReportKey);
if (report == null) {
report = m_reportService.queryMetricReport(productLine, relatedHour, hourEnd);
reportMap.put(metricReportKey, report);
}
MetricItem reportItem = report.getMetricItems().get(metricKey);
relatedHour = hourEnd;
reports.add(reportItem);
}
double[] oneDayValue = MetricPointParser.getOneDayData(reports, type);
double[] oneDayValue = m_parser.getOneDayData(reports, type);
values.add(oneDayValue);
}
......
......@@ -10,7 +10,7 @@ public class MetricPointParser {
private static final int POINT_NUMBER = 60;
public static double[] getOneHourData(MetricItem report, MetricType type) {
public double[] getOneHourData(MetricItem report, MetricType type) {
double[] result = new double[POINT_NUMBER];
Map<Integer, Point> map = report.getAbtests().get("-1").getGroups().get("").getPoints();
for (Integer minute : map.keySet()) {
......@@ -28,7 +28,7 @@ public class MetricPointParser {
return result;
}
public static double[] getOneDayData(List<MetricItem> reports, MetricType type) {
public double[] getOneDayData(List<MetricItem> reports, MetricType type) {
double[] values = new double[24*POINT_NUMBER];
for (int i = 0; i < 24*POINT_NUMBER; i++) {
values[i] = -1;
......@@ -36,7 +36,7 @@ public class MetricPointParser {
int hour = 0;
for (MetricItem report : reports) {
try {
double[] oneHourValues = MetricPointParser.getOneHourData(report, type);
double[] oneHourValues = getOneHourData(report, type);
for (int minute = 0; minute < 60; minute ++) {
int index = hour * 60 + minute;
......
......@@ -269,6 +269,10 @@
<role>com.dianping.cat.report.task.sql.SqlMerger</role>
<implementation>com.dianping.cat.report.task.sql.SqlMerger</implementation>
</component>
<component>
<role>com.dianping.cat.report.task.metric.MetricPointParser</role>
<implementation>com.dianping.cat.report.task.metric.MetricPointParser</implementation>
</component>
<component>
<role>com.dianping.cat.report.baseline.BaselineCreator</role>
<implementation>com.dianping.cat.report.baseline.impl.DefaultBaselineCreator</implementation>
......@@ -293,6 +297,9 @@
<requirement>
<role>com.dianping.cat.report.service.ReportService</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.metric.MetricPointParser</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
</requirement>
......@@ -320,6 +327,9 @@
<requirement>
<role>com.dianping.cat.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.metric.MetricPointParser</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
</requirement>
......
......@@ -21,7 +21,7 @@ public class MetricAlertTest extends ComponentTestCase {
MetricAlert alert = lookup(MetricAlert.class);
ModelService<MetricReport> modelService = new MyModelService();
alert.m_service = modelService;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
alert.metricAlert(format.parse("2013-07-10 10:00:00"));
} catch (Exception e) {
e.printStackTrace();
......@@ -32,28 +32,24 @@ public class MetricAlertTest extends ComponentTestCase {
@Override
public String getName() {
// TODO Auto-generated method stub
return null;
}
@Override
public ModelResponse<MetricReport> invoke(ModelRequest request) {
ModelResponse<MetricReport> response= new ModelResponse<MetricReport>();
String xml;
try {
xml = Files.forIO().readFrom(getClass().getResourceAsStream("metricReport.xml"),
"utf-8");
MetricReport report = DefaultSaxParser.parse(xml);
response.setModel(report);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return response;
}
public ModelResponse<MetricReport> invoke(ModelRequest request) {
ModelResponse<MetricReport> response = new ModelResponse<MetricReport>();
String xml;
try {
xml = Files.forIO().readFrom(getClass().getResourceAsStream("metricReport.xml"), "utf-8");
MetricReport report = DefaultSaxParser.parse(xml);
response.setModel(report);
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return response;
}
@Override
public boolean isEligable(ModelRequest request) {
......
......@@ -3,11 +3,13 @@ package com.dianping.cat.report.task.metric;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import org.junit.Assert;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.home.dal.report.Baseline;
import com.dianping.cat.report.baseline.BaselineConfig;
import com.dianping.cat.report.baseline.BaselineConfigManager;
......@@ -69,7 +71,7 @@ public class MetricBaselineReportBuilderTest extends ComponentTestCase {
public void testBuildDailyReport() throws Exception {
MetricBaselineReportBuilder builder = getReportBuilder();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
builder.buildDailyReportInternal("metric", "TuanGouWeb:URL:/index", format.parse("2013-07-01 00:00:00"));
builder.buildDailyReportInternal(new HashMap<String, MetricReport>(), "metric", "TuanGouWeb:URL:/index", format.parse("2013-07-01 00:00:00"));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册