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

add postman and alert manager to ExceptionAlert

上级 e93d41ee
......@@ -64,9 +64,12 @@ import com.dianping.cat.report.task.alert.business.BusinessAlertConfig;
import com.dianping.cat.report.task.alert.exception.AlertExceptionBuilder;
import com.dianping.cat.report.task.alert.exception.ExceptionAlert;
import com.dianping.cat.report.task.alert.exception.ExceptionAlertConfig;
import com.dianping.cat.report.task.alert.manager.AlertManager;
import com.dianping.cat.report.task.alert.network.NetworkAlert;
import com.dianping.cat.report.task.alert.network.NetworkAlertConfig;
import com.dianping.cat.report.task.alert.sender.ExceptionPostman;
import com.dianping.cat.report.task.alert.sender.MailSender;
import com.dianping.cat.report.task.alert.sender.Postman;
import com.dianping.cat.report.task.alert.sender.SmsSender;
import com.dianping.cat.report.task.alert.sender.WeixinSender;
import com.dianping.cat.report.task.alert.summary.AlertSummaryDecorator;
......@@ -80,6 +83,7 @@ import com.dianping.cat.report.task.product.ProjectUpdateTask;
import com.dianping.cat.report.view.DomainNavManager;
import com.dianping.cat.service.IpService;
import com.dianping.cat.system.config.AlertConfigManager;
import com.dianping.cat.system.config.AlertTypeManager;
import com.dianping.cat.system.config.BugConfigManager;
import com.dianping.cat.system.config.BusinessRuleConfigManager;
import com.dianping.cat.system.config.ConfigReloadTask;
......@@ -278,33 +282,37 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(WeixinSender.class).req(MailSMS.class));
all.add(C(AlertManager.class).req(AlertDao.class));
all.add(C(Postman.class).req(ProjectDao.class, MailSMS.class, MailSender.class, WeixinSender.class,
SmsSender.class, AlertTypeManager.class));
all.add(C(BusinessAlert.class)
.req(MetricConfigManager.class, ProductLineConfigManager.class, BaselineService.class, MailSMS.class,
BusinessAlertConfig.class, AlertInfo.class, AlertDao.class)
//
.req(RemoteMetricReportService.class, BusinessRuleConfigManager.class, DataChecker.class, ProjectDao.class)
.req(MailSender.class, SmsSender.class, WeixinSender.class));
.req(RemoteMetricReportService.class, BusinessRuleConfigManager.class, DataChecker.class)
.req(Postman.class, AlertManager.class));
all.add(C(NetworkAlert.class)
.req(MetricConfigManager.class, ProductLineConfigManager.class, BaselineService.class, MailSMS.class,
NetworkAlertConfig.class, AlertInfo.class, AlertDao.class)
//
.req(RemoteMetricReportService.class, NetworkRuleConfigManager.class, DataChecker.class, ProjectDao.class)
.req(MailSender.class, SmsSender.class, WeixinSender.class));
.req(RemoteMetricReportService.class, NetworkRuleConfigManager.class, DataChecker.class)
.req(Postman.class, AlertManager.class));
all.add(C(SystemAlert.class)
.req(MetricConfigManager.class, ProductLineConfigManager.class, BaselineService.class, MailSMS.class,
SystemAlertConfig.class, AlertInfo.class, AlertDao.class)
//
.req(RemoteMetricReportService.class, SystemRuleConfigManager.class, DataChecker.class, ProjectDao.class)
.req(MailSender.class, SmsSender.class, WeixinSender.class));
.req(RemoteMetricReportService.class, SystemRuleConfigManager.class, DataChecker.class)
.req(Postman.class, AlertManager.class));
all.add(C(AlertExceptionBuilder.class).req(ExceptionConfigManager.class));
all.add(C(ExceptionAlert.class)
.req(ProjectDao.class, ExceptionAlertConfig.class, MailSMS.class, ExceptionConfigManager.class,
AlertExceptionBuilder.class, AlertDao.class).req(ModelService.class, TopAnalyzer.ID)
.req(MailSender.class, SmsSender.class, WeixinSender.class));
.req(ExceptionAlertConfig.class, ExceptionConfigManager.class, AlertExceptionBuilder.class)
.req(ModelService.class, TopAnalyzer.ID).req(ExceptionPostman.class, AlertManager.class));
all.add(C(AlertSummaryExecutor.class).req(AlertSummaryGenerator.class, AlertSummaryManager.class, MailSMS.class)
.req(AlertSummaryDecorator.class, AlertSummaryFTLDecorator.ID));
......
......@@ -25,6 +25,7 @@ import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.rule.entity.Condition;
import com.dianping.cat.home.rule.entity.Config;
import com.dianping.cat.report.baseline.BaselineService;
import com.dianping.cat.report.task.alert.manager.AlertManager;
import com.dianping.cat.report.task.alert.sender.Postman;
import com.dianping.cat.service.ModelPeriod;
import com.dianping.cat.service.ModelRequest;
......
......@@ -13,7 +13,6 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.consumer.company.model.entity.ProductLine;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.report.task.alert.AlertResultEntity;
import com.dianping.cat.report.task.alert.BaseAlert;
......@@ -68,17 +67,13 @@ public class BusinessAlert extends BaseAlert implements Task, LogEnabled {
}
for (AlertResultEntity alertResult : alertResults) {
String mailTitle = m_alertConfig.buildMailTitle(productLine.getTitle(), config.getTitle());
String contactInfo = buildContactInfo(domain);
alertResult.setContent(alertResult.getContent() + contactInfo);
String content = alertResult.getContent();
m_alertInfo.addAlertInfo(product, metricKey, new Date().getTime());
storeAlert(domain, metric, mailTitle, alertResult);
String mailTitle = m_alertConfig.buildMailTitle(productLine.getTitle(), metric);
m_alertManager.storeAlert(getName(), product, metric, mailTitle, alertResult);
String configId = getAlertConfig().getId();
sendAllAlert(productLine, domain, mailTitle, content, alertResult.getAlertType(), configId);
Cat.logEvent(configId, product, Event.SUCCESS, mailTitle + " " + content);
m_postman.sendAlert(getAlertConfig(), alertResult, productLine, domain, mailTitle, configId);
}
}
}
......
......@@ -133,6 +133,24 @@ public class AlertExceptionBuilder {
return mailContent;
}
public String buildDBContent(String exceptions, String domain) {
String content = buildContent(exceptions, domain);
String url = "http://cat.dianpingoa.com/cat/r/p?domain=" + domain;
String mailContent = content + "<br/>" + " <a href='" + url + "'>点击此处查看详情</a>";
return mailContent;
}
public String buildContent(String exceptions, String domain) {
StringBuilder sb = new StringBuilder();
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
sb.append("[CAT异常告警] [项目: ").append(domain).append("] : ");
sb.append(exceptions).append("[时间: ").append(time).append("]");
return sb.toString();
}
public String buildContent(String exceptions, String domain, String contactInfo) {
StringBuilder sb = new StringBuilder();
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
......
......@@ -10,7 +10,6 @@ import java.util.Map.Entry;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.dal.jdbc.DalException;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
......@@ -18,41 +17,24 @@ import com.dianping.cat.Cat;
import com.dianping.cat.Constants;
import com.dianping.cat.consumer.top.TopAnalyzer;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.core.dal.Project;
import com.dianping.cat.core.dal.ProjectDao;
import com.dianping.cat.core.dal.ProjectEntity;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.dal.report.Alert;
import com.dianping.cat.home.dal.report.AlertDao;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.page.top.TopMetric;
import com.dianping.cat.report.page.top.TopMetric.Item;
import com.dianping.cat.report.task.alert.AlertResultEntity;
import com.dianping.cat.report.task.alert.exception.AlertExceptionBuilder.AlertException;
import com.dianping.cat.report.task.alert.sender.MailSender;
import com.dianping.cat.report.task.alert.sender.SmsSender;
import com.dianping.cat.report.task.alert.sender.WeixinSender;
import com.dianping.cat.report.task.alert.manager.AlertManager;
import com.dianping.cat.report.task.alert.sender.ExceptionPostman;
import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.service.ModelResponse;
import com.dianping.cat.system.config.ExceptionConfigManager;
import com.dianping.cat.system.tool.MailSMS;
import com.site.lookup.util.StringUtils;
public class ExceptionAlert implements Task, LogEnabled {
@Inject
protected AlertDao m_alertDao;
@Inject
private ProjectDao m_projectDao;
@Inject
private ExceptionAlertConfig m_alertConfig;
@Inject
private MailSMS m_mailSms;
@Inject
private ExceptionConfigManager m_exceptionConfigManager;
......@@ -63,13 +45,10 @@ public class ExceptionAlert implements Task, LogEnabled {
private ModelService<TopReport> m_topService;
@Inject
protected MailSender m_mailSender;
protected ExceptionPostman m_postman;
@Inject
protected SmsSender m_smsSender;
@Inject
protected WeixinSender m_weixinSender;
protected AlertManager m_alertManager;
private static final long DURATION = TimeUtil.ONE_MINUTE;
......@@ -77,19 +56,6 @@ public class ExceptionAlert implements Task, LogEnabled {
private Logger m_logger;
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;
}
private TopMetric buildTopMetric(Date date) {
TopReport topReport = queryTopReport(date);
TopMetric topMetric = new TopMetric(ALERT_PERIOD, Integer.MAX_VALUE, m_exceptionConfigManager);
......@@ -99,28 +65,6 @@ public class ExceptionAlert implements Task, LogEnabled {
return topMetric;
}
private String buildContactInfo(String domainName) {
try {
Project project = m_projectDao.findByDomain(domainName, ProjectEntity.READSET_FULL);
String owners = project.getOwner();
String phones = project.getPhone();
StringBuilder builder = new StringBuilder();
if (!StringUtils.isEmpty(owners)) {
builder.append("[业务负责人: ").append(owners).append(" ]");
}
if (!StringUtils.isEmpty(phones)) {
builder.append("[负责人手机号码: ").append(phones).append(" ]");
}
return builder.toString();
} catch (Exception ex) {
Cat.logError("build contact info error for doamin: " + domainName, ex);
}
return null;
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
......@@ -130,16 +74,6 @@ public class ExceptionAlert implements Task, LogEnabled {
return "exception-alert";
}
private Project queryProjectByDomain(String projectName) {
Project project = null;
try {
project = m_projectDao.findByDomain(projectName, ProjectEntity.READSET_FULL);
} catch (Exception e) {
Cat.logError(e);
}
return project;
}
private TopReport queryTopReport(Date start) {
String domain = Constants.CAT;
String date = String.valueOf(start.getTime());
......@@ -185,7 +119,18 @@ public class ExceptionAlert implements Task, LogEnabled {
for (Entry<String, List<AlertException>> entry : alertExceptions.entrySet()) {
try {
sendAndStoreAlert(entry.getKey(), entry.getValue());
String domain = entry.getKey();
List<AlertException> exceptions = entry.getValue();
m_postman.sendAlert(m_alertConfig, m_alertBuilder, domain, exceptions);
String mailTitle = m_alertConfig.buildMailTitle(domain, null);
String content = m_alertBuilder.buildDBContent(exceptions.toString(), domain);
for (AlertException exception : exceptions) {
AlertResultEntity alertResult = new AlertResultEntity(true, content, exception.getType());
m_alertManager.storeAlert(getName(), domain, exception.getName(), mailTitle, alertResult);
}
} catch (Exception e) {
m_logger.error(e.getMessage());
}
......@@ -208,61 +153,6 @@ public class ExceptionAlert implements Task, LogEnabled {
}
}
private void sendAndStoreAlert(String domain, List<AlertException> exceptions) {
Project project = queryProjectByDomain(domain);
List<String> emails = m_alertConfig.buildMailReceivers(project);
List<String> phones = m_alertConfig.buildSMSReceivers(project);
String weixins = m_alertConfig.buildWeiXinReceivers(project);
String mailTitle = m_alertConfig.buildMailTitle(domain, null);
String contactInfo = buildContactInfo(domain);
String mailContent = m_alertBuilder.buildMailContent(exceptions.toString(), domain, contactInfo);
storeAlerts(domain, exceptions, mailTitle + "<br/>" + mailContent);
m_mailSender.sendAlert(emails, domain, mailTitle, mailContent, "warning");
Cat.logEvent("ExceptionAlert", domain, Event.SUCCESS, "[邮件告警] " + mailTitle + " " + mailContent);
List<AlertException> errorExceptions = m_alertBuilder.buildErrorException(exceptions);
if (!errorExceptions.isEmpty()) {
String weixinContent = m_alertBuilder.buildContent(errorExceptions.toString(), domain, contactInfo);
m_weixinSender.sendAlert(emails, domain, mailTitle, weixinContent, "error");
Cat.logEvent("ExceptionAlert", domain, Event.SUCCESS, "[微信告警] " + mailTitle + " " + weixinContent + " "
+ domain + " " + weixins);
}
List<AlertException> errorAndTriggeredExceptions = m_alertBuilder.buildErrorAndTriggeredException(exceptions);
if (!errorAndTriggeredExceptions.isEmpty()) {
String smsContent = m_alertBuilder.buildContent(errorAndTriggeredExceptions.toString(), domain, contactInfo);
m_smsSender.sendAlert(phones, domain, smsContent, smsContent, "error");
Cat.logEvent("ExceptionAlert", domain, Event.SUCCESS, "[短信告警] " + smsContent);
m_mailSms.sendWeiXin(mailTitle, mailContent, domain, weixins);
m_logger.info(mailTitle + " " + mailContent + " " + domain + " " + weixins);
Cat.logEvent("WeiXinAlert", domain, Event.SUCCESS, "[微信告警] " + mailTitle + " " + mailContent + " " + domain
+ " " + weixins);
}
}
private void storeAlerts(String domain, List<AlertException> exceptions, String mailContent) {
for (AlertException exception : exceptions) {
storeAlert(domain, exception, mailContent);
}
}
private void storeAlert(String domainName, AlertException exception, String mailContent) {
Alert alert = buildAlert(domainName, exception, mailContent);
try {
int count = m_alertDao.insert(alert);
if (count != 1) {
Cat.logError("insert alert error: " + alert.toString(), new RuntimeException());
}
} catch (DalException e) {
Cat.logError(e);
}
}
@Override
public void shutdown() {
}
......
package com.dianping.cat.report.task.alert.exception;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.dianping.cat.core.dal.Project;
......@@ -25,7 +26,7 @@ public class ExceptionAlertConfig extends BaseAlertConfig {
}
}
public String buildWeiXinReceivers(Project project) {
public List<String> buildWeiXinReceivers(Project project) {
StringBuilder builder = new StringBuilder();
Receiver receiver = m_manager.queryReceiverById(getId());
......@@ -38,10 +39,10 @@ public class ExceptionAlertConfig extends BaseAlertConfig {
String result = builder.toString();
if (result.endsWith(",")) {
return result.substring(0, result.length() - 1);
} else {
return result;
result = result.substring(0, result.length() - 1);
}
return Arrays.asList(result.split(","));
}
}
......
package com.dianping.cat.report.task.alert;
package com.dianping.cat.report.task.alert.manager;
import org.unidal.dal.jdbc.DalException;
import org.unidal.lookup.annotation.Inject;
......@@ -6,11 +6,12 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.home.dal.report.Alert;
import com.dianping.cat.home.dal.report.AlertDao;
import com.dianping.cat.report.task.alert.AlertResultEntity;
public class AlertManager {
@Inject
protected AlertDao m_alertDao;
private AlertDao m_alertDao;
private Alert buildAlert(String categoryName, String domainName, String metricName, String mailTitle,
AlertResultEntity alertResult) {
......@@ -26,7 +27,7 @@ public class AlertManager {
return alert;
}
protected void storeAlert(String categoryName, String domainName, String metricName, String mailTitle,
public void storeAlert(String categoryName, String domainName, String metricName, String mailTitle,
AlertResultEntity alertResult) {
Alert alert = buildAlert(categoryName, domainName, metricName, mailTitle, alertResult);
......@@ -40,4 +41,5 @@ public class AlertManager {
Cat.logError(e);
}
}
}
package com.dianping.cat.report.task.alert.sender;
import java.util.List;
import com.dianping.cat.Cat;
import com.dianping.cat.core.dal.Project;
import com.dianping.cat.core.dal.ProjectEntity;
import com.dianping.cat.home.alert.type.entity.Type;
import com.dianping.cat.report.task.alert.exception.AlertExceptionBuilder;
import com.dianping.cat.report.task.alert.exception.AlertExceptionBuilder.AlertException;
import com.dianping.cat.report.task.alert.exception.ExceptionAlertConfig;
public class ExceptionPostman extends Postman {
private Project queryProjectByDomain(String projectName) {
Project project = null;
try {
project = m_projectDao.findByDomain(projectName, ProjectEntity.READSET_FULL);
} catch (Exception e) {
Cat.logError(e);
}
return project;
}
public boolean sendAlert(ExceptionAlertConfig alertConfig, AlertExceptionBuilder alertBuilder, String domain,
List<AlertException> exceptions) {
boolean sendResult = true;
Project project = queryProjectByDomain(domain);
String mailTitle = alertConfig.buildMailTitle(domain, null);
String contactInfo = buildContactInfo(domain);
Type type = new Type();
for (AlertException exception : exceptions) {
Type tmpType = m_alertTypeManager.getType(alertConfig.getId(), domain, exception.getType());
if (tmpType.isSendMail()) {
type.setSendMail(true);
}
if (tmpType.isSendWeixin()) {
type.setSendWeixin(true);
}
if (tmpType.isSendSms()) {
type.setSendSms(true);
}
}
if (type.isSendMail()) {
List<String> emails = alertConfig.buildMailReceivers(project);
String mailContent = alertBuilder.buildMailContent(exceptions.toString(), domain, contactInfo);
if (!m_mailSender.sendAlert(emails, domain, mailTitle, mailContent)) {
sendResult = false;
}
}
if (type.isSendWeixin()) {
List<String> weixins = alertConfig.buildWeiXinReceivers(project);
List<AlertException> errorExceptions = alertBuilder.buildErrorException(exceptions);
String weixinContent = alertBuilder.buildContent(errorExceptions.toString(), domain, contactInfo);
if (!m_weixinSender.sendAlert(weixins, domain, mailTitle, weixinContent)) {
sendResult = false;
}
}
if (type.isSendSms()) {
List<String> phones = alertConfig.buildSMSReceivers(project);
List<AlertException> errorAndTriggeredExceptions = alertBuilder.buildErrorAndTriggeredException(exceptions);
String smsContent = alertBuilder.buildContent(errorAndTriggeredExceptions.toString(), domain, contactInfo);
if (!m_smsSender.sendAlert(phones, domain, mailTitle, smsContent)) {
sendResult = false;
}
}
return sendResult;
}
}
......@@ -19,7 +19,7 @@ import com.site.lookup.util.StringUtils;
public class Postman {
@Inject
private ProjectDao m_projectDao;
protected ProjectDao m_projectDao;
@Inject
protected MailSender m_mailSender;
......
......@@ -1864,6 +1864,39 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.alert.manager.AlertManager</role>
<implementation>com.dianping.cat.report.task.alert.manager.AlertManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.home.dal.report.AlertDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.alert.sender.Postman</role>
<implementation>com.dianping.cat.report.task.alert.sender.Postman</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.tool.MailSMS</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.MailSender</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.WeixinSender</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.SmsSender</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.config.AlertTypeManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.alert.business.BusinessAlert</role>
<implementation>com.dianping.cat.report.task.alert.business.BusinessAlert</implementation>
......@@ -1899,16 +1932,10 @@
<role>com.dianping.cat.report.task.alert.DataChecker</role>
</requirement>
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.MailSender</role>
<role>com.dianping.cat.report.task.alert.sender.Postman</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.SmsSender</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.WeixinSender</role>
<role>com.dianping.cat.report.task.alert.manager.AlertManager</role>
</requirement>
</requirements>
</component>
......@@ -1947,16 +1974,10 @@
<role>com.dianping.cat.report.task.alert.DataChecker</role>
</requirement>
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</role>
<role>com.dianping.cat.report.task.alert.sender.Postman</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.MailSender</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.SmsSender</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.WeixinSender</role>
<role>com.dianping.cat.report.task.alert.manager.AlertManager</role>
</requirement>
</requirements>
</component>
......@@ -1995,16 +2016,10 @@
<role>com.dianping.cat.report.task.alert.DataChecker</role>
</requirement>
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.MailSender</role>
<role>com.dianping.cat.report.task.alert.sender.Postman</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.SmsSender</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.WeixinSender</role>
<role>com.dianping.cat.report.task.alert.manager.AlertManager</role>
</requirement>
</requirements>
</component>
......@@ -2021,36 +2036,24 @@
<role>com.dianping.cat.report.task.alert.exception.ExceptionAlert</role>
<implementation>com.dianping.cat.report.task.alert.exception.ExceptionAlert</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.exception.ExceptionAlertConfig</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.tool.MailSMS</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.config.ExceptionConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.exception.AlertExceptionBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.home.dal.report.AlertDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>top</role-hint>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.MailSender</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.SmsSender</role>
<role>com.dianping.cat.report.task.alert.sender.ExceptionPostman</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.WeixinSender</role>
<role>com.dianping.cat.report.task.alert.manager.AlertManager</role>
</requirement>
</requirements>
</component>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册