完成告警处理

This commit is contained in:
zhangxin10 2015-12-09 20:22:13 +08:00
parent 3d5a652d23
commit 9df8f63861
3 changed files with 268 additions and 0 deletions

View File

@ -0,0 +1,157 @@
package com.ai.cloud.skywalking.alarm.procesor;
import com.ai.cloud.skywalking.alarm.model.AlarmRule;
import com.ai.cloud.skywalking.alarm.model.ApplicationInfo;
import com.ai.cloud.skywalking.alarm.model.UserInfo;
import com.ai.cloud.skywalking.alarm.model.parameter.Application;
import com.ai.cloud.skywalking.alarm.util.MailUtil;
import com.ai.cloud.skywalking.alarm.util.RedisUtil;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.Version;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import redis.clients.jedis.Jedis;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.*;
public class AlarmMessageProcessor {
private static Logger logger = LogManager.getLogger(AlarmMessageProcessor.class);
public static void process(UserInfo userInfo, AlarmRule rule) {
Set<String> sentData = new HashSet<String>();
List<Application> applications = new ArrayList<Application>();
Set<String> toBeSendData;
Application temApplication;
long currentFireTimeM = System.currentTimeMillis() / (10000 * 6);
// 获取待发送数据
if (checkerProcessInterval(rule, currentFireTimeM)) {
for (ApplicationInfo applicationInfo : rule.getApplicationInfos()) {
toBeSendData = new HashSet<String>();
for (int i = 0; i < currentFireTimeM - rule.getPreviousFireTimeM(); i++) {
toBeSendData.addAll(getAlarmMessage(generateAlarmKey(userInfo.getUserId(),
applicationInfo.getAppCode(), i)));
toBeSendData.removeAll(sentData);
sentData.addAll(toBeSendData);
}
temApplication = new Application(applicationInfo.getAppId());
temApplication.setTraceIds(toBeSendData);
applications.add(temApplication);
}
// 没有数据需要发送
if (sentData.size() <= 0) {
// 清理数据
for (ApplicationInfo applicationInfo : rule.getApplicationInfos()) {
for (int i = 0; i < currentFireTimeM - rule.getPreviousFireTimeM(); i++) {
expiredAlarmMessage(generateAlarmKey(userInfo.getUserId(),
applicationInfo.getAppCode(), i));
}
}
// 修改-保存上次处理时间
rule.setPreviousFireTimeM(currentFireTimeM);
savePreviousFireTime(userInfo.getUserId(), rule.getRuleId(), currentFireTimeM);
} else {
if ("0".equals(rule.getTodoType())) {
// 发送邮件
String subjects = generateSubjects(sentData.size(),
rule.getPreviousFireTimeM(), currentFireTimeM);
Map parameter = new HashMap();
parameter.put("applications", applications);
parameter.put("name", userInfo.getUserId());
MailUtil.sendMail(rule.getConfigArgsDescriber().getMailInfo().getMailTo(),
rule.getConfigArgsDescriber().getMailInfo().getMailCc(),
generateContent(rule.getConfigArgsDescriber().getMailInfo()
.getMailTemp(), parameter),
subjects);
}
// 清理数据
for (ApplicationInfo applicationInfo : rule.getApplicationInfos()) {
for (int i = 0; i < currentFireTimeM - rule.getPreviousFireTimeM(); i++) {
expiredAlarmMessage(generateAlarmKey(userInfo.getUserId(),
applicationInfo.getAppCode(), i));
}
}
// 修改-保存上次处理时间
rule.setPreviousFireTimeM(currentFireTimeM);
savePreviousFireTime(userInfo.getUserId(), rule.getRuleId(), currentFireTimeM);
}
}
}
private static String generateSubjects(int count, long startTime, long endTime) {
String title = "[Warning] There were " + count + " alarm information between " +
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(startTime)) +
" to " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(endTime));
return title;
}
private static boolean checkerProcessInterval(AlarmRule rule, long currentFireTimeM) {
return currentFireTimeM - rule.getPreviousFireTimeM() >= rule.getConfigArgsDescriber().getPeriod();
}
private static void expiredAlarmMessage(String key) {
Jedis client = RedisUtil.getRedisClient();
client.expire(key, 0);
if (client != null) {
client.close();
}
}
private static void savePreviousFireTime(String userId, String ruleId, long currentFireTimeM) {
Jedis client = RedisUtil.getRedisClient();
client.hset(userId, ruleId, String.valueOf(currentFireTimeM));
if (client != null) {
client.close();
}
}
private static String generateAlarmKey(String userId, String appCode, int period) {
return userId + "-" + appCode + "-" + ((System.currentTimeMillis() / (10000 * 6))
- period);
}
private static Collection<String> getAlarmMessage(String key) {
Jedis client = RedisUtil.getRedisClient();
Map<String, String> result = client.hgetAll(key);
if (result == null) {
return new ArrayList<String>();
}
client.close();
return result.values();
}
private static String generateContent(String templateStr, Map parameter) {
Configuration cfg = new Configuration(new Version("2.3.23"));
cfg.setDefaultEncoding("UTF-8");
Template t = null;
try {
t = new Template(null, new StringReader(templateStr), cfg);
StringWriter out = new StringWriter();
t.process(parameter, out);
return out.getBuffer().toString();
} catch (IOException e) {
logger.error("Template illegal.", e);
} catch (TemplateException e) {
logger.error("Failed to generate content.", e);
}
return "";
}
}

