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

add postman, alertmanater

上级 019a31fc
package com.dianping.cat.report.task.alert;
import org.unidal.dal.jdbc.DalException;
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;
public class AlertManager {
@Inject
protected AlertDao m_alertDao;
private Alert buildAlert(String categoryName, String domainName, String metricName, String mailTitle,
AlertResultEntity alertResult) {
Alert alert = new Alert();
alert.setDomain(domainName);
alert.setAlertTime(alertResult.getAlertTime());
alert.setCategory(categoryName);
alert.setType(alertResult.getAlertType());
alert.setContent(mailTitle + "<br/>" + alertResult.getContent());
alert.setMetric(metricName);
return alert;
}
protected void storeAlert(String categoryName, String domainName, String metricName, String mailTitle,
AlertResultEntity alertResult) {
Alert alert = buildAlert(categoryName, domainName, metricName, mailTitle, alertResult);
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);
}
}
}
......@@ -9,7 +9,6 @@ import java.util.Map;
import java.util.Map.Entry;
import org.codehaus.plexus.logging.Logger;
import org.unidal.dal.jdbc.DalException;
import org.unidal.lookup.annotation.Inject;
import org.unidal.tuple.Pair;
......@@ -22,27 +21,15 @@ import com.dianping.cat.consumer.metric.ProductLineConfigManager;
import com.dianping.cat.consumer.metric.model.entity.MetricItem;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.metric.model.entity.Segment;
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.alert.type.entity.Type;
import com.dianping.cat.home.dal.report.Alert;
import com.dianping.cat.home.dal.report.AlertDao;
import com.dianping.cat.home.rule.entity.Condition;
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.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.service.ModelPeriod;
import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.system.config.AlertTypeManager;
import com.dianping.cat.system.config.BaseRuleConfigManager;
import com.dianping.cat.system.tool.MailSMS;
import com.site.lookup.util.StringUtils;
public abstract class BaseAlert {
......@@ -52,9 +39,6 @@ public abstract class BaseAlert {
@Inject
protected MailSMS m_mailSms;
@Inject
protected AlertDao m_alertDao;
@Inject
protected AlertInfo m_alertInfo;
......@@ -74,22 +58,10 @@ public abstract class BaseAlert {
protected RemoteMetricReportService m_service;
@Inject
private ProjectDao m_projectDao;
@Inject
protected MailSender m_mailSender;
@Inject
protected SmsSender m_smsSender;
@Inject
protected WeixinSender m_weixinSender;
@Inject
protected AlertTypeManager m_alertTypeManager;
protected Postman m_postman;
@Inject
protected Postman m_postman;
protected AlertManager m_alertManager;
protected static final int DATA_AREADY_MINUTE = 1;
......@@ -103,19 +75,6 @@ public abstract class BaseAlert {
protected Map<String, MetricReport> m_lastReports = new HashMap<String, MetricReport>();
private Alert buildAlert(String domainName, String metricTitle, String mailTitle, AlertResultEntity alertResult) {
Alert alert = new Alert();
alert.setDomain(domainName);
alert.setAlertTime(alertResult.getAlertTime());
alert.setCategory(getName());
alert.setType(alertResult.getAlertType());
alert.setContent(mailTitle + "<br/>" + alertResult.getContent());
alert.setMetric(metricTitle);
return alert;
}
private String buildMetricName(String metricKey) {
try {
return metricKey.split(":")[2];
......@@ -134,28 +93,6 @@ public abstract class BaseAlert {
}
}
protected 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;
}
private Long buildMillsByString(String time) throws Exception {
String[] times = time.split(":");
int hour = Integer.parseInt(times[0]);
......@@ -302,18 +239,15 @@ public abstract class BaseAlert {
List<AlertResultEntity> alertResults = computeAlertInfo(minute, productlineName, metricKey, type);
for (AlertResultEntity alertResult : alertResults) {
m_alertInfo.addAlertInfo(productlineName, metricKey, new Date().getTime());
String metricName = buildMetricName(metricKey);
String mailTitle = getAlertConfig().buildMailTitle(productLine.getTitle(), metricName);
String domain = extractDomain(metricKey);
String contactInfo = buildContactInfo(domain);
alertResult.setContent(alertResult.getContent() + contactInfo);
String content = alertResult.getContent();
m_alertInfo.addAlertInfo(productlineName, metricKey, new Date().getTime());
m_alertManager.storeAlert(getName(), productlineName, metricName, mailTitle, alertResult);
storeAlert(productlineName, metricName, mailTitle, alertResult);
String domain = extractDomain(metricKey);
String configId = getAlertConfig().getId();
sendAllAlert(productLine, domain, mailTitle, content, alertResult.getAlertType(), configId);
Cat.logEvent(configId, productlineName, Event.SUCCESS, mailTitle + " " + content);
m_postman.sendAlert(getAlertConfig(), alertResult, productLine, domain, mailTitle, configId);
}
}
}
......@@ -333,35 +267,6 @@ public abstract class BaseAlert {
}
}
protected boolean sendAllAlert(ProductLine productLine, String domain, String title, String content,
String alertType, String configId) {
Type type = m_alertTypeManager.getType(configId, domain, alertType);
boolean sendResult = true;
if (type.isSendMail()) {
List<String> receivers = getAlertConfig().buildMailReceivers(productLine);
if (!m_mailSender.sendAlert(receivers, domain, title, content)) {
sendResult = false;
}
}
if (type.isSendWeixin()) {
List<String> receivers = getAlertConfig().buildMailReceivers(productLine);
if (!m_weixinSender.sendAlert(receivers, domain, title, content)) {
sendResult = false;
}
}
if (type.isSendSms()) {
List<String> receivers = getAlertConfig().buildSMSReceivers(productLine);
if (!m_smsSender.sendAlert(receivers, domain, title, content)) {
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;
......@@ -419,20 +324,6 @@ public abstract class BaseAlert {
return result;
}
protected void storeAlert(String domainName, String metricTitle, String mailTitle, AlertResultEntity alertResult) {
Alert alert = buildAlert(domainName, metricTitle, mailTitle, alertResult);
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);
}
}
protected abstract String getName();
protected abstract BaseAlertConfig getAlertConfig();
......
......@@ -83,7 +83,7 @@ public abstract class BaseAlertConfig {
}
}
protected abstract String buildMailTitle(String artifactName, String configTitle);
public abstract String buildMailTitle(String artifactName, String metricName);
public abstract String getId();
......
......@@ -7,11 +7,11 @@ public class BusinessAlertConfig extends BaseAlertConfig {
private String m_id = "business";
@Override
public String buildMailTitle(String productlineName, String configTitle) {
public String buildMailTitle(String productlineName, String metricName) {
StringBuilder sb = new StringBuilder();
sb.append("[业务告警] [产品线 ").append(productlineName).append("]");
sb.append("[业务指标 ").append(configTitle).append("]");
sb.append("[业务指标 ").append(metricName).append("]");
return sb.toString();
}
......
......@@ -58,7 +58,7 @@ public class ExceptionAlertConfig extends BaseAlertConfig {
}
@Override
public String buildMailTitle(String domain, String configTitle) {
public String buildMailTitle(String domain, String metricName) {
StringBuilder sb = new StringBuilder();
sb.append("[CAT异常告警] [项目: ").append(domain).append("]");
......
......@@ -7,11 +7,11 @@ public class NetworkAlertConfig extends BaseAlertConfig {
private String m_id = "network";
@Override
public String buildMailTitle(String productlineName, String configTitle) {
public String buildMailTitle(String productlineName, String metricName) {
StringBuilder sb = new StringBuilder();
sb.append("[网络告警] [产品线 ").append(productlineName).append("]");
sb.append("[网络指标 ").append(configTitle).append("]");
sb.append("[网络指标 ").append(metricName).append("]");
return sb.toString();
}
......
......@@ -2,17 +2,55 @@ package com.dianping.cat.report.task.alert.sender;
import java.util.List;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.company.model.entity.ProductLine;
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.home.alert.type.entity.Type;
import com.dianping.cat.message.Event;
import com.dianping.cat.report.task.alert.AlertResultEntity;
import com.dianping.cat.report.task.alert.BaseAlertConfig;
import com.dianping.cat.system.config.AlertTypeManager;
import com.site.lookup.util.StringUtils;
public class Postman {
protected String generateMailTitle() {
@Inject
private ProjectDao m_projectDao;
return null;
}
@Inject
protected MailSender m_mailSender;
@Inject
protected SmsSender m_smsSender;
@Inject
protected WeixinSender m_weixinSender;
@Inject
protected AlertTypeManager m_alertTypeManager;
protected String generateMailContent() {
protected 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;
}
......@@ -22,11 +60,39 @@ public class Postman {
return null;
}
public boolean storeAndSendAlert(BaseAlertConfig alertConfig, ProductLine productline, String domain) {
public boolean sendAlert(BaseAlertConfig alertConfig, AlertResultEntity alertResult, ProductLine productline,
String domain, String mailTitle, String configId) {
String content = alertResult.getContent();
String contactInfo = buildContactInfo(domain);
Type type = m_alertTypeManager.getType(configId, domain, alertResult.getAlertType());
boolean sendResult = true;
if (type.isSendMail()) {
String mailContent = content + "<br/>" + contactInfo;
List<String> receivers = alertConfig.buildMailReceivers(productline);
if (!m_mailSender.sendAlert(receivers, domain, mailTitle, mailContent)) {
sendResult = false;
}
}
if (type.isSendWeixin()) {
String weixinContent = content + "\n" + contactInfo;
List<String> receivers = alertConfig.buildMailReceivers(productline);
if (!m_weixinSender.sendAlert(receivers, domain, mailTitle, weixinContent)) {
sendResult = false;
}
}
if (type.isSendSms()) {
String smsContent = content + contactInfo;
List<String> receivers = alertConfig.buildSMSReceivers(productline);
if (!m_smsSender.sendAlert(receivers, domain, mailTitle, smsContent)) {
sendResult = false;
}
}
return false;
Cat.logEvent(configId, productline.getId(), Event.SUCCESS, mailTitle + " " + content);
return sendResult;
}
}
......@@ -7,11 +7,11 @@ public class SystemAlertConfig extends BaseAlertConfig {
private String m_id = "system";
@Override
public String buildMailTitle(String productlineName, String configTitle) {
public String buildMailTitle(String productlineName, String metricName) {
StringBuilder sb = new StringBuilder();
sb.append("[系统告警] [产品线 ").append(productlineName).append("]");
sb.append("[系统指标 ").append(configTitle).append("]");
sb.append("[系统指标 ").append(metricName).append("]");
return sb.toString();
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册