From 558c2f149cc2a74a8e720dad25374ce2427a4a75 Mon Sep 17 00:00:00 2001 From: jialinsun Date: Wed, 20 Aug 2014 20:22:32 +0800 Subject: [PATCH] pass monitor modify, app data daily report alarm --- cat-agent/src/main/webapp/paas-monitor.py | 14 +- cat-core/pom.xml | 1 + .../cat/build/ComponentsConfigurator.java | 3 + .../app/AppComparisonConfigManager.java | 116 +++++++++ .../cat/config/app/AppDataService.java | 30 ++- .../model/app-comparison-config-codegen.xml | 16 ++ .../model/app-comparison-config-manifest.xml | 6 + .../dal/model/app-comparison-config-model.xml | 16 ++ .../resources/META-INF/plexus/components.xml | 9 + .../META-INF/wizard/model/wizard.xml | 5 +- .../java/com/dianping/cat/CatHomeModule.java | 2 +- .../cat/build/AlarmComponentConfigurator.java | 13 +- .../cat/build/ComponentsConfigurator.java | 4 +- .../page/system/graph/SystemGraphCreator.java | 6 +- .../sender/decorator/ExceptionDecorator.java | 3 +- .../sender/decorator/ProjectDecorator.java | 2 +- .../sender/decorator/ThirdpartyDecorator.java | 3 +- .../summary/AlertSummaryFTLDecorator.java | 3 +- .../notify/AppDataComparisonNotifier.java | 243 ++++++++++++++++++ .../notify/AppDataComparisonResult.java | 58 +++++ .../cat/system/notify/ScheduledMailTask.java | 10 +- .../render/AppDataComparisonRender.java | 50 ++++ .../cat/system/page/config/Action.java | 2 + .../cat/system/page/config/Handler.java | 13 +- .../cat/system/page/config/JspFile.java | 2 + .../cat/system/page/config/JspViewer.java | 2 + .../resources/META-INF/plexus/components.xml | 43 ++++ .../config/default-app-comparison-config.xml | 10 + .../resources/freemaker/appDataComparison.ftl | 21 ++ .../src/main/webapp/WEB-INF/tags/body.tag | 1 + .../appComparisonConfig.jsp | 49 ++++ .../src/main/webapp/jsp/system/configTree.jsp | 1 + .../cat/system/config/appComparisonConfig.xml | 10 + 33 files changed, 732 insertions(+), 35 deletions(-) create mode 100644 cat-core/src/main/java/com/dianping/cat/config/app/AppComparisonConfigManager.java create mode 100644 cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-codegen.xml create mode 100644 cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-manifest.xml create mode 100644 cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-model.xml create mode 100644 cat-home/src/main/java/com/dianping/cat/system/notify/AppDataComparisonNotifier.java create mode 100644 cat-home/src/main/java/com/dianping/cat/system/notify/AppDataComparisonResult.java create mode 100644 cat-home/src/main/java/com/dianping/cat/system/notify/render/AppDataComparisonRender.java create mode 100644 cat-home/src/main/resources/config/default-app-comparison-config.xml create mode 100644 cat-home/src/main/resources/freemaker/appDataComparison.ftl create mode 100644 cat-home/src/main/webapp/jsp/system/appComparisonConfig/appComparisonConfig.jsp create mode 100644 cat-home/src/test/resources/com/dianping/cat/system/config/appComparisonConfig.xml diff --git a/cat-agent/src/main/webapp/paas-monitor.py b/cat-agent/src/main/webapp/paas-monitor.py index d989885e9..b034552a6 100644 --- a/cat-agent/src/main/webapp/paas-monitor.py +++ b/cat-agent/src/main/webapp/paas-monitor.py @@ -49,12 +49,12 @@ def get_created(inspect_info): def get_name(inspect_info): - return re.sub(r'(^/|_\d+$)', '', inspect_info['Name']) + return re.sub(r'(^/|_.+$)', '', inspect_info['Name']) def get_cpu_usage(metric_info): if 'current_usage' in metric_info['cpu_stats']['cpu_usage']: - return metric_info['cpu_stats']['cpu_usage']['cpu_usage'] + return metric_info['cpu_stats']['cpu_usage']['current_usage'] return 0 @@ -86,13 +86,11 @@ def get_container_info(pid): disk_usage = docker_command(pid, 'df -h | grep "rootfs"') disk_usage = re.split(r'\s+', disk_usage.strip())[-2][:-1] disk_usage = int(disk_usage) * 1.0 / 100 - ssh_md5 = docker_command(pid, 'md5sum /usr/sbin/sshd') - ssh_md5 = re.split(r'\s+', ssh_md5.strip())[0] eth0_rx, eth0_tx, eth0_errors, eth0_dropped, eth0_collision = get_network_info(pid, 'eth0') lo_rx, lo_tx, lo_errors, lo_dropped, lo_collision = get_network_info(pid, 'lo') - return disk_usage, ssh_md5, eth0_rx, eth0_tx, eth0_errors, eth0_dropped, eth0_collision, \ + return disk_usage, eth0_rx, eth0_tx, eth0_errors, eth0_dropped, eth0_collision, \ lo_rx, lo_tx, lo_errors, lo_dropped, lo_collision @@ -159,7 +157,7 @@ def get_all_info(current_instance=None): metric_info = instance_metric(instance_id) pid = inspect_info['State']['Pid'] - disk_usage, ssh_md5, eth0_rx, eth0_tx, eth0_errors, eth0_dropped, eth0_collision, lo_rx, lo_tx, \ + disk_usage, eth0_rx, eth0_tx, eth0_errors, eth0_dropped, eth0_collision, lo_rx, lo_tx, \ lo_errors, lo_dropped, lo_collision = get_container_info(pid) ip = get_ip(inspect_info) mem_total, mem_used, mem_cached, mem_free, mem_shared, mem_buffered = get_memory_info(metric_info, instance_id) @@ -170,7 +168,7 @@ def get_all_info(current_instance=None): m = [ ('domain', '', get_name(inspect_info)), - ('system_userCpu', 'avg', '%.3f' % (float(get_cpu_usage(metric_info)))), + ('system_cpuUsage', 'avg', '%.3f' % (float(get_cpu_usage(metric_info)))), ('system_cachedMem', 'avg', mem_cached), ('system_totalMem', 'avg', mem_total), ('system_usedMem', 'avg', mem_used), @@ -179,8 +177,6 @@ def get_all_info(current_instance=None): ('system_buffersMem', 'avg', mem_buffered), ('system_/-usage', 'avg', disk_usage), ('system_swapUsage', 'avg', get_swap_usage(metric_info)), - ('system_md5Change', 'avg', ssh_md5), - ('system_uptime', 'avg', get_created(inspect_info)), ('system_eth0-outFlow', 'sum', eth0_tx), ('system_eth0-inFlow', 'sum', eth0_rx), ('system_eth0-dropped', 'sum', eth0_dropped), diff --git a/cat-core/pom.xml b/cat-core/pom.xml index a5dc50b2b..1c765665b 100644 --- a/cat-core/pom.xml +++ b/cat-core/pom.xml @@ -70,6 +70,7 @@ ${basedir}/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml, ${basedir}/src/main/resources/META-INF/dal/model/aggreation-manifest.xml, ${basedir}/src/main/resources/META-INF/dal/model/app-config-manifest.xml, + ${basedir}/src/main/resources/META-INF/dal/model/app-comparison-config-manifest.xml, diff --git a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 432df764d..6d8e10dc7 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -15,6 +15,7 @@ import com.dianping.cat.app.AppDataCommandDao; import com.dianping.cat.config.aggregation.AggregationConfigManager; import com.dianping.cat.config.aggregation.AggregationHandler; import com.dianping.cat.config.aggregation.DefaultAggregationHandler; +import com.dianping.cat.config.app.AppComparisonConfigManager; import com.dianping.cat.config.app.AppConfigManager; import com.dianping.cat.config.app.AppDataService; import com.dianping.cat.config.url.DefaultUrlPatternHandler; @@ -64,6 +65,8 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { all.add(C(AppConfigManager.class).req(ConfigDao.class)); + all.add(C(AppComparisonConfigManager.class).req(ConfigDao.class)); + all.add(C(AppDataService.class).req(AppConfigManager.class, AppDataCommandDao.class)); all.add(C(UrlPatternHandler.class, DefaultUrlPatternHandler.class)); diff --git a/cat-core/src/main/java/com/dianping/cat/config/app/AppComparisonConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/app/AppComparisonConfigManager.java new file mode 100644 index 000000000..dfc110e70 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/config/app/AppComparisonConfigManager.java @@ -0,0 +1,116 @@ +package com.dianping.cat.config.app; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; +import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.helper.Files; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.Cat; +import com.dianping.cat.configuration.appComparison.entity.AppComparison; +import com.dianping.cat.configuration.appComparison.entity.AppComparisonConfig; +import com.dianping.cat.configuration.appComparison.transform.DefaultSaxParser; +import com.dianping.cat.core.config.Config; +import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.ConfigEntity; +import com.site.helper.Splitters; + +public class AppComparisonConfigManager implements Initializable { + + @Inject + private ConfigDao m_configDao; + + private AppComparisonConfig m_config; + + private static final String CONFIG_NAME = "appComparisonConfig"; + + private int m_configId; + + public AppComparisonConfig getConfig() { + return m_config; + } + + @Override + public void initialize() throws InitializationException { + try { + Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + String content = config.getContent(); + m_configId = config.getId(); + m_config = DefaultSaxParser.parse(content); + } catch (DalNotFoundException e) { + try { + String content = Files.forIO().readFrom( + this.getClass().getResourceAsStream("/config/default-app-comparison-config.xml"), "utf-8"); + Config config = m_configDao.createLocal(); + + config.setName(CONFIG_NAME); + config.setContent(content); + m_configDao.insert(config); + + m_configId = config.getId(); + m_config = DefaultSaxParser.parse(content); + } catch (Exception ex) { + Cat.logError(ex); + } + } catch (Exception e) { + Cat.logError(e); + } + } + + public Map queryAppComparisons() { + return m_config.getAppComparisons(); + } + + public List queryEmails(String id) { + List emails = new ArrayList(); + AppComparison appComparison = m_config.getAppComparisons().get(id); + + if (appComparison != null) { + emails.addAll(Splitters.by(",").noEmptyItem().split(appComparison.getEmails())); + } + return emails; + } + + public String queryEmailStr(String id) { + AppComparison appComparison = m_config.getAppComparisons().get(id); + + if (appComparison != null) { + return appComparison.getEmails(); + } + return null; + } + + public boolean insert(String xml) { + try { + m_config = DefaultSaxParser.parse(xml); + + return storeConfig(); + } catch (Exception e) { + Cat.logError(e); + return false; + } + } + + private boolean storeConfig() { + synchronized (this) { + try { + Config config = m_configDao.createLocal(); + + config.setId(m_configId); + config.setKeyId(m_configId); + config.setName(CONFIG_NAME); + config.setContent(m_config.toString()); + m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + } catch (Exception e) { + Cat.logError(e); + return false; + } + } + return true; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java b/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java index 5167ac929..d9b739fb0 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java +++ b/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java @@ -124,7 +124,7 @@ public class AppDataService { } public Double[] querySuccessRatio(int commandId, AppDataCommandMap convertedData) { - int n = convertedData.getMaxSize(); + int n = convertedData.getDuration(); Double[] value = new Double[n]; for (int i = 0; i < n; i++) { @@ -170,7 +170,7 @@ public class AppDataService { } public Double[] queryRequestCount(AppDataCommandMap convertedData) { - int n = convertedData.getMaxSize(); + int n = convertedData.getDuration(); Double[] value = new Double[n]; for (Entry> entry : convertedData.getAppDataCommands().entrySet()) { @@ -187,7 +187,7 @@ public class AppDataService { } public Double[] queryDelayAvg(AppDataCommandMap convertedData) { - int n = convertedData.getMaxSize(); + int n = convertedData.getDuration(); Double[] value = new Double[n]; for (Entry> entry : convertedData.getAppDataCommands().entrySet()) { @@ -206,21 +206,35 @@ public class AppDataService { return value; } + public double queryOneDayDelayAvg(QueryEntity entity) { + Double[] values = queryValue(entity, DELAY); + double delaySum = 0; + int size = 0; + + for (int i = 0; i < values.length; i++) { + if (values[i] != null) { + delaySum += values[i]; + size++; + } + } + return size > 0 ? delaySum / size : -1; + } + public class AppDataCommandMap { - private int m_maxSize; + private int m_duration; private Map> m_appDataCommands; - public int getMaxSize() { - return m_maxSize; + public int getDuration() { + return m_duration; } public Map> getAppDataCommands() { return m_appDataCommands; } - public AppDataCommandMap(int maxSize, Map> appDataCommands) { - m_maxSize = maxSize; + public AppDataCommandMap(int duration, Map> appDataCommands) { + m_duration = duration; m_appDataCommands = appDataCommands; } } diff --git a/cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-codegen.xml new file mode 100644 index 000000000..62e88431f --- /dev/null +++ b/cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-codegen.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-manifest.xml new file mode 100644 index 000000000..907bc301f --- /dev/null +++ b/cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-manifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-model.xml b/cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-model.xml new file mode 100644 index 000000000..d18660efb --- /dev/null +++ b/cat-core/src/main/resources/META-INF/dal/model/app-comparison-config-model.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index ea701ae74..626ba43d4 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -85,6 +85,15 @@ + + com.dianping.cat.config.app.AppComparisonConfigManager + com.dianping.cat.config.app.AppComparisonConfigManager + + + com.dianping.cat.core.config.ConfigDao + + + com.dianping.cat.config.app.AppDataService com.dianping.cat.config.app.AppDataService diff --git a/cat-core/src/main/resources/META-INF/wizard/model/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/model/wizard.xml index d7ad53dc8..ad8e3d893 100644 --- a/cat-core/src/main/resources/META-INF/wizard/model/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/model/wizard.xml @@ -4,6 +4,9 @@ src/test/resources/com/dianping/cat/message/configuration/server.xml - src/test/resources/com/dianping/cat/system/config/appConfig.xml + ../cat-home/src/test/resources/com/dianping/cat/system/config/appConfig.xml + + + ../cat-home/src/test/resources/com/dianping/cat/system/config/appComparisonConfig.xml diff --git a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java index 7803b14e3..07a3ab292 100644 --- a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +++ b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java @@ -74,7 +74,7 @@ public class CatHomeModule extends AbstractModule { private void executeAlarmModule(ModuleContext ctx) throws Exception { ServerConfigManager serverConfigManager = ctx.lookup(ServerConfigManager.class); ScheduledMailTask scheduledTask = ctx.lookup(ScheduledMailTask.class); - + Threads.forGroup("Cat").start(scheduledTask); if (serverConfigManager.isJobMachine() && !serverConfigManager.isLocalMode()) { Threads.forGroup("Cat").start(scheduledTask); } diff --git a/cat-home/src/main/java/com/dianping/cat/build/AlarmComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/AlarmComponentConfigurator.java index 6f612ee2c..0fa269885 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/AlarmComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/AlarmComponentConfigurator.java @@ -6,12 +6,17 @@ import java.util.List; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.config.app.AppComparisonConfigManager; +import com.dianping.cat.config.app.AppConfigManager; +import com.dianping.cat.config.app.AppDataService; import com.dianping.cat.home.dal.alarm.MailRecordDao; import com.dianping.cat.report.service.ReportServiceManager; import com.dianping.cat.report.task.alert.sender.sender.SenderManager; +import com.dianping.cat.system.notify.AppDataComparisonNotifier; import com.dianping.cat.system.notify.ReportRender; import com.dianping.cat.system.notify.ReportRenderImpl; import com.dianping.cat.system.notify.ScheduledMailTask; +import com.dianping.cat.system.notify.render.AppDataComparisonRender; import com.dianping.cat.system.page.alarm.ScheduledManager; class AlarmComponentConfigurator extends AbstractResourceConfigurator { @@ -21,10 +26,16 @@ class AlarmComponentConfigurator extends AbstractResourceConfigurator { all.add(C(ReportRender.class, ReportRenderImpl.class)); + all.add(C(AppDataComparisonRender.class)); + + all.add(C(AppDataComparisonNotifier.class).req(AppDataService.class) + .req(AppComparisonConfigManager.class, AppConfigManager.class) + .req(SenderManager.class, MailRecordDao.class, AppDataComparisonRender.class)); + all.add(C(ScheduledMailTask.class).// req(ReportRender.class, SenderManager.class)// .req(ReportServiceManager.class, ScheduledManager.class)// - .req(MailRecordDao.class)); + .req(MailRecordDao.class, AppDataComparisonNotifier.class)); return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index e54e424e0..6ac3cf17a 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -337,8 +337,8 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { all.add(C(AlertEntityService.class).req(AlertDao.class)); - all.add(C(AlertSummaryExecutor.class).req(AlertSummaryGenerator.class, AlertSummaryManager.class, SenderManager.class) - .req(AlertSummaryDecorator.class, AlertSummaryFTLDecorator.ID)); + all.add(C(AlertSummaryExecutor.class).req(AlertSummaryGenerator.class, AlertSummaryManager.class, + SenderManager.class).req(AlertSummaryDecorator.class, AlertSummaryFTLDecorator.ID)); all.add(C(AlertSummaryDecorator.class, AlertSummaryFTLDecorator.ID, AlertSummaryFTLDecorator.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/system/graph/SystemGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/system/graph/SystemGraphCreator.java index 3e82396ba..a382f1b15 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/system/graph/SystemGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/system/graph/SystemGraphCreator.java @@ -67,9 +67,9 @@ public class SystemGraphCreator extends AbstractGraphCreator { String type = pars.get("type"); if (PAAS_SYSTEM.equals(type)) { - type = SYSTEM_TYPE; - - pars.put("type", type); + type = PAAS_SYSTEM; + + pars.put("type", SYSTEM_TYPE); } return type; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ExceptionDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ExceptionDecorator.java index b0e97e16c..94f8daeee 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ExceptionDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ExceptionDecorator.java @@ -12,7 +12,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationExce import com.dianping.cat.Cat; import com.dianping.cat.report.task.alert.AlertType; import com.dianping.cat.report.task.alert.sender.AlertEntity; -import com.dianping.cat.system.notify.ReportRenderImpl; import freemarker.template.Configuration; import freemarker.template.Template; @@ -69,7 +68,7 @@ public class ExceptionDecorator extends ProjectDecorator implements Initializabl m_configuration = new Configuration(); m_configuration.setDefaultEncoding("UTF-8"); try { - m_configuration.setClassForTemplateLoading(ReportRenderImpl.class, "/freemaker"); + m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); } catch (Exception e) { Cat.logError(e); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ProjectDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ProjectDecorator.java index f48fbce38..3fd0c166e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ProjectDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ProjectDecorator.java @@ -31,7 +31,7 @@ public abstract class ProjectDecorator extends DefaultDecorator { return builder.toString(); } } catch (Exception ex) { - Cat.logError("build project contact info error for doamin: " + domainName, ex); + Cat.logError("build project contact info error for domain: " + domainName, ex); } return ""; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ThirdpartyDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ThirdpartyDecorator.java index 7acba77fc..6bab5637e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ThirdpartyDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/sender/decorator/ThirdpartyDecorator.java @@ -12,7 +12,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationExce import com.dianping.cat.Cat; import com.dianping.cat.report.task.alert.AlertType; import com.dianping.cat.report.task.alert.sender.AlertEntity; -import com.dianping.cat.system.notify.ReportRenderImpl; import freemarker.template.Configuration; import freemarker.template.Template; @@ -69,7 +68,7 @@ public class ThirdpartyDecorator extends ProjectDecorator implements Initializab m_configuration = new Configuration(); m_configuration.setDefaultEncoding("UTF-8"); try { - m_configuration.setClassForTemplateLoading(ReportRenderImpl.class, "/freemaker"); + m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); } catch (Exception e) { Cat.logError(e); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/summary/AlertSummaryFTLDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/summary/AlertSummaryFTLDecorator.java index 16788c418..59954c5ca 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/alert/summary/AlertSummaryFTLDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/summary/AlertSummaryFTLDecorator.java @@ -11,7 +11,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationExce import com.dianping.cat.Cat; import com.dianping.cat.home.alert.summary.entity.AlertSummary; -import com.dianping.cat.system.notify.ReportRenderImpl; import freemarker.template.Configuration; import freemarker.template.Template; @@ -75,7 +74,7 @@ public class AlertSummaryFTLDecorator implements AlertSummaryDecorator, Initiali m_configuration = new Configuration(); m_configuration.setDefaultEncoding("UTF-8"); try { - m_configuration.setClassForTemplateLoading(ReportRenderImpl.class, "/freemaker"); + m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); } catch (Exception e) { Cat.logError(e); } diff --git a/cat-home/src/main/java/com/dianping/cat/system/notify/AppDataComparisonNotifier.java b/cat-home/src/main/java/com/dianping/cat/system/notify/AppDataComparisonNotifier.java new file mode 100644 index 000000000..05abd4ad3 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/system/notify/AppDataComparisonNotifier.java @@ -0,0 +1,243 @@ +package com.dianping.cat.system.notify; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.unidal.dal.jdbc.DalException; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.Cat; +import com.dianping.cat.config.app.AppComparisonConfigManager; +import com.dianping.cat.config.app.AppConfigManager; +import com.dianping.cat.config.app.AppDataService; +import com.dianping.cat.config.app.QueryEntity; +import com.dianping.cat.configuration.appComparison.entity.AppComparison; +import com.dianping.cat.configuration.appComparison.entity.AppComparisonConfig; +import com.dianping.cat.configuration.appComparison.entity.Item; +import com.dianping.cat.helper.TimeUtil; +import com.dianping.cat.home.dal.alarm.MailRecord; +import com.dianping.cat.home.dal.alarm.MailRecordDao; +import com.dianping.cat.message.Transaction; +import com.dianping.cat.report.task.alert.sender.AlertChannel; +import com.dianping.cat.report.task.alert.sender.AlertMessageEntity; +import com.dianping.cat.report.task.alert.sender.sender.SenderManager; +import com.dianping.cat.system.notify.render.AppDataComparisonRender; +import com.site.helper.Splitters; +import com.site.lookup.util.StringUtils; + +public class AppDataComparisonNotifier { + + @Inject + private AppDataService m_appDataService; + + @Inject + private AppComparisonConfigManager m_appComparisonConfigManager; + + @Inject + private AppConfigManager m_appConfigManager; + + @Inject + private SenderManager m_sendManager; + + @Inject + private MailRecordDao m_mailRecordDao; + + @Inject + private AppDataComparisonRender m_render; + + private SimpleDateFormat m_sdf = new SimpleDateFormat("yyyy-MM-dd"); + + public void doNotifying() { + Date yesterdayDate = TimeUtil.getYesterday(); + String yesterday = m_sdf.format(yesterdayDate); + Transaction t = Cat.newTransaction("AppDataComparitonInformer", yesterday); + + try { + Map results = buildAppDataComparisonResults(yesterdayDate, + m_appComparisonConfigManager.getConfig()); + Map, List> results2Receivers = buildReceivers2Results(results); + + for (Entry, List> entry : results2Receivers.entrySet()) { + + notify(yesterdayDate, entry.getValue(), entry.getKey()); + } + + t.setStatus(Transaction.SUCCESS); + } catch (Exception e) { + t.setStatus(e); + } finally { + t.complete(); + } + } + + private Set buildAllUsers(Map results) { + Set allUsers = new HashSet(); + + for (Entry entry : results.entrySet()) { + AppDataComparisonResult result = entry.getValue(); + String id = result.getId(); + + allUsers.addAll(m_appComparisonConfigManager.queryEmails(id)); + } + return allUsers; + } + + private Map buildUser2Ids(Set allUsers, Map results) { + Map user2Id = new HashMap(); + + for (String user : allUsers) { + + for (Entry entry : results.entrySet()) { + AppDataComparisonResult result = entry.getValue(); + String id = result.getId(); + String emails = m_appComparisonConfigManager.queryEmailStr(id); + + if (emails.contains(user)) { + String ids = user2Id.get(user); + + if (StringUtils.isEmpty(ids)) { + user2Id.put(user, id); + } else { + user2Id.put(user, ids + ";" + id); + } + } + } + } + return user2Id; + } + + private Map buildid2Users(Map user2Id) { + Map id2Users = new HashMap(); + + for (Entry entry : user2Id.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + String users = user2Id.get(value); + + if (StringUtils.isEmpty(users)) { + id2Users.put(value, key); + } else { + id2Users.put(value, users + ";" + value); + } + } + return id2Users; + } + + private Map, List> buildReceivers2Results( + Map results) { + Set allUsers = buildAllUsers(results); + Map user2Ids = buildUser2Ids(allUsers, results); + Map id2Users = buildid2Users(user2Ids); + Map, List> users2Results = buildUsers2Results(id2Users, results); + + return users2Results; + } + + private Map, List> buildUsers2Results(Map id2Users, + Map results) { + Map, List> users2Results = new HashMap, List>(); + + for (Entry entry : id2Users.entrySet()) { + List emails = Splitters.by(";").noEmptyItem().split(entry.getValue()); + List ids = Splitters.by(";").noEmptyItem().split(entry.getKey()); + List userResults = new ArrayList(); + + for (String id : ids) { + userResults.add(results.get(id)); + } + users2Results.put(emails, userResults); + } + return users2Results; + } + + private void notify(Date yesterday, List results, List emails) { + String title = renderTitle(); + String content = m_render.renderReport(yesterday, results); + AlertMessageEntity message = new AlertMessageEntity(null, title, "AppDataComparison", content, emails); + + try { + boolean result = m_sendManager.sendAlert(AlertChannel.MAIL, message); + + insertMailLog(-1, content, title, result, emails); + } catch (DalException e) { + Cat.logError(e); + } + } + + private void insertMailLog(int reportId, String content, String title, boolean result, List emails) + throws DalException { + MailRecord entity = m_mailRecordDao.createLocal(); + + entity.setTitle(title); + entity.setContent(content); + entity.setRuleId(reportId); + entity.setType(1); + entity.setReceivers(emails.toString()); + if (result) { + entity.setStatus(0); + } else { + entity.setStatus(1); + } + m_mailRecordDao.insert(entity); + } + + private String renderTitle() { + return "CAT端到端报告"; + } + + private Map buildAppDataComparisonResults(Date date, AppComparisonConfig config) { + Map results = new LinkedHashMap(); + + for (Entry entry : config.getAppComparisons().entrySet()) { + try { + // AppDataComparisonResult result = queryDelay4AppComparison(date, appComparison); + AppDataComparisonResult result = queryDelay4AppComparison(m_sdf.parse("2014-07-18"), entry.getValue()); + results.put(entry.getKey(), result); + } catch (ParseException e) { + e.printStackTrace(); + } + } + return results; + } + + private AppDataComparisonResult queryDelay4AppComparison(Date yesterday, AppComparison appComparison) { + String id = appComparison.getId(); + AppDataComparisonResult result = new AppDataComparisonResult(); + result.setId(id); + + for (Item item : appComparison.getItems()) { + String itemId = item.getId(); + String command = item.getCommand(); + double delay = queryOneDayDelay4Command(yesterday, command); + + if (delay > -1) { + result.addItem(itemId, command, delay); + } + } + return result; + } + + private double queryOneDayDelay4Command(Date yesterday, String url) { + String yesterdayStr = m_sdf.format(yesterday); + Integer command = m_appConfigManager.getCommands().get(url); + + if (command != null) { + QueryEntity entity = new QueryEntity(yesterdayStr + ";" + command + ";;;;;;;"); + + return m_appDataService.queryOneDayDelayAvg(entity); + } else { + Cat.logError(new RuntimeException("AppComparison config has unrecognized command: " + url)); + return -1; + } + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/system/notify/AppDataComparisonResult.java b/cat-home/src/main/java/com/dianping/cat/system/notify/AppDataComparisonResult.java new file mode 100644 index 000000000..25059cb3a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/system/notify/AppDataComparisonResult.java @@ -0,0 +1,58 @@ +package com.dianping.cat.system.notify; + +import java.util.ArrayList; +import java.util.List; + +public class AppDataComparisonResult { + + private String m_id; + + private List m_items = new ArrayList(); + + public void addItem(String id, String command, double delay) { + m_items.add(new AppDataComparisonItem(id, command, delay)); + } + + public List getItems() { + return m_items; + } + + public int getSize() { + return m_items.size(); + } + + public void setId(String id) { + m_id = id; + } + + public String getId() { + return m_id; + } + + public class AppDataComparisonItem { + + private String m_id; + + private String m_command; + + private double m_delay; + + public AppDataComparisonItem(String id, String command, double delay) { + m_id = id; + m_command = command; + m_delay = delay; + } + + public String getId() { + return m_id; + } + + public String getCommand() { + return m_command; + } + + public double getDelay() { + return m_delay; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/system/notify/ScheduledMailTask.java b/cat-home/src/main/java/com/dianping/cat/system/notify/ScheduledMailTask.java index d1daad2d1..9e6a78e39 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/notify/ScheduledMailTask.java +++ b/cat-home/src/main/java/com/dianping/cat/system/notify/ScheduledMailTask.java @@ -49,6 +49,9 @@ public class ScheduledMailTask implements Task, LogEnabled { @Inject private ScheduledManager m_scheduledManager; + @Inject + private AppDataComparisonNotifier m_appDataInformer; + private SimpleDateFormat m_sdf = new SimpleDateFormat("yyyy-MM-dd"); private Logger m_logger; @@ -126,8 +129,10 @@ public class ScheduledMailTask implements Task, LogEnabled { } long currentDay = TimeUtil.getCurrentDay().getTime(); Calendar cal = Calendar.getInstance(); + m_appDataInformer.doNotifying(); if (lastSendMailTime < currentDay && cal.get(Calendar.HOUR_OF_DAY) >= 2) { +// m_appDataInformer.doNotifying(); List reports = m_scheduledManager.queryScheduledReports(); m_logger.info("Send daily report starting! size :" + reports.size()); @@ -162,13 +167,14 @@ public class ScheduledMailTask implements Task, LogEnabled { Cat.logError(e); } try { - Thread.sleep(TimeUtil.ONE_HOUR); +// Thread.sleep(TimeUtil.ONE_HOUR); + Thread.sleep(10000); } catch (Exception e) { active = false; } } } - + @Override public void shutdown() { } diff --git a/cat-home/src/main/java/com/dianping/cat/system/notify/render/AppDataComparisonRender.java b/cat-home/src/main/java/com/dianping/cat/system/notify/render/AppDataComparisonRender.java new file mode 100644 index 000000000..02a8fc323 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/system/notify/render/AppDataComparisonRender.java @@ -0,0 +1,50 @@ +package com.dianping.cat.system.notify.render; + +import java.io.StringWriter; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; +import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; + +import com.dianping.cat.Cat; +import com.dianping.cat.system.notify.AppDataComparisonResult; + +import freemarker.template.Configuration; +import freemarker.template.Template; + +public class AppDataComparisonRender implements Initializable { + + private Configuration m_configuration; + + @Override + public void initialize() throws InitializationException { + m_configuration = new Configuration(); + m_configuration.setDefaultEncoding("UTF-8"); + try { + m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); + } catch (Exception e) { + Cat.logError(e); + } + } + + public String renderReport(Date yesterday, List results) { + Map root = new HashMap(); + root.put("results", results); + root.put("yesterday", yesterday.toString()); + root.put("date", new Date().toString()); + StringWriter sw = new StringWriter(5000); + + try { + Template t = m_configuration.getTemplate("appDataComparison.ftl"); + + t.process(root, sw); + } catch (Exception e) { + Cat.logError(e); + } + return sw.toString(); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/Action.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/Action.java index ceeda8828..fbc65e6c3 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/Action.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/Action.java @@ -99,6 +99,8 @@ public enum Action implements org.unidal.web.mvc.Action { APP_CONFIG_UPDATE("appConfigUpdate"), + APP_COMPARISON_CONFIG_UPDATE("appComparisonConfigUpdate"), + THIRD_PARTY_CONFIG_UPDATE("thirdPartyConfigUpdate"), ROUTER_CONFIG_UPDATE("routerConfigUpdate"); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java index 72ac69af4..91c55e9f6 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java @@ -26,6 +26,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig; import com.dianping.cat.config.aggregation.AggregationConfigManager; +import com.dianping.cat.config.app.AppComparisonConfigManager; import com.dianping.cat.config.app.AppConfigManager; import com.dianping.cat.config.url.UrlPatternConfigManager; import com.dianping.cat.configuration.aggreation.model.entity.AggregationRule; @@ -106,6 +107,9 @@ public class Handler implements PageHandler { @Inject private AppConfigManager m_appConfigManager; + @Inject + private AppComparisonConfigManager m_appComparisonConfigManager; + @Inject private DomainNavManager m_manager; @@ -123,7 +127,7 @@ public class Handler implements PageHandler { @Inject private RouterConfigManager m_routerConfigManager; - + private void deleteAggregationRule(Payload payload) { m_aggreationConfigManager.deleteAggregationRule(payload.getPattern()); } @@ -486,6 +490,13 @@ public class Handler implements PageHandler { } model.setContent(m_appConfigManager.getConfig().toString()); break; + case APP_COMPARISON_CONFIG_UPDATE: + String appComparisonConfig = payload.getContent(); + if (!StringUtils.isEmpty(appComparisonConfig)) { + model.setOpState(m_appComparisonConfigManager.insert(appComparisonConfig)); + } + model.setContent(m_appComparisonConfigManager.getConfig().toString()); + break; case THIRD_PARTY_CONFIG_UPDATE: String thirdPartyConfig = payload.getContent(); if (!StringUtils.isEmpty(thirdPartyConfig)) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/JspFile.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/JspFile.java index d65ab2825..114c01b0c 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/JspFile.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/JspFile.java @@ -65,6 +65,8 @@ public enum JspFile { APP_CONFIG_UPDATE("/jsp/system/appConfig/appConfig.jsp"), + APP_COMPARISON_CONFIG_UPDATE("/jsp/system/appComparisonConfig/appComparisonConfig.jsp"), + ROUTER_CONFIG_UPDATE("/jsp/system/router/routerConfig.jsp"), THIRD_PARTY_CONFIG_UPDATE("/jsp/system/thirdParty/thirdPartyConfig.jsp"); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/JspViewer.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/JspViewer.java index 416a38cc1..5bbe51867 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/JspViewer.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/JspViewer.java @@ -110,6 +110,8 @@ public class JspViewer extends BaseJspViewer return JspFile.METRIC_GROUP_CONFIG_UPDATE.getPath(); case APP_CONFIG_UPDATE: return JspFile.APP_CONFIG_UPDATE.getPath(); + case APP_COMPARISON_CONFIG_UPDATE: + return JspFile.APP_COMPARISON_CONFIG_UPDATE.getPath(); case THIRD_PARTY_CONFIG_UPDATE: return JspFile.THIRD_PARTY_CONFIG_UPDATE.getPath(); case ROUTER_CONFIG_UPDATE: 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 99de015ea..88878bc3d 100755 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -4316,6 +4316,9 @@ com.dianping.cat.config.app.AppConfigManager + + com.dianping.cat.config.app.AppComparisonConfigManager + com.dianping.cat.report.view.DomainNavManager @@ -4402,6 +4405,15 @@ + + com.dianping.cat.config.app.AppComparisonConfigManager + com.dianping.cat.config.app.AppComparisonConfigManager + + + com.dianping.cat.core.config.ConfigDao + + + com.dianping.cat.system.config.AlertPolicyManager com.dianping.cat.system.config.AlertPolicyManager @@ -4475,6 +4487,34 @@ com.dianping.cat.system.notify.ReportRender com.dianping.cat.system.notify.ReportRenderImpl + + com.dianping.cat.system.notify.render.AppDataComparisonRender + com.dianping.cat.system.notify.render.AppDataComparisonRender + + + com.dianping.cat.system.notify.AppDataComparisonNotifier + com.dianping.cat.system.notify.AppDataComparisonNotifier + + + com.dianping.cat.config.app.AppDataService + + + com.dianping.cat.config.app.AppComparisonConfigManager + + + com.dianping.cat.config.app.AppConfigManager + + + com.dianping.cat.report.task.alert.sender.sender.SenderManager + + + com.dianping.cat.home.dal.alarm.MailRecordDao + + + com.dianping.cat.system.notify.render.AppDataComparisonRender + + + com.dianping.cat.system.notify.ScheduledMailTask com.dianping.cat.system.notify.ScheduledMailTask @@ -4494,6 +4534,9 @@ com.dianping.cat.home.dal.alarm.MailRecordDao + + com.dianping.cat.system.notify.AppDataComparisonNotifier + diff --git a/cat-home/src/main/resources/config/default-app-comparison-config.xml b/cat-home/src/main/resources/config/default-app-comparison-config.xml new file mode 100644 index 000000000..7253021bd --- /dev/null +++ b/cat-home/src/main/resources/config/default-app-comparison-config.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/cat-home/src/main/resources/freemaker/appDataComparison.ftl b/cat-home/src/main/resources/freemaker/appDataComparison.ftl new file mode 100644 index 000000000..463145168 --- /dev/null +++ b/cat-home/src/main/resources/freemaker/appDataComparison.ftl @@ -0,0 +1,21 @@ +[CAT端到端数据报告] : [${yesterday}] [时间: ${date}]
+ + + + + + + + <#list results as result> + <#list result.items as item> + + <#if item_index == 0> + + + + + + + + +
分类公司命令字响应时间
${result.id}${item.id}${item.command}${item.delay}
diff --git a/cat-home/src/main/webapp/WEB-INF/tags/body.tag b/cat-home/src/main/webapp/WEB-INF/tags/body.tag index 57e5a56a5..b013738a8 100755 --- a/cat-home/src/main/webapp/WEB-INF/tags/body.tag +++ b/cat-home/src/main/webapp/WEB-INF/tags/body.tag @@ -81,6 +81,7 @@
  • URL合并规则
  • JS合并规则
  • APP监控配置
  • +
  • APP报表配置
  • 第三方监控配置
  • 业务监控规则
  • diff --git a/cat-home/src/main/webapp/jsp/system/appComparisonConfig/appComparisonConfig.jsp b/cat-home/src/main/webapp/jsp/system/appComparisonConfig/appComparisonConfig.jsp new file mode 100644 index 000000000..a05d9d462 --- /dev/null +++ b/cat-home/src/main/webapp/jsp/system/appComparisonConfig/appComparisonConfig.jsp @@ -0,0 +1,49 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%> +<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%> + + + + + + + + +
    +
    + <%@include file="../configTree.jsp"%> +
    +
    +
    +

     

    +

    手机端报表配置

    + + + + + + + +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/cat-home/src/main/webapp/jsp/system/configTree.jsp b/cat-home/src/main/webapp/jsp/system/configTree.jsp index b58752e4d..5bef377f7 100644 --- a/cat-home/src/main/webapp/jsp/system/configTree.jsp +++ b/cat-home/src/main/webapp/jsp/system/configTree.jsp @@ -12,6 +12,7 @@
  • URL合并规则
  • JS合并规则
  • APP监控配置
  • +
  • APP报表配置
  • 第三方监控配置
  • 业务监控规则
  • diff --git a/cat-home/src/test/resources/com/dianping/cat/system/config/appComparisonConfig.xml b/cat-home/src/test/resources/com/dianping/cat/system/config/appComparisonConfig.xml new file mode 100644 index 000000000..068198562 --- /dev/null +++ b/cat-home/src/test/resources/com/dianping/cat/system/config/appComparisonConfig.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file -- GitLab