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")); } }