提交 a257faa0 编写于 作者: L leon.li

coding alert summary module, finish generator class

上级 99317fb0
......@@ -165,6 +165,7 @@
${basedir}/src/main/resources/META-INF/dal/model/alert-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/alertconfig-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/alertsummary-manifest.xml,
</manifest>
</configuration>
</execution>
......
......@@ -34,7 +34,7 @@ public class BusinessAlert extends BaseAlert implements Task, LogEnabled {
@Override
public String getName() {
return "metric-alert";
return "business-alert";
}
@Override
......
......@@ -66,16 +66,16 @@ public class ExceptionAlert implements Task, LogEnabled {
private Alert buildAlert(String domainName, AlertException exception, String mailContent) {
Alert alert = new Alert();
alert.setDomain(domainName);
alert.setAlertTime(new Date());
alert.setCategory(getName());
alert.setType(exception.getType());
alert.setContent(mailContent);
alert.setMetric(exception.getName());
return alert;
}
return alert;
}
private TopMetric buildTopMetric(Date date) {
TopReport topReport = queryTopReport(date);
......@@ -91,7 +91,6 @@ public class ExceptionAlert implements Task, LogEnabled {
m_logger = logger;
}
@Override
public String getName() {
return "exception-alert";
}
......
package com.dianping.cat.report.task.alert.summary;
import com.dianping.cat.home.alert.summary.entity.AlertSummary;
public class AlertSummaryDecorator {
public String generateHtml(AlertSummary alertSummary) {
return null;
}
}
package com.dianping.cat.report.task.alert.summary;
import java.util.Date;
import java.util.List;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.home.alert.summary.entity.AlertSummary;
public class AlertSummaryExecutor {
@Inject
AlertSummaryGenerator m_alertSummaryGenerator;
@Inject
AlertSummaryManager m_alertSummaryManager;
@Inject
AlertSummaryDecorator m_alertSummaryDecorator;
@Inject
AlertSummarySender m_alertSummarySender;
public String execute(String domain, Date date, List<String> receivers) {
try {
AlertSummary alertSummary = m_alertSummaryGenerator.generateAlertSummary(domain, date);
m_alertSummaryManager.insert(alertSummary);
String content = m_alertSummaryDecorator.generateHtml(alertSummary);
m_alertSummarySender.send(content, receivers);
return content;
} catch (Exception e) {
Cat.logError("generate alert summary fail:" + domain + " " + date, e);
return null;
}
}
}
package com.dianping.cat.report.task.alert.summary;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.unidal.dal.jdbc.DalException;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.home.alert.summary.entity.AlertSummary;
import com.dianping.cat.home.alert.summary.entity.Category;
import com.dianping.cat.home.dal.report.Alert;
import com.dianping.cat.home.dal.report.AlertDao;
import com.dianping.cat.home.dal.report.AlertEntity;
import com.dianping.cat.home.dependency.graph.entity.TopologyGraph;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphManager;
public class AlertSummaryGenerator {
@Inject
private AlertDao m_alertDao;
@Inject
private TopologyGraphManager m_topologyManager;
// fetch alerts during this period, time unit is ms, default value is 1 hour
private final long DURATION = 60 * 60 * 1000L;
private com.dianping.cat.home.alert.summary.entity.Alert convertToAlert(Alert dbAlert) {
com.dianping.cat.home.alert.summary.entity.Alert alert = new com.dianping.cat.home.alert.summary.entity.Alert();
alert.setAlertTime(dbAlert.getAlertTime());
alert.setContext(dbAlert.getContent());
alert.setMetric(dbAlert.getMetric());
alert.setType(dbAlert.getType());
return alert;
}
private com.dianping.cat.home.alert.summary.entity.Alert convertToDependAlert(String domain, Alert dbAlert) {
com.dianping.cat.home.alert.summary.entity.Alert alert = new com.dianping.cat.home.alert.summary.entity.Alert();
alert.setAlertTime(dbAlert.getAlertTime());
alert.setContext(dbAlert.getContent());
alert.setMetric(domain + ":" + dbAlert.getMetric());
alert.setType(dbAlert.getType());
return alert;
}
public AlertSummary generateAlertSummary(String domain, Date date) {
AlertSummary alertSummary = new AlertSummary();
alertSummary.setDomain(domain);
alertSummary.setAlertDate(date);
alertSummary.addCategory(generateCategoryByTimeCategory(date, "network"));
alertSummary.addCategory(generateCategoryByTimeCateDomain(date, "business", domain));
alertSummary.addCategory(generateCategoryByTimeCateDomain(date, "exception", domain));
alertSummary.addCategory(generateCategoryByTimeCateDomain(date, "system", domain));
List<String> dependencyDomains = queryDependencyDomains(date, domain);
alertSummary.addCategory(generateDependCategoryByTimeCateDomain(date, "business", dependencyDomains));
alertSummary.addCategory(generateDependCategoryByTimeCateDomain(date, "exception", dependencyDomains));
return alertSummary;
}
private Category generateCategoryByTimeCateDomain(Date date, String cate, String domain) {
Category category = new Category(cate);
String dbCategoryName = cate + "-alert";
Date startTime = new Date(date.getTime() - DURATION / 2);
Date endTime = new Date(date.getTime() + DURATION / 2);
try {
List<Alert> dbAlerts = m_alertDao.queryAlertsByTimeCategoryDomain(startTime, endTime, dbCategoryName, domain,
AlertEntity.READSET_FULL);
setDBAlertsToCategory(category, dbAlerts);
} catch (DalException e) {
Cat.logError("find alerts error for category:" + cate + " domain:" + domain + " date:" + date, e);
}
return category;
}
private Category generateCategoryByTimeCategory(Date date, String cate) {
Category category = new Category(cate);
String dbCategoryName = cate + "-alert";
Date startTime = new Date(date.getTime() - DURATION / 2);
Date endTime = new Date(date.getTime() + DURATION / 2);
try {
List<Alert> dbAlerts = m_alertDao.queryAlertsByTimeCategory(startTime, endTime, dbCategoryName,
AlertEntity.READSET_FULL);
setDBAlertsToCategory(category, dbAlerts);
} catch (DalException e) {
Cat.logError("find alerts error for category:" + cate + " date:" + date, e);
}
return category;
}
private Category generateDependCategoryByTimeCateDomain(Date date, String cate, List<String> dependencyDomains) {
String categoryName = "dependency-" + cate;
String dbCategoryName = cate + "-alert";
Category category = new Category(categoryName);
Date startTime = new Date(date.getTime() - DURATION / 2);
Date endTime = new Date(date.getTime() + DURATION / 2);
for (String domain : dependencyDomains) {
try {
List<Alert> dbAlerts = m_alertDao.queryAlertsByTimeCategoryDomain(startTime, endTime, dbCategoryName,
domain, AlertEntity.READSET_FULL);
setDBAlertsToDependCategory(category, domain, dbAlerts);
} catch (DalException e) {
Cat.logError("find dependency alerts error for category:" + cate + " domain:" + domain + " date:" + date, e);
}
}
return category;
}
private List<String> queryDependencyDomains(Date date, String domain) {
List<String> domains = new ArrayList<String>();
TopologyGraph topology = m_topologyManager.buildTopologyGraph(domain, date.getTime());
for (String dependencyDomain : topology.getNodes().keySet()) {
domains.add(dependencyDomain);
}
return domains;
}
private void setDBAlertsToCategory(Category category, List<Alert> dbAlerts) {
for (Alert dbAlert : dbAlerts) {
category.addAlert(convertToAlert(dbAlert));
}
}
private void setDBAlertsToDependCategory(Category category, String domain, List<Alert> dbAlerts) {
for (Alert dbAlert : dbAlerts) {
category.addAlert(convertToDependAlert(domain, dbAlert));
}
}
}
package com.dianping.cat.report.task.alert.summary;
import com.dianping.cat.home.alert.summary.entity.AlertSummary;
public class AlertSummaryManager {
public void insert(AlertSummary alertSummary) {
}
}
package com.dianping.cat.report.task.alert.summary;
import java.util.List;
public class AlertSummarySender {
public void send(String content, List<String> receivers) {
}
}
......@@ -2,6 +2,47 @@
<entities do-package="com.dianping.cat.home.dal.report" gen="true">
<entity name="alert" table="alert" alias="al">
<member name="creation-date" insert-expr="NOW()" />
<var name="start-time" value-type="Date" />
<var name="end-time" value-type="Date" />
<param name="domain" />
<query-defs>
<query name="query-alerts-by-time-category-domain" type="SELECT"
multiple="true">
<param name="start-time" />
<param name="end-time" />
<param name="category" />
<param name="domain" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='alert_time'/> >= ${start-time}
AND <FIELD name='alert_time'/> <= ${end-time}
<IF type='NOT_NULL' field='category'>
AND <FIELD name='category'/> = ${category}
</IF>
<IF type='NOT_NULL' field='domain'>
AND <FIELD name='domain'/> = ${domain}
</IF>
ORDER BY <FIELD name='alert_time'/> asc
]]></statement>
</query>
<query name="query-alerts-by-time-category" type="SELECT"
multiple="true">
<param name="start-time" />
<param name="end-time" />
<param name="category" />
<statement><![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='alert_time'/> >= ${start-time}
AND <FIELD name='alert_time'/> <= ${end-time}
<IF type='NOT_NULL' field='category'>
AND <FIELD name='category'/> = ${category}
</IF>
ORDER BY <FIELD name='alert_time'/> asc
]]></statement>
</query>
</query-defs>
</entity>
<entity name="alteration" table="alteration" alias="a">
<member name="creation-date" insert-expr="NOW()" />
......
<?xml version="1.0" encoding="UTF-8"?>
<model>
<entity name="alert-summary" root="true">
<attribute name="alert-date" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="domain" value-type="String" />
<entity-ref name="category" type="map" names="categories" method-find-or-create='true' />
</entity>
<entity name="category">
<attribute name="name" value-type="String" key="true" />
<entity-ref name="alert" type="list" names="alerts" />
</entity>
<entity name="alert">
<attribute name="alertTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="type" value-type="String" />
<attribute name="metric" value-type="String" />
<attribute name="context" value-type="String" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<file path="alertsummary-codegen.xml" />
<file path="alertsummary-model.xml" />
</manifest>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.home.alert.summary"
enable-sax-parser="true" enable-xml-parser="true" enable-xml-builder="true">
</model>
\ No newline at end of file
......@@ -51,4 +51,7 @@
<model package="com.dianping.cat.home.alertconfig" name="alertconfig">
<sample-model>/Users/leon/Documents/GitRepo/cat/cat-home/src/test/resources/config/alert-config.xml</sample-model>
</model>
<model package="com.dianping.cat.home.alertsummary" name="alertsummary">
<sample-model>/Users/leon/Desktop/AlertSummary.xml</sample-model>
</model>
</wizard>
<?xml version="1.0" encoding="utf-8"?>
<monitor-rules>
<rule id="CPUIdle">
<metric-item type="regex" monitorAvg="true" text=".*(?=system_cpu)"/>
<metric-item monitorAvg="true" metricItemText=".*(?=system_cpu)"/>
<config starttime="00:00" endtime="24:00">
<condition minute="1" alertType="warning">
<sub-condition type="MaxVal" text="0.8"/>
......@@ -12,7 +12,7 @@
</config>
</rule>
<rule id="DataUsage">
<metric-item type="regex" monitorAvg="true" text=".*(?=system_/data-usage)"/>
<metric-item monitorAvg="true" metricItemText=".*(?=system_/data-usage)"/>
<config starttime="00:00" endtime="24:00">
<condition minute="1" alertType="error">
<sub-condition type="MaxVal" text="0.9"/>
......@@ -20,7 +20,7 @@
</config>
</rule>
<rule id="UsrUsage">
<metric-item type="regex" monitorAvg="true" text=".*(?=system_/usr-usage)"/>
<metric-item monitorAvg="true" metricItemText=".*(?=system_/usr-usage)"/>
<config starttime="00:00" endtime="24:00">
<condition minute="1" alertType="error">
<sub-condition type="MaxVal" text="0.9"/>
......@@ -28,7 +28,7 @@
</config>
</rule>
<rule id="VarUsage">
<metric-item type="regex" monitorAvg="true" text=".*(?=system_/var-usage)"/>
<metric-item monitorAvg="true" metricItemText=".*(?=system_/var-usage)"/>
<config starttime="00:00" endtime="24:00">
<condition minute="1" alertType="error">
<sub-condition type="MaxVal" text="0.9"/>
......@@ -36,7 +36,7 @@
</config>
</rule>
<rule id="UptimeDown">
<metric-item type="regex" monitorAvg="true" text=".*(?=system_uptime)"/>
<metric-item monitorAvg="true" metricItemText=".*(?=system_uptime)"/>
<config starttime="00:00" endtime="24:00">
<condition minute="2" alertType="error">
<sub-condition type="FluDescPer" text="0"/>
......@@ -44,7 +44,7 @@
</config>
</rule>
<rule id="MD5Change">
<metric-item type="regex" monitorAvg="true" text=".*(?=system_md5Change)"/>
<metric-item monitorAvg="true" metricItemText=".*(?=system_md5Change)"/>
<config starttime="00:00" endtime="24:00">
<condition minute="1" alertType="error">
<sub-condition type="MinVal" text="0.9"/>
......@@ -52,7 +52,7 @@
</config>
</rule>
<rule id="HostNameChange">
<metric-item type="regex" monitorAvg="true" text=".*(?=system_hostNameChange)"/>
<metric-item monitorAvg="true" metricItemText=".*(?=system_hostNameChange)"/>
<config starttime="00:00" endtime="24:00">
<condition minute="1" alertType="error">
<sub-condition type="MinVal" text="0.9"/>
......@@ -60,7 +60,7 @@
</config>
</rule>
<rule id="HostIpChange">
<metric-item type="regex" monitorAvg="true" text=".*(?=system_hostIpChange)"/>
<metric-item monitorAvg="true" metricItemText=".*(?=system_hostIpChange)"/>
<config starttime="00:00" endtime="24:00">
<condition minute="1" alertType="error">
<sub-condition type="MinVal" text="0.9"/>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册