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

refactor sender from enum to inherit

上级 6d32ca4d
......@@ -62,6 +62,9 @@ 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.network.NetworkAlert;
import com.dianping.cat.report.task.alert.network.NetworkAlertConfig;
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.summary.AlertSummaryDecorator;
import com.dianping.cat.report.task.alert.summary.AlertSummaryExecutor;
import com.dianping.cat.report.task.alert.summary.AlertSummaryFTLDecorator;
......@@ -190,23 +193,39 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(DataChecker.class, DefaultDataChecker.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));
all.add(C(MailSender.class).req(MailSMS.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));
all.add(C(SmsSender.class).req(MailSMS.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));
all.add(C(WeixinSender.class).req(MailSMS.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));
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));
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));
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));
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));
all.add(C(AlertSummaryExecutor.class).req(AlertSummaryGenerator.class, AlertSummaryManager.class, MailSMS.class)
.req(AlertSummaryDecorator.class, AlertSummaryFTLDecorator.ID));
......
......@@ -33,6 +33,9 @@ import com.dianping.cat.home.rule.entity.Config;
import com.dianping.cat.message.Event;
import com.dianping.cat.report.baseline.BaselineService;
import com.dianping.cat.report.task.alert.sender.BaseSender;
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.service.ModelPeriod;
import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.system.config.BaseRuleConfigManager;
......@@ -72,7 +75,13 @@ public abstract class BaseAlert {
private ProjectDao m_projectDao;
@Inject
protected BaseSender m_baseSender;
protected MailSender m_mailSender;
@Inject
protected SmsSender m_smsSender;
@Inject
protected WeixinSender m_weixinSender;
protected static final int DATA_AREADY_MINUTE = 1;
......@@ -295,7 +304,7 @@ public abstract class BaseAlert {
storeAlert(productlineName, metricTitle, mailTitle, alertResult);
String configId = getAlertConfig().getId();
m_baseSender.sendAllAlert(productLine, domain, mailTitle, content, alertResult.getAlertType(), configId);
sendAllAlert(productLine, domain, mailTitle, content, alertResult.getAlertType(), configId);
Cat.logEvent(configId, productlineName, Event.SUCCESS, mailTitle + " " + content);
}
}
......@@ -316,6 +325,26 @@ public abstract class BaseAlert {
}
}
protected boolean sendAllAlert(ProductLine productLine, String domain, String title, String content,
String alertType, String configId) {
boolean sendResult = true;
BaseSender[] senders = { m_mailSender, m_weixinSender };
List<String> receivers = getAlertConfig().buildMailReceivers(productLine);
for (BaseSender sender : senders) {
if (!sender.sendAlert(receivers, domain, title, content, alertType)) {
sendResult = false;
}
}
receivers = getAlertConfig().buildSMSReceivers(productLine);
if (!m_smsSender.sendAlert(receivers, domain, title, content, alertType)) {
sendResult = false;
}
return sendResult;
}
private double[] queryBaseLine(int start, int end, String baseLineKey, Date date, MetricType type) {
double[] baseline = m_baselineService.queryHourlyBaseline(MetricAnalyzer.ID, baseLineKey + ":" + type, date);
int length = end - start + 1;
......
......@@ -33,9 +33,9 @@ public abstract class BaseAlertConfig {
return smsReceivers;
}
public List<String> buildMailReceivers(ProductLine productLine, String configId) {
public List<String> buildMailReceivers(ProductLine productLine) {
List<String> mailReceivers = new ArrayList<String>();
Receiver receiver = m_manager.queryReceiverById(configId);
Receiver receiver = m_manager.queryReceiverById(getId());
if (receiver != null && !receiver.isEnable()) {
return mailReceivers;
......@@ -47,10 +47,6 @@ public abstract class BaseAlertConfig {
}
}
public List<String> buildMailReceivers(ProductLine productLine) {
return buildMailReceivers(productLine, getId());
}
private List<String> buildProductlineMailReceivers(ProductLine productLine) {
return split(productLine.getEmail());
}
......@@ -74,7 +70,17 @@ public abstract class BaseAlertConfig {
}
public List<String> buildSMSReceivers(ProductLine productLine) {
return buildSMSReceivers(productLine, getId());
List<String> smsReceivers = new ArrayList<String>();
Receiver receiver = m_manager.queryReceiverById(getId());
if (receiver != null && !receiver.isEnable()) {
return smsReceivers;
} else {
smsReceivers.addAll(buildDefaultSMSReceivers(receiver));
smsReceivers.addAll(buildProductlineSMSReceivers(productLine));
return smsReceivers;
}
}
protected abstract String buildMailTitle(String artifactName, String configTitle);
......
......@@ -77,7 +77,7 @@ public class BusinessAlert extends BaseAlert implements Task, LogEnabled {
storeAlert(domain, metric, mailTitle, alertResult);
String configId = getAlertConfig().getId();
m_baseSender.sendAllAlert(productLine, domain, mailTitle, content, alertResult.getAlertType(), configId);
sendAllAlert(productLine, domain, mailTitle, content, alertResult.getAlertType(), configId);
Cat.logEvent(configId, product, Event.SUCCESS, mailTitle + " " + content);
}
}
......
......@@ -30,7 +30,9 @@ 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.exception.AlertExceptionBuilder.AlertException;
import com.dianping.cat.report.task.alert.sender.BaseSender;
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.service.ModelRequest;
import com.dianping.cat.service.ModelResponse;
import com.dianping.cat.system.config.ExceptionConfigManager;
......@@ -61,7 +63,13 @@ public class ExceptionAlert implements Task, LogEnabled {
private ModelService<TopReport> m_topService;
@Inject
private BaseSender m_baseSender;
protected MailSender m_mailSender;
@Inject
protected SmsSender m_smsSender;
@Inject
protected WeixinSender m_weixinSender;
private static final long DURATION = TimeUtil.ONE_MINUTE;
......@@ -200,7 +208,6 @@ public class ExceptionAlert implements Task, LogEnabled {
}
}
@SuppressWarnings("static-access")
private void sendAndStoreAlert(String domain, List<AlertException> exceptions) {
Project project = queryProjectByDomain(domain);
List<String> emails = m_alertConfig.buildMailReceivers(project);
......@@ -212,13 +219,13 @@ public class ExceptionAlert implements Task, LogEnabled {
storeAlerts(domain, exceptions, mailTitle + "<br/>" + mailContent);
m_baseSender.MailSender.sendAlert(emails, domain, mailTitle, mailContent, "warning", m_alertConfig.getId());
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_baseSender.WeixinSender.sendAlert(emails, domain, mailTitle, weixinContent, "error", m_alertConfig.getId());
m_weixinSender.sendAlert(emails, domain, mailTitle, weixinContent, "error");
Cat.logEvent("ExceptionAlert", domain, Event.SUCCESS, "[微信告警] " + mailTitle + " " + weixinContent + " "
+ domain + " " + weixins);
}
......@@ -226,7 +233,7 @@ public class ExceptionAlert implements Task, LogEnabled {
List<AlertException> errorAndTriggeredExceptions = m_alertBuilder.buildErrorAndTriggeredException(exceptions);
if (!errorAndTriggeredExceptions.isEmpty()) {
String smsContent = m_alertBuilder.buildContent(errorAndTriggeredExceptions.toString(), domain, contactInfo);
m_baseSender.SmsSender.sendAlert(phones, domain, smsContent, smsContent, "error", m_alertConfig.getId());
m_smsSender.sendAlert(phones, domain, smsContent, smsContent, "error");
Cat.logEvent("ExceptionAlert", domain, Event.SUCCESS, "[短信告警] " + smsContent);
}
}
......
......@@ -2,158 +2,27 @@ package com.dianping.cat.report.task.alert.sender;
import java.util.List;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.company.model.entity.ProductLine;
import com.dianping.cat.report.task.alert.BaseAlertConfig;
import com.dianping.cat.system.tool.MailSMS;
public enum BaseSender {
public abstract class BaseSender implements LogEnabled {
MailSender {
@Override
protected void sendLog(String title, String content, List<String> receivers) {
StringBuilder builder = new StringBuilder();
builder.append(title).append(",").append(content).append(",");
for (String receiver : receivers) {
builder.append(receiver).append(" ");
}
Cat.logEvent("SendMail", builder.toString());
}
@Override
protected List<String> queryReceivers(ProductLine productLine, String configId) {
return m_alertConfig.buildMailReceivers(productLine, configId);
}
@Override
public boolean sendAlert(List<String> receivers, String domain, String title, String content, String alertType,
String configId) {
try {
m_mailSms.sendEmail(title, content, receivers);
sendLog(title, content, receivers);
return true;
} catch (Exception ex) {
Cat.logError("send mail error" + " " + title + " " + content, ex);
return false;
}
}
},
WeixinSender {
@Override
protected void sendLog(String title, String content, List<String> receivers) {
StringBuilder builder = new StringBuilder();
builder.append(title).append(" ").append(content).append(" ");
for (String receiver : receivers) {
builder.append(receiver).append(" ");
}
Cat.logEvent("SendWeixin", builder.toString());
}
@Override
protected List<String> queryReceivers(ProductLine productLine, String configId) {
return m_alertConfig.buildMailReceivers(productLine, configId);
}
@Override
public boolean sendAlert(List<String> receivers, String domain, String title, String content, String alertType,
String configId) {
if (alertType == null || !alertType.equals("error")) {
return true;
}
try {
m_mailSms.sendWeiXin(title, content, domain, mergeList(receivers));
sendLog(title, content, receivers);
return true;
} catch (Exception ex) {
Cat.logError("send weixin error" + " " + title + " " + content, ex);
return false;
}
}
private String mergeList(List<String> receivers) {
StringBuilder builder = new StringBuilder();
for (String receiver : receivers) {
builder.append(receiver).append(",");
}
String tmpResult = builder.toString();
if (tmpResult.endsWith(",")) {
return tmpResult.substring(0, tmpResult.length() - 1);
} else {
return tmpResult;
}
}
},
SmsSender {
@Override
protected void sendLog(String title, String content, List<String> receivers) {
StringBuilder builder = new StringBuilder();
builder.append(title).append(" ").append(content).append(" ");
for (String receiver : receivers) {
builder.append(receiver).append(" ");
}
Cat.logEvent("SendSms", builder.toString());
}
@Override
protected List<String> queryReceivers(ProductLine productLine, String configId) {
return m_alertConfig.buildSMSReceivers(productLine, configId);
}
@Override
public boolean sendAlert(List<String> receivers, String domain, String title, String content, String alertType,
String configId) {
if (alertType == null || !alertType.equals("error")) {
return true;
}
try {
m_mailSms.sendSms(title, content, receivers);
sendLog(title, content, receivers);
return true;
} catch (Exception ex) {
Cat.logError("send sms error" + " " + title + " " + content, ex);
return false;
}
}
};
@Inject
protected BaseAlertConfig m_alertConfig;
protected Logger m_logger;
@Inject
protected MailSMS m_mailSms;
public boolean sendAllAlert(ProductLine productLine, String domain, String title, String content, String alertType,
String configId) {
boolean sendResult = true;
for (BaseSender sender : BaseSender.values()) {
List<String> receivers = sender.queryReceivers(productLine, configId);
if (!sender.sendAlert(receivers, domain, title, content, alertType, configId)) {
sendResult = false;
}
}
return sendResult;
}
protected abstract List<String> queryReceivers(ProductLine productLine, String configId);
protected abstract void sendLog(String title, String content, List<String> receivers);
public abstract boolean sendAlert(List<String> receivers, String domain, String title, String content,
String alertType, String configId);
String alertType);
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
}
package com.dianping.cat.report.task.alert.sender;
import java.util.List;
import com.dianping.cat.Cat;
public class MailSender extends BaseSender {
@Override
protected void sendLog(String title, String content, List<String> receivers) {
StringBuilder builder = new StringBuilder();
builder.append(title).append(",").append(content).append(",");
for (String receiver : receivers) {
builder.append(receiver).append(" ");
}
Cat.logEvent("SendMail", builder.toString());
m_logger.info("SendMail" + builder.toString());
}
@Override
public boolean sendAlert(List<String> receivers, String domain, String title, String content, String alertType) {
try {
m_mailSms.sendEmail(title, content, receivers);
sendLog(title, content, receivers);
return true;
} catch (Exception ex) {
Cat.logError("send mail error" + " " + title + " " + content, ex);
return false;
}
}
}
package com.dianping.cat.report.task.alert.sender;
import java.util.List;
import com.dianping.cat.Cat;
public class SmsSender extends BaseSender {
@Override
protected void sendLog(String title, String content, List<String> receivers) {
StringBuilder builder = new StringBuilder();
builder.append(title).append(" ").append(content).append(" ");
for (String receiver : receivers) {
builder.append(receiver).append(" ");
}
Cat.logEvent("SendSms", builder.toString());
m_logger.info("SendSms" + builder.toString());
}
@Override
public boolean sendAlert(List<String> receivers, String domain, String title, String content, String alertType) {
if (alertType == null || !alertType.equals("error")) {
return true;
}
try {
m_mailSms.sendSms(title, content, receivers);
sendLog(title, content, receivers);
return true;
} catch (Exception ex) {
Cat.logError("send sms error" + " " + title + " " + content, ex);
return false;
}
}
}
package com.dianping.cat.report.task.alert.sender;
import java.util.List;
import com.dianping.cat.Cat;
public class WeixinSender extends BaseSender {
@Override
protected void sendLog(String title, String content, List<String> receivers) {
StringBuilder builder = new StringBuilder();
builder.append(title).append(" ").append(content).append(" ");
for (String receiver : receivers) {
builder.append(receiver).append(" ");
}
Cat.logEvent("SendWeixin", builder.toString());
m_logger.info("SendWeixin" + builder.toString());
}
@Override
public boolean sendAlert(List<String> receivers, String domain, String title, String content, String alertType) {
if (alertType == null || !alertType.equals("error")) {
return true;
}
try {
m_mailSms.sendWeiXin(title, content, domain, mergeList(receivers));
sendLog(title, content, receivers);
return true;
} catch (Exception ex) {
Cat.logError("send weixin error" + " " + title + " " + content, ex);
return false;
}
}
private String mergeList(List<String> receivers) {
StringBuilder builder = new StringBuilder();
for (String receiver : receivers) {
builder.append(receiver).append(",");
}
String tmpResult = builder.toString();
if (tmpResult.endsWith(",")) {
return tmpResult.substring(0, tmpResult.length() - 1);
} else {
return tmpResult;
}
}
}
......@@ -1795,6 +1795,33 @@
<role>com.dianping.cat.report.task.alert.DataChecker</role>
<implementation>com.dianping.cat.report.task.alert.DefaultDataChecker</implementation>
</component>
<component>
<role>com.dianping.cat.report.task.alert.sender.MailSender</role>
<implementation>com.dianping.cat.report.task.alert.sender.MailSender</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.system.tool.MailSMS</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.alert.sender.SmsSender</role>
<implementation>com.dianping.cat.report.task.alert.sender.SmsSender</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.system.tool.MailSMS</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.alert.sender.WeixinSender</role>
<implementation>com.dianping.cat.report.task.alert.sender.WeixinSender</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.system.tool.MailSMS</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>
......@@ -1832,6 +1859,15 @@
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</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>
</requirement>
</requirements>
</component>
<component>
......@@ -1871,6 +1907,15 @@
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</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>
</requirement>
</requirements>
</component>
<component>
......@@ -1910,6 +1955,15 @@
<requirement>
<role>com.dianping.cat.core.dal.ProjectDao</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>
</requirement>
</requirements>
</component>
<component>
......@@ -1947,6 +2001,15 @@
<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>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.sender.WeixinSender</role>
</requirement>
</requirements>
</component>
<component>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册