diff --git a/skywalking-alarm/src/main/java/com/ai/cloud/skywalking/alarm/model/AlarmMessage.java b/skywalking-alarm/src/main/java/com/ai/cloud/skywalking/alarm/model/AlarmMessage.java new file mode 100644 index 000000000..34ca09ecf --- /dev/null +++ b/skywalking-alarm/src/main/java/com/ai/cloud/skywalking/alarm/model/AlarmMessage.java @@ -0,0 +1,21 @@ +package com.ai.cloud.skywalking.alarm.model; + +public class AlarmMessage { + private String traceid; + + private String exceptionMsg; + + public AlarmMessage(String traceid, String exceptionMsg) { + super(); + this.traceid = traceid; + this.exceptionMsg = exceptionMsg; + } + + public String getTraceid() { + return traceid; + } + + public String getExceptionMsg() { + return exceptionMsg; + } +} 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 c25c10252..9f0df9026 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 @@ -5,7 +5,6 @@ import java.io.StringReader; import java.io.StringWriter; import java.sql.SQLException; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; @@ -19,6 +18,7 @@ import org.apache.logging.log4j.Logger; import redis.clients.jedis.Jedis; +import com.ai.cloud.skywalking.alarm.model.AlarmMessage; import com.ai.cloud.skywalking.alarm.model.AlarmRule; import com.ai.cloud.skywalking.alarm.model.ApplicationInfo; import com.ai.cloud.skywalking.alarm.model.MailInfo; @@ -50,7 +50,7 @@ public class AlarmMessageProcessor { public void process(UserInfo userInfo, AlarmRule rule) throws TemplateException, IOException, SQLException { - Set warningTracingIds = new HashSet(); + Set warningObjects = new HashSet(); Set warningMessageKeys = new HashSet(); long currentFireMinuteTime = System.currentTimeMillis() / (10000 * 6); long warningTimeWindowSize = currentFireMinuteTime @@ -66,28 +66,26 @@ public class AlarmMessageProcessor { + (currentFireMinuteTime - period - 1); warningMessageKeys.add(alarmKey); - warningTracingIds.addAll(getAlarmMessages(alarmKey)); + setAlarmMessages(alarmKey, warningObjects); } } // 发送告警数据 - if (warningTracingIds.size() > 0) { + if (warningObjects.size() > 0) { if ("0".equals(rule.getTodoType())) { - logger.info("A total of {} alarm information needs to be sent {}", warningTracingIds.size(), + logger.info("A total of {} alarm information needs to be sent {}", warningObjects.size(), rule.getConfigArgsDescriber().getMailInfo().getMailTo()); // 发送邮件 - String subjects = generateSubject(warningTracingIds.size(), + String subjects = generateSubject(warningObjects.size(), rule.getPreviousFireTimeM(), currentFireMinuteTime); - Map parameter = new HashMap(); - parameter.put("warningTracingIds", warningTracingIds); + Map parameter = new HashMap(); + parameter.put("warningObjects", warningObjects); 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(/*rule - .getConfigArgsDescriber().getMailInfo() - .getMailTemp()*/mailTemplate, parameter); + String mailContext = generateContent(mailTemplate, parameter); if (mailContext.length() > 0) { MailInfo mailInfo = rule.getConfigArgsDescriber() .getMailInfo(); @@ -147,15 +145,17 @@ public class AlarmMessageProcessor { }); } - private Collection getAlarmMessages(final String key) { - return 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) { - return new ArrayList(); + if (result != null) { + for(String traceid : result.keySet()){ + warningTracingIds.add(new AlarmMessage(traceid, result.get(traceid))); + } } - return result.keySet(); + return null; } }); } diff --git a/skywalking-alarm/src/main/resources/mail-template_new.config b/skywalking-alarm/src/main/resources/mail-template_new.config index 184e7fb18..250cbbbfc 100644 --- a/skywalking-alarm/src/main/resources/mail-template_new.config +++ b/skywalking-alarm/src/main/resources/mail-template_new.config @@ -1 +1 @@ -template.default=templete1_welcome

\u5c0a\u656c\u7684SkyWalking\u7528\u6237\u60a8\u597d:

\u81ea${startDate!}\u8d77\uff0c\u5230${endDate!}\u6b62\uff0c\u5e73\u53f0\u63a5\u6536\u5230\u76d1\u63a7\u544a\u8b66\u4fe1\u606f\u5982\u4e0b\uff1a

<#if warningTracingIds??><#list warningTracingIds as traceId>

  • ${traceId!}
  • +template.default=templete1_welcome

    \u5c0a\u656c\u7684SkyWalking\u7528\u6237\u60a8\u597d:

    \u81ea${startDate!}\u8d77\uff0c\u5230${endDate!}\u6b62\uff0c\u5e73\u53f0\u63a5\u6536\u5230\u76d1\u63a7\u544a\u8b66\u4fe1\u606f\u5982\u4e0b\uff1a

    <#if warningTracingIds??><#list warningObjects as warningObject>

  • ${warningObject.traceId!}
    Stack: ${warningObject.exceptionMsg!}
  • diff --git a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/conf/Config.java b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/conf/Config.java index 3ae99a869..3ab8f3383 100644 --- a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/conf/Config.java +++ b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/conf/Config.java @@ -91,6 +91,8 @@ public class Config { public static class Alarm { public static int ALARM_EXPIRE_SECONDS = 1000 * 60 * 90; + + public static int ALARM_EXCEPTION_STACK_LENGTH = 300; public static String REDIS_SERVER = "127.0.0.1:6379"; diff --git a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/AlarmChain.java b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/AlarmChain.java index dcd3fc6f7..605d20269 100644 --- a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/AlarmChain.java +++ b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/AlarmChain.java @@ -14,6 +14,7 @@ import redis.clients.jedis.exceptions.JedisConnectionException; import java.util.List; import static com.ai.cloud.skywalking.reciever.conf.Config.Alarm.ALARM_EXPIRE_SECONDS; +import static com.ai.cloud.skywalking.reciever.conf.Config.Alarm.ALARM_EXCEPTION_STACK_LENGTH; public class AlarmChain implements IStorageChain { private static Logger logger = LogManager.getLogger(AlarmChain.class); @@ -58,7 +59,13 @@ public class AlarmChain implements IStorageChain { for (Span span : spans) { if (span.getStatusCode() != 1) continue; - saveAlarmMessage(generateAlarmKey(span), span.getTraceId()); + String exceptionStack = span.getExceptionStack(); + if(exceptionStack == null){ + exceptionStack = ""; + }else if(exceptionStack.length() > ALARM_EXCEPTION_STACK_LENGTH){ + exceptionStack = exceptionStack.substring(0, ALARM_EXCEPTION_STACK_LENGTH); + } + saveAlarmMessage(generateAlarmKey(span), span.getTraceId(), exceptionStack); } chain.doChain(spans); } @@ -68,7 +75,7 @@ public class AlarmChain implements IStorageChain { + (System.currentTimeMillis() / (10000 * 6)); } - private void saveAlarmMessage(String key, String traceId) { + private void saveAlarmMessage(String key, String traceId, String exceptionMsgOutline) { if (Config.Alarm.ALARM_OFF_FLAG) { return; } @@ -76,7 +83,7 @@ public class AlarmChain implements IStorageChain { Jedis jedis = null; try { jedis = jedisPool.getResource(); - jedis.hset(key, traceId, ""); + jedis.hsetnx(key, traceId, exceptionMsgOutline); jedis.expire(key, ALARM_EXPIRE_SECONDS); } catch (Exception e) { handleFailedToConnectRedisServerException(e);