diff --git a/cat-home/src/main/java/com/dianping/cat/build/TaskComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/TaskComponentConfigurator.java
index e8f6db528f27dc8523cf0f9bc2491759b5e6d8db..c88c970ed778cc27c7f8ec2952f5a1e81289e544 100644
--- a/cat-home/src/main/java/com/dianping/cat/build/TaskComponentConfigurator.java
+++ b/cat-home/src/main/java/com/dianping/cat/build/TaskComponentConfigurator.java
@@ -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 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;
}
diff --git a/cat-home/src/main/java/com/dianping/cat/report/baseline/impl/DefaultBaselineService.java b/cat-home/src/main/java/com/dianping/cat/report/baseline/impl/DefaultBaselineService.java
index 0d4750539333ada6d53031eaf76ec306f98df76f..d1127844b10e9c67f087829d58b90d0fe9babf06 100644
--- a/cat-home/src/main/java/com/dianping/cat/report/baseline/impl/DefaultBaselineService.java
+++ b/cat-home/src/main/java/com/dianping/cat/report/baseline/impl/DefaultBaselineService.java
@@ -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> m_baselineMap = new HashMap>();
+
@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> allBaselineMap, Baseline baseline,
+ String reportName, String key) {
+ Map baselineMap = m_baselineMap.get(reportName);
+ if (baselineMap == null) {
+ baselineMap = new HashMap();
+ m_baselineMap.put(reportName, baselineMap);
+ }
+ baselineMap.put(key, baseline);
+ }
+
+ private Baseline queryFromMap(String reportName, String key, Date reportPeriod) {
+ Map 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 {
diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricAlert.java b/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricAlert.java
index 78156568704b124f93db1800797a3b549cb14f70..a79340eca8f015ea1250a030e4bb7391deb78b21 100644
--- a/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricAlert.java
+++ b/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricAlert.java
@@ -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 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 metricConfigMap = m_metricConfigManager.getMetricConfig().getMetricItemConfigs();
- Map baselineMap = new HashMap();
- Date hourStart = TaskHelper.thisHour(reportPeriod);
-
+ Map metricReportMap = new HashMap();
+
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 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 response = m_service.invoke(request);
diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricBaselineReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricBaselineReportBuilder.java
index 19ee74576f65af48f7ad5f7216b477254a115daf..0ee949f39f880f7270d107c53c3413797dcad5ea 100644
--- a/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricBaselineReportBuilder.java
+++ b/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricBaselineReportBuilder.java
@@ -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 reportMap = new HashMap();
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 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);
}
diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricPointParser.java b/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricPointParser.java
index 4dfd03126feee300cce6e2bbb040eddc42b49132..83ca0e45099a0d8f86ef70db99de52ef63fe2387 100644
--- a/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricPointParser.java
+++ b/cat-home/src/main/java/com/dianping/cat/report/task/metric/MetricPointParser.java
@@ -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 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 reports, MetricType type) {
+ public double[] getOneDayData(List 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;
diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml
index 7036851b15f6d9dc65bd07f4102b8502850bf697..598918fa141c4522152f720b2b83c93a781fef57 100755
--- a/cat-home/src/main/resources/META-INF/plexus/components.xml
+++ b/cat-home/src/main/resources/META-INF/plexus/components.xml
@@ -269,6 +269,10 @@
com.dianping.cat.report.task.sql.SqlMerger
com.dianping.cat.report.task.sql.SqlMerger
+
+ com.dianping.cat.report.task.metric.MetricPointParser
+ com.dianping.cat.report.task.metric.MetricPointParser
+
com.dianping.cat.report.baseline.BaselineCreator
com.dianping.cat.report.baseline.impl.DefaultBaselineCreator
@@ -293,6 +297,9 @@
com.dianping.cat.report.service.ReportService
+
+ com.dianping.cat.report.task.metric.MetricPointParser
+
com.dianping.cat.consumer.advanced.MetricConfigManager
@@ -320,6 +327,9 @@
com.dianping.cat.ServerConfigManager
+
+ com.dianping.cat.report.task.metric.MetricPointParser
+
com.dianping.cat.consumer.advanced.MetricConfigManager
diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/metric/MetricAlertTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/metric/MetricAlertTest.java
index c48771196e42ae039f49e95ce59584b15e14f05c..028368a87052f5923334b1672e408abe5e9cf317 100644
--- a/cat-home/src/test/java/com/dianping/cat/report/task/metric/MetricAlertTest.java
+++ b/cat-home/src/test/java/com/dianping/cat/report/task/metric/MetricAlertTest.java
@@ -21,7 +21,7 @@ public class MetricAlertTest extends ComponentTestCase {
MetricAlert alert = lookup(MetricAlert.class);
ModelService 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 invoke(ModelRequest request) {
- ModelResponse response= new ModelResponse();
- 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 invoke(ModelRequest request) {
+ ModelResponse response = new ModelResponse();
+ 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) {
diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/metric/MetricBaselineReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/metric/MetricBaselineReportBuilderTest.java
index d40a86289c7c78066f29f4c68984c7aa28e6075d..bbdc11d0f11eb98bc353b1a14a09a438edc0a995 100644
--- a/cat-home/src/test/java/com/dianping/cat/report/task/metric/MetricBaselineReportBuilderTest.java
+++ b/cat-home/src/test/java/com/dianping/cat/report/task/metric/MetricBaselineReportBuilderTest.java
@@ -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(), "metric", "TuanGouWeb:URL:/index", format.parse("2013-07-01 00:00:00"));
}
}