parent
9629db519b
commit
acdfd823ce
|
|
@ -36,164 +36,189 @@ import freemarker.template.TemplateException;
|
|||
|
||||
public class AlarmMessageProcessor {
|
||||
|
||||
private static Logger logger = LogManager .getLogger(AlarmMessageProcessor.class);
|
||||
|
||||
static List<AlarmType> alarmTypeList;
|
||||
static Template t;
|
||||
private static Logger logger = LogManager
|
||||
.getLogger(AlarmMessageProcessor.class);
|
||||
|
||||
static {
|
||||
alarmTypeList = AlarmTypeUtil.getAlarmTypeList();
|
||||
}
|
||||
private static final String TYPE_OF_EXCEPTION_WARNING = "default";
|
||||
|
||||
static List<AlarmType> alarmTypeList;
|
||||
static Template t;
|
||||
|
||||
public void process(UserInfo userInfo, AlarmRule rule) throws TemplateException, IOException, SQLException {
|
||||
|
||||
Map<String, List<AlarmMessage>> warningMap = new HashMap<String, List<AlarmMessage>>();
|
||||
Set<String> warningMessageKeys = new HashSet<String>();
|
||||
long currentFireMinuteTime = System.currentTimeMillis() / (1000 * 60);
|
||||
long warningTimeWindowSize = currentFireMinuteTime
|
||||
- rule.getPreviousFireTimeM();
|
||||
|
||||
// 获取待发送数据
|
||||
if (warningTimeWindowSize >= rule.getConfigArgsDescriber().getPeriod()) {
|
||||
for(AlarmType alarmType : alarmTypeList) {
|
||||
String type = alarmType.getType();
|
||||
List<AlarmMessage> warningObjects = new ArrayList<AlarmMessage>();
|
||||
for (ApplicationInfo applicationInfo : rule.getApplicationInfos()) {
|
||||
for (int period = 0; period < warningTimeWindowSize; period++) {
|
||||
Long currentMinuteTime = currentFireMinuteTime - period - 1;
|
||||
String alarmKey = userInfo.getUserId()
|
||||
+ "-"
|
||||
+ applicationInfo.getAppCode()
|
||||
+ "-"
|
||||
+ currentMinuteTime;
|
||||
if(!type.equals("default")) {
|
||||
alarmKey += "-" + type;
|
||||
}
|
||||
warningMessageKeys.add(alarmKey);
|
||||
setAlarmMessages(alarmKey, warningObjects);
|
||||
}
|
||||
}
|
||||
if(warningObjects.size() > 0) {
|
||||
warningMap.put(type, warningObjects);
|
||||
}
|
||||
}
|
||||
static {
|
||||
alarmTypeList = AlarmTypeUtil.getAlarmTypeList();
|
||||
}
|
||||
|
||||
// 发送告警数据
|
||||
int warningSize = this.getWarningSize(warningMap);
|
||||
if ( warningSize > 0) {
|
||||
if ("0".equals(rule.getTodoType())) {
|
||||
logger.info("A total of {} alarm information needs to be sent {}", warningSize,
|
||||
rule.getConfigArgsDescriber().getMailInfo().getMailTo());
|
||||
// 发送邮件
|
||||
String subjects = generateSubject(userInfo.getUserName(), warningSize,
|
||||
rule.getPreviousFireTimeM(), currentFireMinuteTime);
|
||||
Map<String, Object> parameter = new HashMap<String, Object>();
|
||||
|
||||
parameter.put("alarmTypeList", alarmTypeList);
|
||||
parameter.put("warningMap", warningMap);
|
||||
parameter.put("name", userInfo.getUserName());
|
||||
parameter.put("startDate", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(
|
||||
rule.getPreviousFireTimeM() * 10000 * 6)));
|
||||
parameter.put("endDate", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(
|
||||
currentFireMinuteTime * 10000 * 6)));
|
||||
|
||||
|
||||
String mailContext = generateContent(parameter);
|
||||
if (mailContext.length() > 0) {
|
||||
MailInfo mailInfo = rule.getConfigArgsDescriber()
|
||||
.getMailInfo();
|
||||
MailUtil.sendMail(mailInfo.getMailTo(),
|
||||
mailInfo.getMailCc(), mailContext, subjects);
|
||||
}
|
||||
}
|
||||
}
|
||||
public void process(UserInfo userInfo, AlarmRule rule)
|
||||
throws TemplateException, IOException, SQLException {
|
||||
|
||||
// 清理数据
|
||||
for (String toBeRemovedKey : warningMessageKeys) {
|
||||
expiredAlarmMessage(toBeRemovedKey);
|
||||
}
|
||||
Map<String, List<AlarmMessage>> warningMap = new HashMap<String, List<AlarmMessage>>();
|
||||
Set<String> warningMessageKeys = new HashSet<String>();
|
||||
long currentFireMinuteTime = System.currentTimeMillis() / (1000 * 60);
|
||||
long warningTimeWindowSize = currentFireMinuteTime
|
||||
- rule.getPreviousFireTimeM();
|
||||
|
||||
// 修改-保存上次处理时间
|
||||
dealPreviousFireTime(userInfo, rule, currentFireMinuteTime);
|
||||
}
|
||||
// 获取待发送数据
|
||||
if (warningTimeWindowSize >= rule.getConfigArgsDescriber().getPeriod()) {
|
||||
for (AlarmType alarmType : alarmTypeList) {
|
||||
String type = alarmType.getType();
|
||||
List<AlarmMessage> warningObjects = new ArrayList<AlarmMessage>();
|
||||
for (ApplicationInfo applicationInfo : rule
|
||||
.getApplicationInfos()) {
|
||||
for (int period = 0; period < warningTimeWindowSize; period++) {
|
||||
Long currentMinuteTime = currentFireMinuteTime - period
|
||||
- 1;
|
||||
String alarmKey = userInfo.getUserId() + "-"
|
||||
+ applicationInfo.getAppCode() + "-"
|
||||
+ currentMinuteTime;
|
||||
if (!TYPE_OF_EXCEPTION_WARNING.equals(type)) {
|
||||
alarmKey += "-" + type;
|
||||
}
|
||||
warningMessageKeys.add(alarmKey);
|
||||
setAlarmMessages(alarmKey, warningObjects);
|
||||
}
|
||||
}
|
||||
if (warningObjects.size() > 0) {
|
||||
warningMap.put(type, warningObjects);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// 发送告警数据
|
||||
int warningSize = this.getWarningSize(warningMap);
|
||||
int exceptionAlarmSize = this.getExceptionSize(warningMap);
|
||||
if (warningSize > 0) {
|
||||
if ("0".equals(rule.getTodoType())) {
|
||||
logger.info(
|
||||
"A total of {} alarm information needs to be sent {}",
|
||||
warningSize, rule.getConfigArgsDescriber()
|
||||
.getMailInfo().getMailTo());
|
||||
// 发送邮件
|
||||
String subjects = generateSubject(userInfo.getUserName(),
|
||||
exceptionAlarmSize, warningSize,
|
||||
rule.getPreviousFireTimeM(), currentFireMinuteTime);
|
||||
Map<String, Object> parameter = new HashMap<String, Object>();
|
||||
|
||||
private void dealPreviousFireTime(UserInfo userInfo, AlarmRule rule,
|
||||
long currentFireMinuteTime) {
|
||||
rule.setPreviousFireTimeM(currentFireMinuteTime);
|
||||
savePreviousFireTime(userInfo.getUserId(), rule.getRuleId(),
|
||||
currentFireMinuteTime);
|
||||
}
|
||||
parameter.put("alarmTypeList", alarmTypeList);
|
||||
parameter.put("warningMap", warningMap);
|
||||
parameter.put("name", userInfo.getUserName());
|
||||
parameter.put("startDate", new SimpleDateFormat(
|
||||
"yyyy-MM-dd HH:mm:ss").format(new Date(rule
|
||||
.getPreviousFireTimeM() * 10000 * 6)));
|
||||
parameter.put("endDate", new SimpleDateFormat(
|
||||
"yyyy-MM-dd HH:mm:ss").format(new Date(
|
||||
currentFireMinuteTime * 10000 * 6)));
|
||||
|
||||
private String generateSubject(String userName, int count, long startTime, long endTime) {
|
||||
//TODO:邮件标题修改,添加了名称
|
||||
String title = "[Warning] Dear "
|
||||
+ userName
|
||||
+ ", there were "
|
||||
+ count
|
||||
+ " alarm information between "
|
||||
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(
|
||||
startTime * 10000 * 6))
|
||||
+ " to "
|
||||
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(
|
||||
endTime * 10000 * 6));
|
||||
String mailContext = generateContent(parameter);
|
||||
if (mailContext.length() > 0) {
|
||||
MailInfo mailInfo = rule.getConfigArgsDescriber()
|
||||
.getMailInfo();
|
||||
MailUtil.sendMail(mailInfo.getMailTo(),
|
||||
mailInfo.getMailCc(), mailContext, subjects);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return title;
|
||||
}
|
||||
// 清理数据
|
||||
for (String toBeRemovedKey : warningMessageKeys) {
|
||||
expiredAlarmMessage(toBeRemovedKey);
|
||||
}
|
||||
|
||||
private void expiredAlarmMessage(final String key) {
|
||||
RedisUtil.execute(new Executable<Long>() {
|
||||
// 修改-保存上次处理时间
|
||||
dealPreviousFireTime(userInfo, rule, currentFireMinuteTime);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void dealPreviousFireTime(UserInfo userInfo, AlarmRule rule,
|
||||
long currentFireMinuteTime) {
|
||||
rule.setPreviousFireTimeM(currentFireMinuteTime);
|
||||
savePreviousFireTime(userInfo.getUserId(), rule.getRuleId(),
|
||||
currentFireMinuteTime);
|
||||
}
|
||||
|
||||
private String generateSubject(String userName, int exceptionAlarmSize,
|
||||
int count, long startTime, long endTime) {
|
||||
String title = (exceptionAlarmSize > 0 ? "[Error]" : "[Warning]")
|
||||
+ " Dear "
|
||||
+ userName
|
||||
+ ", SkyWalking collects "
|
||||
+ (exceptionAlarmSize > 0 ? exceptionAlarmSize
|
||||
+ " tid of system exceptions, " : "");
|
||||
if (count > exceptionAlarmSize) {
|
||||
title += (count - exceptionAlarmSize) + " tid of warings, ";
|
||||
}
|
||||
title += "between "
|
||||
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(
|
||||
startTime * 10000 * 6))
|
||||
+ " to "
|
||||
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(
|
||||
endTime * 10000 * 6));
|
||||
|
||||
return title;
|
||||
}
|
||||
|
||||
private void expiredAlarmMessage(final String key) {
|
||||
RedisUtil.execute(new Executable<Long>() {
|
||||
@Override
|
||||
public Long exe(Jedis client) {
|
||||
return client.expire(key, 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void savePreviousFireTime(final String userId, final String ruleId,
|
||||
final long currentFireMinuteTime) {
|
||||
RedisUtil.execute(new Executable<Long>() {
|
||||
private void savePreviousFireTime(final String userId, final String ruleId,
|
||||
final long currentFireMinuteTime) {
|
||||
RedisUtil.execute(new Executable<Long>() {
|
||||
@Override
|
||||
public Long exe(Jedis client) {
|
||||
return client.hset(userId, ruleId, String.valueOf(currentFireMinuteTime));
|
||||
return client.hset(userId, ruleId,
|
||||
String.valueOf(currentFireMinuteTime));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void setAlarmMessages(final String key, final Collection<AlarmMessage> warningTracingIds) {
|
||||
RedisUtil.execute(new Executable<Object>() {
|
||||
private void setAlarmMessages(final String key,
|
||||
final Collection<AlarmMessage> warningTracingIds) {
|
||||
RedisUtil.execute(new Executable<Object>() {
|
||||
@Override
|
||||
public Collection<String> exe(Jedis client) {
|
||||
Map<String, String> result = client.hgetAll(key);
|
||||
if (result != null) {
|
||||
for(String traceid : result.keySet()){
|
||||
warningTracingIds.add(new AlarmMessage(traceid, result.get(traceid)));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
if (result != null) {
|
||||
for (String traceid : result.keySet()) {
|
||||
warningTracingIds.add(new AlarmMessage(traceid, result
|
||||
.get(traceid)));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private String generateContent(Map parameter) throws IOException, TemplateException, SQLException {
|
||||
|
||||
if(t == null) {
|
||||
t = TemplateConfigurationUtil.getConfiguration().getTemplate("mail-template.ftl");
|
||||
}
|
||||
StringWriter out = new StringWriter();
|
||||
t.process(parameter, out);
|
||||
return out.getBuffer().toString();
|
||||
}
|
||||
|
||||
private int getWarningSize(Map<String, List<AlarmMessage>> warningMap) {
|
||||
int result = 0;
|
||||
for(Entry<String, List<AlarmMessage>> entry :warningMap.entrySet()) {
|
||||
if(entry.getValue() != null) {
|
||||
result += entry.getValue().size();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
private String generateContent(Map parameter) throws IOException,
|
||||
TemplateException, SQLException {
|
||||
|
||||
if (t == null) {
|
||||
t = TemplateConfigurationUtil.getConfiguration().getTemplate(
|
||||
"mail-template.ftl");
|
||||
}
|
||||
StringWriter out = new StringWriter();
|
||||
t.process(parameter, out);
|
||||
return out.getBuffer().toString();
|
||||
}
|
||||
|
||||
private int getExceptionSize(Map<String, List<AlarmMessage>> warningMap) {
|
||||
if (warningMap.containsKey(TYPE_OF_EXCEPTION_WARNING)) {
|
||||
return warningMap.get(TYPE_OF_EXCEPTION_WARNING).size();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int getWarningSize(Map<String, List<AlarmMessage>> warningMap) {
|
||||
int result = 0;
|
||||
for (Entry<String, List<AlarmMessage>> entry : warningMap.entrySet()) {
|
||||
if (entry.getValue() != null) {
|
||||
result += entry.getValue().size();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@
|
|||
color: #c75f3e;
|
||||
}
|
||||
.greetings {
|
||||
background:#f9f9f9;
|
||||
font-family:Microsoft YaHei,SimHei,Arial;
|
||||
|
||||
}
|
||||
|
|
@ -33,7 +32,6 @@
|
|||
padding:0;
|
||||
}
|
||||
#mainDiv {
|
||||
background:#f9f9f9;
|
||||
padding:25px;
|
||||
font-size:14px;
|
||||
line-height:25px;
|
||||
|
|
@ -92,7 +90,7 @@
|
|||
|
||||
<div id="mainDiv">
|
||||
<p class="greetings">Dear ${name!}:</p>
|
||||
<p class="greetings">    Our platform received alarm infomation between <b>${startDate!} </b>to<b> ${endDate!}</b> as follows:
|
||||
<p class="greetings">    Our platform collects alarm infomation between <b>${startDate!} </b>to<b> ${endDate!}</b> as follows:
|
||||
</p>
|
||||
<table id="dataTable" width="80%">
|
||||
<tr id="dataTableHead">
|
||||
|
|
|
|||
Loading…
Reference in New Issue