View File

@ -0,0 +1,65 @@
package com.ai.cloud.skywalking.alarm.util;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class MailUtil {
private static Logger logger = LogManager.getLogger(MailUtil.class);
private static Session session;
private static String sendAccount;
private static Transport ts;
static {
try {
Properties prop = new Properties();
prop.load(MailUtil.class.getResourceAsStream("/mail/mail.config"));
session = Session.getInstance(prop);
ts = session.getTransport();
ts.connect(prop.getProperty("mail.host"), prop.getProperty("mail.username"), prop.getProperty("mail.password"));
sendAccount = prop.getProperty("mail.username") + prop.getProperty("mail.account.prefix");
} catch (Exception e) {
logger.error("Failed to connect the mail System.", e);
System.exit(-1);
}
}
public static void sendMail(String[] recipientAccounts, String[] ccList, String context, String title) {
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(sendAccount));
InternetAddress[] recipientAccountArray = new InternetAddress[recipientAccounts.length];
for (int i = 0; i < recipientAccounts.length; i++) {
recipientAccountArray[i] = new InternetAddress(recipientAccounts[i]);
}
message.addRecipients(Message.RecipientType.TO, recipientAccountArray);
InternetAddress[] ccAccountArray = new InternetAddress[ccList.length];
for (int i = 0; i < recipientAccounts.length; i++) {
ccAccountArray[i] = new InternetAddress(ccList[i]);
}
message.addRecipients(Message.RecipientType.CC, ccAccountArray);
message.setSubject(title);
message.setContent(context, "text/html;charset=UTF-8");
ts.sendMessage(message, message.getAllRecipients());
} catch (AddressException e) {
logger.error("Recipient Account is not correct.", e);
} catch (NoSuchProviderException e) {
logger.error("Failed to send mail.", e);
} catch (MessagingException e) {
logger.error("Failed to send mail.", e);
}
}
}

View File

@ -0,0 +1,46 @@
package com.ai.cloud.skywalking.alarm.util;
import com.ai.cloud.skywalking.alarm.conf.Config;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class RedisUtil {
private static Logger logger = LogManager.getLogger(RedisUtil.class);
private static JedisPool jedisPool;
private static String[] config;
static {
GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig();
String redisServerConfig = Config.Alarm.REDIS_SERVER;
if (redisServerConfig == null || redisServerConfig.length() <= 0) {
logger.error("Redis server is not setting. Switch off alarm module. ");
} else {
config = redisServerConfig.split(":");
if (config.length != 2) {
logger.error("Redis server address is illegal setting, need to be 'ip:port'. Switch off alarm module. ");
Config.Alarm.ALARM_OFF_FLAG = true;
} else {
jedisPool = new JedisPool(genericObjectPoolConfig, config[0],
Integer.valueOf(config[1]));
}
}
}
private static GenericObjectPoolConfig buildGenericObjectPoolConfig() {
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setTestOnBorrow(true);
genericObjectPoolConfig.setMaxIdle(Config.Alarm.REDIS_MAX_IDLE);
genericObjectPoolConfig.setMinIdle(Config.Alarm.REDIS_MIN_IDLE);
genericObjectPoolConfig.setMaxTotal(Config.Alarm.REDIS_MAX_TOTAL);
return genericObjectPoolConfig;
}
public static Jedis getRedisClient(){
return jedisPool.getResource();
}
}