From acdfd823cef938b5444d595363fd4ebcb2cf7159 Mon Sep 17 00:00:00 2001 From: wusheng Date: Mon, 25 Apr 2016 09:48:10 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E9=82=AE=E4=BB=B6=E5=BA=95?= =?UTF-8?q?=E8=89=B2=E7=9A=84=E9=97=AE=E9=A2=98=202.=E6=94=B9=E5=86=99?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=82=AE=E4=BB=B6=E6=A0=87=E9=A2=98=E8=A7=84?= =?UTF-8?q?=E5=88=99=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=88=B7=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E9=82=AE=E4=BB=B6=E5=88=A4=E6=96=AD=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E5=86=85=E5=AE=B9=E7=9A=84=E5=91=8A=E8=AD=A6=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E4=BC=98=E5=85=88=E6=98=BE=E7=A4=BA=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=BC=82=E5=B8=B8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/procesor/AlarmMessageProcessor.java | 289 ++++++++++-------- .../src/main/resources/mail-template.ftl | 4 +- 2 files changed, 158 insertions(+), 135 deletions(-) diff --git a/skywalking-alarm/src/main/java/com/ai/cloud/skywalking/alarm/procesor/AlarmMessageProcessor.java b/skywalking-alarm/src/main/java/com/ai/cloud/skywalking/alarm/procesor/AlarmMessageProcessor.java index 95628c18e2..97e6588a2a 100644 --- a/skywalking-alarm/src/main/java/com/ai/cloud/skywalking/alarm/procesor/AlarmMessageProcessor.java +++ b/skywalking-alarm/src/main/java/com/ai/cloud/skywalking/alarm/procesor/AlarmMessageProcessor.java @@ -36,164 +36,189 @@ import freemarker.template.TemplateException; public class AlarmMessageProcessor { - private static Logger logger = LogManager .getLogger(AlarmMessageProcessor.class); - - static List 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 alarmTypeList; + static Template t; - public void process(UserInfo userInfo, AlarmRule rule) throws TemplateException, IOException, SQLException { - - Map> warningMap = new HashMap>(); - Set warningMessageKeys = new HashSet(); - 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 warningObjects = new ArrayList(); - 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 parameter = new HashMap(); - - 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> warningMap = new HashMap>(); + Set warningMessageKeys = new HashSet(); + 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 warningObjects = new ArrayList(); + 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 parameter = new HashMap(); - 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() { + // 修改-保存上次处理时间 + 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() { @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() { + private void savePreviousFireTime(final String userId, final String ruleId, + final long currentFireMinuteTime) { + RedisUtil.execute(new Executable() { @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 warningTracingIds) { - RedisUtil.execute(new Executable() { + private void setAlarmMessages(final String key, + final Collection warningTracingIds) { + RedisUtil.execute(new Executable() { @Override public Collection exe(Jedis client) { Map 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> warningMap) { - int result = 0; - for(Entry> 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> warningMap) { + if (warningMap.containsKey(TYPE_OF_EXCEPTION_WARNING)) { + return warningMap.get(TYPE_OF_EXCEPTION_WARNING).size(); + } + return 0; + } + + private int getWarningSize(Map> warningMap) { + int result = 0; + for (Entry> entry : warningMap.entrySet()) { + if (entry.getValue() != null) { + result += entry.getValue().size(); + } + } + return result; + } } diff --git a/skywalking-alarm/src/main/resources/mail-template.ftl b/skywalking-alarm/src/main/resources/mail-template.ftl index ecdb54b26c..5353137e16 100644 --- a/skywalking-alarm/src/main/resources/mail-template.ftl +++ b/skywalking-alarm/src/main/resources/mail-template.ftl @@ -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 @@

Dear ${name!}:

-

    Our platform received alarm infomation between ${startDate!} to ${endDate!} as follows: +

    Our platform collects alarm infomation between ${startDate!} to ${endDate!} as follows: