diff --git a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/conf/Config.java b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/conf/Config.java index c7fc064764ff7747f4ce38650121b5d302075128..b537a775ffe20d57dd2439e76d32b5f859f27f6e 100644 --- a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/conf/Config.java +++ b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/conf/Config.java @@ -14,12 +14,10 @@ public class Config { public static class ProcessThread { public static long THREAD_WAIT_INTERVAL = 60 * 1000L; -// public static long THREAD_WAIT_INTERVAL = 5 * 1000L; } public static class ZKPath { - public static String CONNECT_STR = "127.0.0.1:2181"; public static int CONNECT_TIMEOUT = 1000; @@ -49,13 +47,13 @@ public class Config { public static class DB { - public static String PASSWORD = "devrdbusr21"; + public static String PASSWORD = "root"; - public static String USER_NAME = "devrdbusr21"; + public static String USER_NAME = "root"; public static String DRIVER_CLASS = "com.mysql.jdbc.Driver"; - public static String URL = "jdbc:mysql://10.1.228.202:31316/test"; + public static String URL = "jdbc:mysql://127.0.0.1:3316/test"; public static int MAX_IDLE = 1; @@ -83,15 +81,28 @@ public class Config { public static int REDIS_MAX_TOTAL = 20; public static boolean ALARM_OFF_FLAG = false; - - public static String ALARM_TYPE_CONFIG_ID = "1004"; + } public static class MailSenderInfo { - public static String configId = "1000"; + + public static String MAIL_HOST = "mail.com"; + + public static String TRANSPORT_PROTOCOL = "smtp"; + + public static boolean SMTP_AUTH = true; + + public static boolean SSL_ENABLE = false; + + public static String USERNAME = "username"; + + public static String PASSWORD = "password"; + + public static String SENDER = "sender@mail.com"; + } public static class TemplateInfo { - public static String CONFIG_ID = "1001"; - } + public static String PORTAL_URL = "http://127.0.0.1:8080/skywalking"; + } } diff --git a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/model/AlarmType.java b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/model/AlarmType.java index 0d4e79c3e91ca578cef931d6b3dfb2d9351d28e1..3aae0745de7c0860372d2cde4bbf07b69526d97a 100644 --- a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/model/AlarmType.java +++ b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/model/AlarmType.java @@ -3,34 +3,45 @@ package com.a.eye.skywalking.alarm.model; public class AlarmType { - //告警类型名称 - private String type; - //告警标签 - private String label; - //告警描述 - private String desc; - - @Override - public String toString() { - return "AlarmType [type=" + type + ", label=" + label + ", desc=" + desc + "]"; - } - - public String getType() { - return type; - } - public void setType(String type) { - this.type = type; - } - public String getLabel() { - return label; - } - public void setLabel(String label) { - this.label = label; - } - public String getDesc() { - return desc; - } - public void setDesc(String desc) { - this.desc = desc; - } + //告警类型名称 + private String type; + //告警标签 + private String label; + //告警描述 + private String desc; + + public AlarmType(String type, String label, String desc) { + this.type = type; + this.label = label; + this.desc = desc; + } + + @Override + public String toString() { + return "AlarmType [type=" + type + ", label=" + label + ", desc=" + desc + "]"; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } } diff --git a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/model/ApplicationInfo.java b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/model/ApplicationInfo.java index be4d92b90490cf45e0e4a73ee62073006284a1a6..4b1d3960d14624624a818861c32aa3e9063b8695 100644 --- a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/model/ApplicationInfo.java +++ b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/model/ApplicationInfo.java @@ -2,7 +2,6 @@ package com.a.eye.skywalking.alarm.model; public class ApplicationInfo { private String appId; - private String configArgs; private String UId; private String toDoType; private String appCode; @@ -19,9 +18,6 @@ public class ApplicationInfo { this.appId = appId; } - public String getConfigArgs() { - return configArgs; - } public void setUId(String UId) { this.UId = UId; @@ -31,14 +27,6 @@ public class ApplicationInfo { return UId; } - public void setToDoType(String toDoType) { - this.toDoType = toDoType; - } - - public String getToDoType() { - return toDoType; - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/procesor/AlarmMessageProcessor.java b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/procesor/AlarmMessageProcessor.java index 75cc5a3ec740a945d60a3df0f374f199be1b10ac..cd83690c3d2ef948827e4a92adfd21021de6dbf0 100644 --- a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/procesor/AlarmMessageProcessor.java +++ b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/procesor/AlarmMessageProcessor.java @@ -18,9 +18,9 @@ import com.a.eye.skywalking.alarm.model.AlarmRule; import com.a.eye.skywalking.alarm.model.AlarmType; import com.a.eye.skywalking.alarm.model.ApplicationInfo; import com.a.eye.skywalking.alarm.model.MailInfo; +import com.a.eye.skywalking.alarm.util.MailSender; import com.a.eye.skywalking.alarm.util.RedisUtil; import com.a.eye.skywalking.alarm.util.TemplateConfigurationUtil; -import com.a.eye.skywalking.alarm.util.MailUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -35,189 +35,188 @@ import freemarker.template.TemplateException; public class AlarmMessageProcessor { - private static Logger logger = LogManager - .getLogger(AlarmMessageProcessor.class); - - private static final String TYPE_OF_EXCEPTION_WARNING = "default"; - - static List alarmTypeList; - static Template t; - - static { - alarmTypeList = AlarmTypeUtil.getAlarmTypeList(); - } - - 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_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(); - - 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); - } - } - } - - // 清理数据 - for (String toBeRemovedKey : warningMessageKeys) { - expiredAlarmMessage(toBeRemovedKey); - } - - // 修改-保存上次处理时间 - 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 warnings, "; - } - 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 RedisUtil.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 RedisUtil.Executable() { - @Override - public Long exe(Jedis client) { - return client.hset(userId, ruleId, - String.valueOf(currentFireMinuteTime)); - } - }); - } - - private void setAlarmMessages(final String key, - final Collection warningTracingIds) { - RedisUtil.execute(new RedisUtil.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; - } - }); - } - - 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; - } + private static Logger logger = LogManager + .getLogger(AlarmMessageProcessor.class); + + private static final String TYPE_OF_EXCEPTION_WARNING = "default"; + + static List alarmTypeList; + static Template t; + + static { + alarmTypeList = AlarmTypeUtil.getAlarmTypeList(); + } + + 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.getUserName() + "-" + + 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(); + + 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(); + MailSender.send(mailInfo.getMailTo(), + mailInfo.getMailCc(), mailContext, subjects); + } + } + } + + // 清理数据 + for (String toBeRemovedKey : warningMessageKeys) { + expiredAlarmMessage(toBeRemovedKey); + } + + // 修改-保存上次处理时间 + 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 warnings, "; + } + 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 RedisUtil.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 RedisUtil.Executable() { + @Override + public Long exe(Jedis client) { + return client.hset(userId, ruleId, + String.valueOf(currentFireMinuteTime)); + } + }); + } + + private void setAlarmMessages(final String key, + final Collection warningTracingIds) { + RedisUtil.execute(new RedisUtil.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; + } + }); + } + + 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/java/com/a/eye/skywalking/alarm/util/AlarmTypeUtil.java b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/AlarmTypeUtil.java index cc1a493b46563a86ae58a7116a4f3d37720f2888..16297999b54ec7631c00fe6353b57cf9185cb8a7 100644 --- a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/AlarmTypeUtil.java +++ b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/AlarmTypeUtil.java @@ -1,39 +1,35 @@ package com.a.eye.skywalking.alarm.util; -import java.util.ArrayList; -import java.util.List; - -import com.a.eye.skywalking.alarm.dao.SystemConfigDao; import com.a.eye.skywalking.alarm.model.AlarmType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.a.eye.skywalking.alarm.conf.Config; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import java.util.ArrayList; +import java.util.List; public class AlarmTypeUtil { - private static Logger logger = LogManager.getLogger(AlarmTypeUtil.class); - private static List alarmTypeList; - - static { - try { - String typeInfo = SystemConfigDao.getSystemConfig(Config.Alarm.ALARM_TYPE_CONFIG_ID); - alarmTypeList = new Gson().fromJson(typeInfo, new TypeToken>() { - }.getType()); - } catch (Exception e) { - logger.error("Failed to load alarm type info.", e); - System.exit(-1); - } - } - - public static List getAlarmTypeList() { - - if (alarmTypeList == null || alarmTypeList.isEmpty()) { - alarmTypeList = new ArrayList(); - } - - return alarmTypeList; - } + private static Logger logger = LogManager.getLogger(AlarmTypeUtil.class); + private static List alarmTypeList; + + static { + try { + alarmTypeList = new ArrayList(); + alarmTypeList.add(new AlarmType("default", "exception", "System Exception")); + alarmTypeList.add(new AlarmType("ExecuteTime-PossibleError", "remark", "Excution Time > 5s")); + alarmTypeList.add(new AlarmType("ExecuteTime-Warning", "remark", "Excution Time > 500ms")); + } catch (Exception e) { + logger.error("Failed to load alarm type info.", e); + System.exit(-1); + } + } + + public static List getAlarmTypeList() { + + if (alarmTypeList == null || alarmTypeList.isEmpty()) { + alarmTypeList = new ArrayList(); + } + + return alarmTypeList; + } } diff --git a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/MailUtil.java b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/MailSender.java similarity index 59% rename from skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/MailUtil.java rename to skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/MailSender.java index ca67d3feae1b8c35e510457d33da967af898a077..8e2d4f0612698e6a9723ddad99f0f45073d31ecd 100644 --- a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/MailUtil.java +++ b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/MailSender.java @@ -1,50 +1,55 @@ package com.a.eye.skywalking.alarm.util; -import java.util.Properties; - -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.NoSuchProviderException; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; - import com.a.eye.skywalking.alarm.conf.Config; -import com.a.eye.skywalking.alarm.dao.SystemConfigDao; +import com.sun.mail.util.MailSSLSocketFactory; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.google.gson.Gson; - -public class MailUtil { +import javax.mail.*; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.util.Properties; - private static Logger logger = LogManager.getLogger(MailUtil.class); +public class MailSender { - private static String mailSender; - private static Properties config; + private static Logger logger = LogManager.getLogger(MailSender.class); + private static MailSender sender = new MailSender(); + private String mailSender; + private Properties config; - static { + private MailSender() { try { - String senderInfo = SystemConfigDao.getSystemConfig(Config.MailSenderInfo.configId); - config = new Gson().fromJson(senderInfo, Properties.class); - mailSender = config.getProperty("mail.sender"); + config = new Properties(); + + config.setProperty("mail.transport.protocol", Config.MailSenderInfo.TRANSPORT_PROTOCOL); + config.setProperty("mail.smtp.auth", String.valueOf(Config.MailSenderInfo.SMTP_AUTH)); + config.setProperty("mail.smtp.socketFactory.port", "465"); + config.setProperty("mail.debug", "true"); + //config.setProperty("mail.smtp.ssl.enable", "true"); + if (Config.MailSenderInfo.SSL_ENABLE) { + MailSSLSocketFactory sf = new MailSSLSocketFactory(); + sf.setTrustAllHosts(true); + config.put("mail.smtp.ssl.enable", "true"); + config.put("mail.smtp.ssl.socketFactory", sf); + } } catch (Exception e) { logger.error("Failed to load mail sender info.", e); System.exit(-1); } + + mailSender = Config.MailSenderInfo.SENDER; } - public static void sendMail(String[] recipientAccounts, String[] ccList, String content, String title) { - Session session = Session.getInstance(config); + public static void send(String[] recipientAccounts, String[] ccList, String content, String title) { + Session session = Session.getInstance(sender.config); Transport ts = null; try { ts = session.getTransport(); - ts.connect(config.getProperty("mail.host"), config.getProperty("mail.username"), config.getProperty("mail.password")); + ts.connect(Config.MailSenderInfo.MAIL_HOST, Config.MailSenderInfo.USERNAME, Config.MailSenderInfo.PASSWORD); MimeMessage message = new MimeMessage(session); - message.setFrom(new InternetAddress(mailSender)); + message.setFrom(new InternetAddress(sender.mailSender)); InternetAddress[] recipientAccountArray = new InternetAddress[recipientAccounts.length]; for (int i = 0; i < recipientAccounts.length; i++) { recipientAccountArray[i] = new InternetAddress(recipientAccounts[i]); @@ -59,7 +64,6 @@ public class MailUtil { } message.setSubject(title); message.setContent(content, "text/html;charset=UTF-8"); - ts.sendMessage(message, message.getAllRecipients()); } catch (AddressException e) { diff --git a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/TemplateConfigurationUtil.java b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/TemplateConfigurationUtil.java index b58ad273923d7f942accfff5e8b2d51dade7f864..0a0c9cd54994981201a2d864ec5e7dcc100bea4c 100644 --- a/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/TemplateConfigurationUtil.java +++ b/skywalking-alarm/src/main/java/com/a/eye/skywalking/alarm/util/TemplateConfigurationUtil.java @@ -19,7 +19,7 @@ public class TemplateConfigurationUtil { if (cfg == null) { cfg = new Configuration(new Version("2.3.23")); cfg.setDefaultEncoding("UTF-8"); - cfg.setSharedVariable("portalAddr", SystemConfigDao.getSystemConfig(Config.TemplateInfo.CONFIG_ID)); + cfg.setSharedVariable("portalAddr", Config.TemplateInfo.PORTAL_URL); //获取资源路径 String classPath = cfg.getClass().getResource("/").getFile().toString(); diff --git a/skywalking-alarm/src/main/resources/config.properties b/skywalking-alarm/src/main/resources/config.properties index 40aa7de385ff4f8ed7af46db0b0cadd94420219f..16ad6fb36ec5ecb42900a898c48a775442bdbaa9 100644 --- a/skywalking-alarm/src/main/resources/config.properties +++ b/skywalking-alarm/src/main/resources/config.properties @@ -9,7 +9,7 @@ server.alarm_rule_activity_interval=3600000 processthread.thread_wait_interval=5000 #zookeeper连接地址 -zkpath.connect_str=10.1.241.18:29181,10.1.241.19:29181,10.1.241.20:29181 +zkpath.connect_str=127.0.0.1:2181 #zookeeper连接超时时间(单位:毫秒) zkpath.connect_timeout=1000 #zookeeper重试次数 @@ -35,11 +35,11 @@ coordinator.check_all_process_thread_interval=500 #数据库驱动类 db.driver_class=com.mysql.jdbc.Driver #数据库连接地址 -db.url=jdbc:mysql://10.1.241.20:31306/sw_db +db.url=jdbc:mysql://localhost:3307/test #数据库用户名 -db.user_name=sw_dbusr01 +db.user_name=root #数据库密码 -db.password=sw_dbusr01 +db.password=root #数据库连接最大空闲数 db.max_idle=1 #数据库最大连接数 @@ -48,7 +48,7 @@ db.max_pool_size=20 db.connect_timeout=10000 #告警信息存在的redis服务器地址 -alarm.redis_server=10.1.241.18:16379 +alarm.redis_server=127.0.0.1:6379 #redis的最大空闲连接数 alarm.redis_max_idle=20 #redis的最小空闲连接数 @@ -61,15 +61,21 @@ alarm.alarm_off_flag=false alarm.checker.turn_on_exception_checker=true #告警检查器:执行时间超时告警检查 alarm.checker.turn_on_execute_time_checker=true -#告警类型配置id -alarm.alarm_type_config_id=1004 #邮件发送配置id -mailsenderinfo.configid=1000 +mailsenderinfo.mail_host=smtp.qq.com +mailsenderinfo.transport_protocol=smtp +mailsenderinfo.smtp_auth=true +mailsenderinfo.smtp_start_ssl_enable=false +mailsenderinfo.username=skywalking +mailsenderinfo.password=skywalking +mailsenderinfo.sender=skywalking@foxmail.com +mailsenderinfo.ssl_enable=true #邮件模板配置id -templateinfo.config_id=1001 +templateinfo.portal_url=http://127.0.0.1:8080/skywalking #尝试获取轮询锁的周期(单位:毫秒) inspectthread.retry_get_inspect_lock_interval=10000 #尝试检查用户列表的周期(单位:毫秒) -inspectthread.check_user_list_interval=300000 \ No newline at end of file +inspectthread.check_user_list_interval=300000 + diff --git a/skywalking-commons/pom.xml b/skywalking-commons/pom.xml index 5214b6639b665b87e158ab1b15839c1622eb2b05..5e104e67db84ff12cafcc44033b246f4c792893a 100644 --- a/skywalking-commons/pom.xml +++ b/skywalking-commons/pom.xml @@ -14,6 +14,7 @@ skywalking-logging skywalking-registry skywalking-health-report + skywalking-util skywalking-commons diff --git a/skywalking-commons/skywalking-logging/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/api/ILog.java b/skywalking-commons/skywalking-logging/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/api/ILog.java index a6b1cdcd724b1672f4ad3e99bf136bda48f9597c..8a3a52a855046571c0245fbf0f18d7548ee1bbbf 100644 --- a/skywalking-commons/skywalking-logging/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/api/ILog.java +++ b/skywalking-commons/skywalking-logging/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/api/ILog.java @@ -27,4 +27,6 @@ public interface ILog { void debug(String format); void debug(String format, Object... arguments); + + void error(String format); } diff --git a/skywalking-commons/skywalking-logging/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/api/NoopLogger.java b/skywalking-commons/skywalking-logging/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/api/NoopLogger.java index c3922a296007f6346e6cb352b7c72120c212e268..684f98eebfca1ecc6b62de9548dcfb95e9b9bc44 100644 --- a/skywalking-commons/skywalking-logging/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/api/NoopLogger.java +++ b/skywalking-commons/skywalking-logging/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/api/NoopLogger.java @@ -65,4 +65,9 @@ public class NoopLogger implements ILog{ public void debug(String format, Object... arguments) { } + + @Override + public void error(String format) { + + } } diff --git a/skywalking-commons/skywalking-logging/skywalking-logging-impl-log4j2/src/main/java/com/a/eye/skywalking/logging/impl/log4j2/Log4j2Logger.java b/skywalking-commons/skywalking-logging/skywalking-logging-impl-log4j2/src/main/java/com/a/eye/skywalking/logging/impl/log4j2/Log4j2Logger.java index b8c68e3e513a8f317450c28802005daaee754200..ca8e2ec81ce89c5c7731132271979471ca2f4135 100644 --- a/skywalking-commons/skywalking-logging/skywalking-logging-impl-log4j2/src/main/java/com/a/eye/skywalking/logging/impl/log4j2/Log4j2Logger.java +++ b/skywalking-commons/skywalking-logging/skywalking-logging-impl-log4j2/src/main/java/com/a/eye/skywalking/logging/impl/log4j2/Log4j2Logger.java @@ -72,4 +72,9 @@ public class Log4j2Logger implements ILog { public void debug(String format, Object... arguments) { logger.debug(format, arguments); } + + @Override + public void error(String format) { + logger.error(format); + } } diff --git a/skywalking-commons/skywalking-util/pom.xml b/skywalking-commons/skywalking-util/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..2c4c4683067e1c49f4f8c83604df2a25988c7b5a --- /dev/null +++ b/skywalking-commons/skywalking-util/pom.xml @@ -0,0 +1,27 @@ + + + skywalking-commons + com.a.eye + 2.0-2016 + + 4.0.0 + + skywalking-util + jar + + skywalking-util + http://maven.apache.org + + + UTF-8 + + + + + com.a.eye + skywalking-network + ${project.version} + + + diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/util/StringUtil.java b/skywalking-commons/skywalking-util/src/main/java/com/a/eye/skywalking/util/StringUtil.java similarity index 100% rename from skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/util/StringUtil.java rename to skywalking-commons/skywalking-util/src/main/java/com/a/eye/skywalking/util/StringUtil.java diff --git a/skywalking-commons/skywalking-util/src/main/java/com/a/eye/skywalking/util/TraceIdUtil.java b/skywalking-commons/skywalking-util/src/main/java/com/a/eye/skywalking/util/TraceIdUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..8fbf9aaaf617765d8f8a60ab4f0c61132fd19d0e --- /dev/null +++ b/skywalking-commons/skywalking-util/src/main/java/com/a/eye/skywalking/util/TraceIdUtil.java @@ -0,0 +1,17 @@ +package com.a.eye.skywalking.util; + +import com.a.eye.skywalking.network.grpc.TraceId; + +/** + * Created by xin on 2016/12/8. + */ +public class TraceIdUtil { + public static String formatTraceId(TraceId traceId) { + StringBuilder traceIdBuilder = new StringBuilder(); + for (Long segment : traceId.getSegmentsList()) { + traceIdBuilder.append(segment).append("."); + } + + return traceIdBuilder.substring(0, traceIdBuilder.length() - 1).toString(); + } +} diff --git a/skywalking-network/src/main/proto/Spans.proto b/skywalking-network/src/main/proto/Spans.proto index 2734b677691ebc15a6aa88d5ba2535e9231686d7..23d3373e71150519c485b1a078bf99c65ee9d50a 100644 --- a/skywalking-network/src/main/proto/Spans.proto +++ b/skywalking-network/src/main/proto/Spans.proto @@ -41,18 +41,19 @@ message TraceId { message Span { TraceId traceId = 1; - string levelId = 2; // parentLevelId + "." + levelId - string viewpoint = 3; - int64 starttime = 4; - int64 cost = 5; - int32 statusCode = 6; - string exceptionStack = 7; - string spanTypeDesc = 8; - string callType = 9; - int32 spanType = 10; - string applicationCode = 11; - string username = 12; - string businessKey = 13; - int32 processNo = 14; - string address = 15; + string parentLevelId=2; + int32 levelId = 3; // parentLevelId + "." + levelId + string viewpoint = 4; + int64 startTime = 5; + int64 cost = 6; + int32 statusCode = 7; + string exceptionStack = 8; + string spanTypeDesc = 9; + string callType = 10; + int32 spanType = 11; + string applicationCode = 12; + string username = 13; + string businessKey = 14; + int32 processNo = 15; + string address = 16; } diff --git a/skywalking-sniffer/pom.xml b/skywalking-sniffer/pom.xml index a7484b0bb35f815d26985229b850b43bb99b0fa2..a04076de191c40e1f9b69876957887fc5c5f5d3a 100644 --- a/skywalking-sniffer/pom.xml +++ b/skywalking-sniffer/pom.xml @@ -23,5 +23,11 @@ 1.6 - + + + com.a.eye + skywalking-util + ${project.version} + + diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/logging/EasyLogger.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/logging/EasyLogger.java index c9bd7b47182f3a22f4a63af2f4880bb8cb712f22..1c71dcd81ed9a9a55acf7c714ac8ef2a8836a3cc 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/logging/EasyLogger.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/logging/EasyLogger.java @@ -119,4 +119,9 @@ public class EasyLogger implements com.a.eye.skywalking.logging.api.ILog { public void debug(String format, Object... arguments) { logger(DEBUG, replaceParam(format, arguments), null); } + + @Override + public void error(String format) { + logger(ERROR, format, null); + } } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/plugin/PluginCfg.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/plugin/PluginCfg.java index f2ea62ca875a53b8da5d541d9261f3b2c2bbb135..9822136eb1cd68754a8a4848b3fc74c2fa5f5eae 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/plugin/PluginCfg.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/plugin/PluginCfg.java @@ -1,5 +1,7 @@ package com.a.eye.skywalking.plugin; +import com.a.eye.skywalking.util.StringUtil; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -7,8 +9,6 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; -import com.a.eye.skywalking.util.StringUtil; - public class PluginCfg { public final static PluginCfg CFG = new PluginCfg(); diff --git a/skywalking-storage-center/skywalking-storage/pom.xml b/skywalking-storage-center/skywalking-storage/pom.xml index 74b97d62d4f965e36af195f65d5193a7c7da3f9d..c1d045393dc00cdda7fcc247e16b6f2a14f0472d 100644 --- a/skywalking-storage-center/skywalking-storage/pom.xml +++ b/skywalking-storage-center/skywalking-storage/pom.xml @@ -31,6 +31,16 @@ 1.17 test + + redis.clients + jedis + 2.8.0 + + + com.a.eye + skywalking-util + ${project.version} + diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/SpanAlarmHandler.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/SpanAlarmHandler.java index e392c8fbc6d991403f279af7fa35370592281391..f0f7b3cf31131b697f0dbe089cddda62f76ffc82 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/SpanAlarmHandler.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/SpanAlarmHandler.java @@ -1,9 +1,9 @@ package com.a.eye.skywalking.storage.alarm; -import com.a.eye.skywalking.network.grpc.AckSpan; import com.a.eye.skywalking.storage.alarm.checker.*; import com.a.eye.skywalking.storage.alarm.sender.AlarmMessageSenderFactory; import com.a.eye.skywalking.storage.data.spandata.AckSpanData; +import com.a.eye.skywalking.util.TraceIdUtil; import com.lmax.disruptor.EventHandler; import java.util.ArrayList; @@ -22,7 +22,7 @@ public class SpanAlarmHandler implements EventHandler { } private String generateAlarmMessageKey(AckSpanData span, FatalReason reason) { - return span.getUserName() + "-" + span.getApplicationCode() + "-" + (System.currentTimeMillis() / (10000 * 6)) + "-" + reason; + return span.getUserName() + "-" + span.getApplicationCode() + "-" + (System.currentTimeMillis() / (10000 * 6)) + reason.getDetail(); } @Override @@ -30,7 +30,7 @@ public class SpanAlarmHandler implements EventHandler { for (ISpanChecker spanChecker : spanCheckers) { CheckResult result = spanChecker.check(spanData); if (!result.isPassed()) { - AlarmMessageSenderFactory.getSender().send(generateAlarmMessageKey(spanData, result.getFatalReason()), result.getMessage()); + AlarmMessageSenderFactory.getSender().send(generateAlarmMessageKey(spanData, result.getFatalReason()), TraceIdUtil.formatTraceId(spanData.getTraceId()), result.getMessage()); } } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/checker/FatalReason.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/checker/FatalReason.java index 75cc1b4f44df32c820b3a215e36732e3234c1c86..a75f8a09973179c2fb166025795cd86a85249193 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/checker/FatalReason.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/checker/FatalReason.java @@ -4,5 +4,14 @@ package com.a.eye.skywalking.storage.alarm.checker; * Created by xin on 2016/12/8. */ public enum FatalReason { - EXCEPTION_ERROR, EXECUTE_TIME_ERROR, EXECUTE_TIME_WARNING; + EXCEPTION_ERROR(""), EXECUTE_TIME_ERROR("-ExecuteTime-PossibleError"), EXECUTE_TIME_WARNING("-ExecuteTime-Warning"); + private String detail; + + FatalReason(String detail) { + this.detail = detail; + } + + public String getDetail() { + return detail; + } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/sender/AlarmMessageSender.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/sender/AlarmMessageSender.java index 67740817c465da43ca63026fa60ea45260567652..20b734fb6fda5b953a4a4718f23cab5f3212eb74 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/sender/AlarmMessageSender.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/sender/AlarmMessageSender.java @@ -1,13 +1,30 @@ package com.a.eye.skywalking.storage.alarm.sender; +import com.a.eye.skywalking.logging.api.ILog; +import com.a.eye.skywalking.logging.api.LogManager; +import com.a.eye.skywalking.storage.config.Config; +import redis.clients.jedis.Jedis; + /** * Created by xin on 2016/12/8. */ public class AlarmMessageSender { + private ILog logger = LogManager.getLogger(AlarmMessageSender.class); - - public void send(String alarmKey, String message) { - + public void send(String alarmKey, String traceId, String message) { + Jedis jedis = null; + try { + jedis = AlarmRedisConnector.getJedis(); + jedis.hsetnx(alarmKey, traceId, message); + jedis.expire(alarmKey, Config.Alarm.ALARM_EXPIRE_SECONDS); + } catch (Exception e) { + AlarmRedisConnector.reportJedisFailure(); + logger.error("Failed to set data.", e); + } finally { + if (jedis != null) { + jedis.close(); + } + } } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/sender/AlarmRedisConnector.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/sender/AlarmRedisConnector.java new file mode 100644 index 0000000000000000000000000000000000000000..43e3228ad3d4c1d061c1763d48b344109a3ac9ab --- /dev/null +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/alarm/sender/AlarmRedisConnector.java @@ -0,0 +1,121 @@ +package com.a.eye.skywalking.storage.alarm.sender; + +import com.a.eye.skywalking.logging.api.ILog; +import com.a.eye.skywalking.logging.api.LogManager; +import com.a.eye.skywalking.storage.config.Config; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; + +import static com.a.eye.skywalking.health.report.HealthCollector.getCurrentHeathReading; +import static com.a.eye.skywalking.health.report.HeathReading.ERROR; +import static com.a.eye.skywalking.health.report.HeathReading.INFO; + +/** + * Created by xin on 2016/12/8. + */ +public class AlarmRedisConnector { + private static JedisPool jedisPool; + + static { + new RedisInspector().connect().start(); + } + + public static Jedis getJedis() { + if (Config.Alarm.ALARM_OFF_FLAG) { + return null; + } else { + return jedisPool.getResource(); + } + } + + public static void reportJedisFailure() { + RedisInspector.needConnectInit = true; + } + + private static class RedisInspector extends Thread { + private static ILog logger = LogManager.getLogger(RedisInspector.class); + + private static boolean needConnectInit = true; + + private String[] config; + + public RedisInspector() { + super("RedisInspectorThread"); + String redisServerConfig = Config.Alarm.REDIS_SERVER; + if (redisServerConfig == null || redisServerConfig.length() <= 0) { + logger.error("Redis server is not setting. Switch off alarm module. "); + Config.Alarm.ALARM_OFF_FLAG = true; + } 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; + } + } + this.setDaemon(true); + } + + private RedisInspector connect() { + if (jedisPool != null && !jedisPool.isClosed()) { + jedisPool.close(); + } + + GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig(); + jedisPool = new JedisPool(genericObjectPoolConfig, config[0], + Integer.valueOf(config[1])); + // Test connect redis. + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.get("ok"); + needConnectInit = false; + } catch (Exception e) { + logger.error("can't connect to redis[" + + Config.Alarm.REDIS_SERVER + "]", e); + } finally { + if (jedis != null) { + jedis.close(); + } + } + return this; + } + + @Override + public void run() { + if (Config.Alarm.ALARM_OFF_FLAG) + return; + + while (true) { + try { + if (needConnectInit) { + connect(); + } + + if (needConnectInit) { + getCurrentHeathReading(null).updateData(ERROR, "alarm redis connect failue."); + } else { + getCurrentHeathReading(null).updateData(INFO, "alarm redis connectted."); + } + } catch (Throwable t) { + logger.error("redis init connect failue", t); + } + + try { + Thread.sleep(Config.Alarm.ALARM_REDIS_INSPECTOR_INTERVAL); + } catch (InterruptedException e) { + logger.error("Failure sleep.", e); + } + } + } + + private 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; + } + } +} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/config/Config.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/config/Config.java index 7dc5e82beae236fb8b42f2de4deb4a60e4418c47..a759a103d409b03f688bf18912e597224a333e83 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/config/Config.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/config/Config.java @@ -44,6 +44,21 @@ public class Config { } public static class Alarm { + + public static String REDIS_SERVER = "127.0.0.1:6379"; + + public static boolean ALARM_OFF_FLAG = false; + public static int ALARM_EXCEPTION_STACK_LENGTH = 300; + + public static long ALARM_REDIS_INSPECTOR_INTERVAL = 100; + + public static int REDIS_MAX_IDLE = 10; + + public static int REDIS_MIN_IDLE = 1; + + public static int REDIS_MAX_TOTAL = 30; + + public static int ALARM_EXPIRE_SECONDS = 1000 * 60 * 90; } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexMetaInfo.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexMetaInfo.java index 3d68fc98fd868b18f95e30d1761e861b717f5ccf..e3887b7e77a77d2e506dc64457545850d613b13b 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexMetaInfo.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexMetaInfo.java @@ -52,7 +52,7 @@ public class IndexMetaInfo { } public String getLevelId() { - return spanData.getLevelId(); + return spanData.getTraceLevelId(); } public SpanType getSpanType() { diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/AckSpanData.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/AckSpanData.java index 9441a815b89c7aa4f9c0d8994d965c384a48f551..2ba3863b6269b1d5259a43a83a4a42cd9d292ead 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/AckSpanData.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/AckSpanData.java @@ -41,7 +41,7 @@ public class AckSpanData extends AbstractSpanData { } @Override - public String getLevelId() { + public String getTraceLevelId() { return buildLevelId(ackSpan.getParentLevel(), ackSpan.getLevelId()); } @@ -68,4 +68,8 @@ public class AckSpanData extends AbstractSpanData { public String getApplicationCode(){ return ackSpan.getApplicationCode(); } + + public TraceId getTraceId(){ + return ackSpan.getTraceId(); + } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/RequestSpanData.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/RequestSpanData.java index 0a9d81ff36f24a7e96ece1fcf3d96044afd2d1c9..5e91e8aa64852f8658af6f32eb3cce8b2faad2c7 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/RequestSpanData.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/RequestSpanData.java @@ -41,10 +41,20 @@ public class RequestSpanData extends AbstractSpanData { } @Override - public String getLevelId() { + public String getTraceLevelId() { return buildLevelId(requestSpan.getParentLevel(), requestSpan.getLevelId()); } + public String getParentLevelId(){ + return requestSpan.getParentLevel(); + } + + public int getLevelId(){ + return requestSpan.getLevelId(); + } + + + public String getAddress() { return requestSpan.getAddress(); } @@ -72,4 +82,8 @@ public class RequestSpanData extends AbstractSpanData { public int getType() { return requestSpan.getSpanType(); } + + public String getViewPoint(){ + return requestSpan.getViewPointId(); + } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/SpanData.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/SpanData.java index 3c02b10a10a27c67769abc56a92dd771a552d438..df39f84e28972479fce9ebf760be819878df2a81 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/SpanData.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/SpanData.java @@ -10,5 +10,5 @@ public interface SpanData { Long[] getTraceIdSegments(); - String getLevelId(); + String getTraceLevelId(); } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/SpanDataHelper.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/SpanDataHelper.java index c1f5cab033c14e7630a702ead60041ad32c88740..0756e37cd0941a3b5230b588c179107939905405 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/SpanDataHelper.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/spandata/SpanDataHelper.java @@ -10,7 +10,7 @@ import java.util.*; */ public class SpanDataHelper { public HashMap levelIdRequestSpanDataMapping = new HashMap(); - public HashMap levelIdAckSpanDataMapping = new HashMap(); + public HashMap levelIdAckSpanDataMapping = new HashMap(); private List data; @@ -21,9 +21,9 @@ public class SpanDataHelper { public SpanDataHelper category() { for (SpanData spanData : data) { if (spanData instanceof RequestSpanData) { - levelIdRequestSpanDataMapping.put(spanData.getLevelId(), (RequestSpanData) spanData); + levelIdRequestSpanDataMapping.put(spanData.getTraceLevelId(), (RequestSpanData) spanData); } else { - levelIdAckSpanDataMapping.put(spanData.getLevelId(), (AckSpanData) spanData); + levelIdAckSpanDataMapping.put(spanData.getTraceLevelId(), (AckSpanData) spanData); } } @@ -50,9 +50,10 @@ public class SpanDataHelper { builder = builder.setExceptionStack(ackSpanData.getExceptionStack()); } - builder = builder.setLevelId(requestSpanData.getLevelId()).setProcessNo(requestSpanData.getProcessNo()) - .setSpanType(requestSpanData.getType()).setStarttime(requestSpanData.getStartTime()) + builder = builder.setLevelId(requestSpanData.getLevelId()).setParentLevelId(requestSpanData.getParentLevelId()).setProcessNo(requestSpanData.getProcessNo()) + .setSpanType(requestSpanData.getType()).setStartTime(requestSpanData.getStartTime()) .setStatusCode(ackSpanData.getStatusCode()) + .setViewpoint(requestSpanData.getViewPoint()) .setTraceId(TraceId.newBuilder().addAllSegments(Arrays.asList(requestSpanData.getTraceIdSegments()))); return builder.build(); } diff --git a/skywalking-storage-center/skywalking-storage/src/test/java/com/a/eye/skywalking/storage/alarm/SpanAlarmHandlerTest.java b/skywalking-storage-center/skywalking-storage/src/test/java/com/a/eye/skywalking/storage/alarm/SpanAlarmHandlerTest.java index c2696e41fa63f1bd45d4da44cc2423e7b84d194b..328029ca424feacc2e475673d1616de5ab8aaa00 100644 --- a/skywalking-storage-center/skywalking-storage/src/test/java/com/a/eye/skywalking/storage/alarm/SpanAlarmHandlerTest.java +++ b/skywalking-storage-center/skywalking-storage/src/test/java/com/a/eye/skywalking/storage/alarm/SpanAlarmHandlerTest.java @@ -49,25 +49,25 @@ public class SpanAlarmHandlerTest { @Test public void testNormalSpan() throws Exception { handler.onEvent(normalAckSpan, 1, false); - verify(messageHandler, never()).send(any(), anyString()); + verify(messageHandler, never()).send(any(), any(), anyString()); } @Test public void testCostMuchSpan() throws Exception { handler.onEvent(costMuchSpan, 1, false); - verify(messageHandler, times(1)).send(any(), anyString()); + verify(messageHandler, times(1)).send(any(), any(), anyString()); } @Test public void testExceptionSpan() throws Exception { handler.onEvent(exceptionSpan, 1, false); - verify(messageHandler, times(1)).send(any(), anyString()); + verify(messageHandler, times(1)).send(any(), any(), anyString()); } @Test public void testCostTooMuchSpan() throws Exception { handler.onEvent(costTooMuchSpan, 1, false); - verify(messageHandler, times(1)).send(any(), anyString()); + verify(messageHandler, times(1)).send(any(), any(), anyString()); } } diff --git a/skywalking-webui/pom.xml b/skywalking-webui/pom.xml index 9c46d755f59095d1d3a194ca0d7d2d6df4dff2a0..be0972269b87747f04e5c6471ebab01dbcadc7e9 100644 --- a/skywalking-webui/pom.xml +++ b/skywalking-webui/pom.xml @@ -110,5 +110,11 @@ test + + com.a.eye + skywalking-util + ${project.version} + + diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/SearchClient.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/SearchClient.java index 249574ec6ca4aa97fb1b9bc20591ee851b0cf888..8b0d928bf7ddaed6ddd0df0ca985dc5a373858a3 100644 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/SearchClient.java +++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/SearchClient.java @@ -25,7 +25,7 @@ public class SearchClient { } public TraceNodesResult searchSpan(String traceId){ - String[] traceIdSegments = traceId.split("."); + String[] traceIdSegments = traceId.split("\\."); TraceNodesResult traceNodesResult = new TraceNodesResult(); if(traceIdSegments.length != 6){ return traceNodesResult; diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/AlarmRuleMaintainController.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/AlarmRuleMaintainController.java index cea13ab617d3b34266657c9ae1e3f27be1738015..27e59bef78e94061d1764e65739e66bbb2bebcaf 100644 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/AlarmRuleMaintainController.java +++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/AlarmRuleMaintainController.java @@ -1,12 +1,12 @@ package com.a.eye.skywalking.web.controller; +import com.a.eye.skywalking.util.StringUtil; import com.a.eye.skywalking.web.common.BaseController; import com.a.eye.skywalking.web.dao.inter.IAlarmRuleMaintainDao; import com.a.eye.skywalking.web.dto.AlarmRuleInfo; import com.a.eye.skywalking.web.dto.ConfigArgs; import com.a.eye.skywalking.web.dto.LoginUserInfo; import com.a.eye.skywalking.web.entity.AlarmRule; -import com.a.eye.skywalking.web.util.StringUtil; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import org.apache.logging.log4j.LogManager; @@ -97,7 +97,7 @@ public class AlarmRuleMaintainController extends BaseController { public String loadAlarmRule(@PathVariable("applicationId") String applicationId, HttpServletRequest request) { JSONObject jsonObject = new JSONObject(); try { - if (StringUtil.isBlank(applicationId)) { + if (StringUtil.isEmpty(applicationId)) { jsonObject.put("code", "500"); jsonObject.put("message", "application Id cannot be null"); return jsonObject.toJSONString(); diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/ApplicationConfigController.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/ApplicationConfigController.java index b0a76698d973ce5ef98d6f1c2f09f9f3ee44a029..1ac01560082289d3e34bd4ee84544135c4fbfc14 100644 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/ApplicationConfigController.java +++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/ApplicationConfigController.java @@ -1,11 +1,11 @@ package com.a.eye.skywalking.web.controller; +import com.a.eye.skywalking.util.StringUtil; import com.a.eye.skywalking.web.common.BaseController; import com.a.eye.skywalking.web.dao.inter.IAlarmRuleMaintainDao; import com.a.eye.skywalking.web.dao.inter.IApplicationsMaintainDao; import com.a.eye.skywalking.web.dto.ApplicationInfo; import com.a.eye.skywalking.web.dto.LoginUserInfo; -import com.a.eye.skywalking.web.util.StringUtil; import com.a.eye.skywalking.web.entity.AlarmRule; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; @@ -122,7 +122,7 @@ public class ApplicationConfigController extends BaseController { public String updateApplication(@PathVariable("applicationId") String applicationId, String appInfo, HttpServletRequest request) { JSONObject jsonObject = new JSONObject(); try { - if (StringUtil.isBlank(applicationId)) { + if (StringUtil.isEmpty(applicationId)) { jsonObject.put("code", "500"); jsonObject.put("message", "applicationId cannot be null"); return jsonObject.toJSONString(); @@ -203,7 +203,7 @@ public class ApplicationConfigController extends BaseController { public String loadApplication(@PathVariable("applicationId") String applicationId, HttpServletRequest request) { JSONObject jsonObject = new JSONObject(); try { - if (StringUtil.isBlank(applicationId)) { + if (StringUtil.isEmpty(applicationId)) { jsonObject.put("code", "500"); jsonObject.put("message", "applicationId cannot be null"); return jsonObject.toJSONString(); @@ -241,7 +241,7 @@ public class ApplicationConfigController extends BaseController { public String delApplication(@PathVariable("applicationId") String applicationId, HttpServletRequest request) { JSONObject jsonObject = new JSONObject(); try { - if (StringUtil.isBlank(applicationId)) { + if (StringUtil.isEmpty(applicationId)) { jsonObject.put("code", "500"); jsonObject.put("message", "applicationId cannot be null"); return jsonObject.toJSONString(); diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/SearchController.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/SearchController.java index 36c93ec1bbca3edeb3644425884bdb792cd792e1..f885b25f20d728d823df9f98add23615f45dc455 100644 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/SearchController.java +++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/SearchController.java @@ -3,13 +3,13 @@ package com.a.eye.skywalking.web.controller; import com.a.eye.skywalking.registry.RegistryCenterFactory; import com.a.eye.skywalking.registry.api.RegistryCenter; import com.a.eye.skywalking.registry.impl.zookeeper.ZookeeperConfig; +import com.a.eye.skywalking.util.StringUtil; import com.a.eye.skywalking.web.client.routing.RoutingServerWatcher; import com.a.eye.skywalking.web.common.BaseController; import com.a.eye.skywalking.web.config.Config; import com.a.eye.skywalking.web.config.ConfigInitializer; import com.a.eye.skywalking.web.dto.TraceTreeInfo; import com.a.eye.skywalking.web.service.inter.ITraceTreeService; -import com.a.eye.skywalking.web.util.StringUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.logging.log4j.LogManager; @@ -60,7 +60,7 @@ public class SearchController extends BaseController { public String loadTraceTree(@RequestParam("traceId") String traceId) { JSONObject jsonObject = new JSONObject(); try { - if (StringUtil.isBlank(traceId)) { + if (StringUtil.isEmpty(traceId)) { jsonObject.put("code", "400"); jsonObject.put("result", "TraceId cannot be null"); return jsonObject.toJSONString(); diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/UserMaintainController.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/UserMaintainController.java index 39fce58bec3d640a3c909dc9dc7d7a8d5760f056..c7d787acf91679d63a95b0a98d256e6cd1d35a4d 100644 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/UserMaintainController.java +++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/UserMaintainController.java @@ -1,12 +1,12 @@ package com.a.eye.skywalking.web.controller; +import com.a.eye.skywalking.util.StringUtil; import com.a.eye.skywalking.web.dao.inter.IUserMaintainDao; import com.a.eye.skywalking.web.dto.LoginUserInfo; import com.a.eye.skywalking.web.entity.UserInfo; import com.a.eye.skywalking.web.dto.SignInUserInfo; import com.a.eye.skywalking.web.common.BaseController; import com.a.eye.skywalking.web.util.Constants; -import com.a.eye.skywalking.web.util.StringUtil; import com.alibaba.fastjson.JSONObject; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -65,7 +65,7 @@ public class UserMaintainController extends BaseController { } private boolean validateUserInfo(UserInfo loginInfo, JSONObject result) { - if (StringUtil.isBlank(loginInfo.getUserName()) || StringUtil.isBlank(loginInfo.getPassword())) { + if (StringUtil.isEmpty(loginInfo.getUserName()) || StringUtil.isEmpty(loginInfo.getPassword())) { result.put("code", "400"); result.put("message", "Username or password is null"); return true; @@ -90,7 +90,7 @@ public class UserMaintainController extends BaseController { signInUserInfo.setRoleType(Constants.USR.ROLE_TYPE_USER); signInUserInfo.setSts(Constants.USR.STR_VAL_A); iUserMaintainDao.addUser(signInUserInfo); - if (StringUtil.isBlank(signInUserInfo.getUid())) { + if (StringUtil.isEmpty(signInUserInfo.getUid())) { result.put("code", "500"); result.put("message", "Failed to register user" + signInUserInfo.getUserName()); return result.toJSONString(); diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dao/impl/TraceNodeDao.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dao/impl/TraceNodeDao.java index c807a4bcbdfb4421fefba39c1c1976bd3d52e4e1..65098527f2b8868f8cb41ee8d2a39e4b0aaa324a 100644 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dao/impl/TraceNodeDao.java +++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dao/impl/TraceNodeDao.java @@ -1,21 +1,18 @@ package com.a.eye.skywalking.web.dao.impl; import com.a.eye.skywalking.network.grpc.Span; +import com.a.eye.skywalking.network.grpc.TraceId; +import com.a.eye.skywalking.util.StringUtil; import com.a.eye.skywalking.web.client.routing.SearchClient; import com.a.eye.skywalking.web.dao.inter.ITraceNodeDao; import com.a.eye.skywalking.web.dto.TraceNodeInfo; import com.a.eye.skywalking.web.dto.TraceNodesResult; import com.a.eye.skywalking.web.util.Constants; -import com.a.eye.skywalking.web.util.SortUtil; -import com.a.eye.skywalking.web.util.StringUtil; import org.springframework.stereotype.Repository; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Created by xin on 16-3-30. @@ -27,23 +24,36 @@ public class TraceNodeDao implements ITraceNodeDao { public TraceNodesResult queryTraceNodesByTraceId(String traceId) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { - List searchResult = new ArrayList<>(); + return new SearchClient().searchSpan(traceId); + } + + // TODO: 2016/12/10 + private Collection generateTestData() { + long startTime = System.currentTimeMillis(); + TraceId traceId = TraceId.newBuilder() + .addSegments(202016) + .addSegments(startTime) + .addSegments(-1) + .addSegments(1234) + .addSegments(1234) + .addSegments(1234).build(); + Span rootSpan = Span.newBuilder().setSpanType(1).setAddress("127.0.0.1/ascrutae").setApplicationCode("test") + .setCallType("S").setCost(200).setLevelId(0).setViewpoint("provider://127.0.0.1:20880/com.a.eye.dubbo.provider.GreetService.sayHello()") + .setProcessNo(19872) + .setTraceId(traceId).setStartTime(startTime) + .setStatusCode(0).setUsername("test").build(); + + Span span = Span.newBuilder().setSpanType(1).setAddress("127.0.0.1/ascrutae").setApplicationCode("test") + .setCallType("S").setCost(100).setParentLevelId("0").setLevelId(0).setViewpoint("consumer://127.0.0.1:20880/com.a.eye.dubbo.provider.GreetService.sayHello()") + .setProcessNo(19872) + .setTraceId(traceId).setStartTime(startTime + 50) + .setStatusCode(0).setUsername("test").build(); - SearchClient client = new SearchClient(); - TraceNodesResult result = client.searchSpan(traceId); - Map traceNodeInfoMap = new HashMap<>(); - searchResult.forEach((span -> { - traceNodeInfoMap.put(span.getLevelId(), new TraceNodeInfo(span)); - })); + List nodeInfos = new ArrayList<>(); + nodeInfos.add(new TraceNodeInfo(rootSpan)); + nodeInfos.add(new TraceNodeInfo(span)); - Map traceLogMap = new HashMap(); - Map rpcMap = new HashMap(); - traceNodeInfoMap.entrySet().forEach((entry -> { - SortUtil.addCurNodeTreeMapKey(traceLogMap, entry.getKey(), entry.getValue()); - })); - computeRPCInfo(rpcMap, traceLogMap); - result.setResult(traceLogMap.values()); - return result; + return nodeInfos; } private void computeRPCInfo(Map rpcMap, Map traceLogMap) { @@ -54,8 +64,8 @@ public class TraceNodeDao implements ITraceNodeDao { if (traceLogMap.containsKey(colId)) { TraceNodeInfo logVO = traceLogMap.get(colId); TraceNodeInfo serverLog = rpcVO.getValue(); - if (StringUtil.isBlank(logVO.getStatusCodeStr()) || Constants.STATUS_CODE_9.equals(logVO.getStatusCodeStr())) { - serverLog.setColId(colId); + if (StringUtil.isEmpty(logVO.getStatusCodeStr()) || Constants.STATUS_CODE_9.equals(logVO.getStatusCodeStr())) { + //serverLog.setColId(colId); traceLogMap.put(colId, serverLog); } else { TraceNodeInfo clientLog = traceLogMap.get(colId); @@ -63,9 +73,9 @@ public class TraceNodeDao implements ITraceNodeDao { clientLog.setViewPointId(serverLog.getViewPointId()); clientLog.setViewPointIdSub(serverLog.getViewPointIdSub()); clientLog.setAddress(serverLog.getAddress()); - if (StringUtil.isBlank(clientLog.getExceptionStack())) { + if (StringUtil.isEmpty(clientLog.getExceptionStack())) { clientLog.setExceptionStack(serverLog.getExceptionStack()); - }else{ + } else { clientLog.setServerExceptionStr(serverLog.getServerExceptionStr()); } } diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dto/FullSpan.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dto/FullSpan.java index dcc633d70e266be760a1af55d8106d526ccf27a6..df517b58be971a41367035fdecb961f9abd5a99a 100644 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dto/FullSpan.java +++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dto/FullSpan.java @@ -8,20 +8,21 @@ import com.a.eye.skywalking.network.grpc.Span; public class FullSpan { + private String parentLevelId; protected String traceId; - protected String levelId = ""; + protected int levelId; protected String viewPointId; protected String applicationId; protected String callType; - protected long cost; + protected long cost; protected String businessKey; protected String exceptionStack; protected byte statusCode = 0; protected String spanTypeDesc; protected String username; - protected long startDate; + protected long startDate; protected String spanType; - protected String address = ""; + protected String address = ""; protected String processNo = ""; public FullSpan() { @@ -35,12 +36,13 @@ public class FullSpan { } this.traceId = traceId.substring(0, traceId.length() - 1); this.levelId = span.getLevelId(); + this.parentLevelId = span.getParentLevelId(); this.applicationId = span.getApplicationCode(); this.callType = span.getCallType(); this.businessKey = span.getBusinessKey(); this.spanTypeDesc = span.getSpanTypeDesc(); this.username = span.getUsername(); - this.startDate = span.getStarttime(); + this.startDate = span.getStartTime(); this.viewPointId = span.getViewpoint(); this.spanType = span.getSpanType() + ""; this.address = span.getAddress(); @@ -48,14 +50,14 @@ public class FullSpan { this.cost = span.getCost(); this.exceptionStack = span.getExceptionStack(); - this.statusCode = (byte)span.getStatusCode(); + this.statusCode = (byte) span.getStatusCode(); } public String getTraceId() { return traceId; } - public String getLevelId() { + public int getLevelId() { return levelId; } @@ -119,7 +121,7 @@ public class FullSpan { return spanType; } - public void setLevelId(String levelId) { + public void setLevelId(int levelId) { this.levelId = levelId; } @@ -128,7 +130,7 @@ public class FullSpan { } public String getTraceLevelId() { - return getLevelId(); + return parentLevelId == null || parentLevelId.length() == 0? levelId + "" : parentLevelId + "." + levelId; } public void setViewPointId(String viewPointId) { @@ -142,4 +144,8 @@ public class FullSpan { public String getProcessNo() { return processNo; } + + public String getParentLevelId() { + return parentLevelId; + } } diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dto/TraceNodeInfo.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dto/TraceNodeInfo.java index b08a55a2731b0baba72c46faaaa8aa3b0a115972..766c2d5c340e928ffd53327859d4f2ce76b815ce 100644 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dto/TraceNodeInfo.java +++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dto/TraceNodeInfo.java @@ -1,8 +1,8 @@ package com.a.eye.skywalking.web.dto; import com.a.eye.skywalking.network.grpc.Span; +import com.a.eye.skywalking.util.StringUtil; import com.a.eye.skywalking.web.util.Constants; -import com.a.eye.skywalking.web.util.StringUtil; import java.util.ArrayList; import java.util.Iterator; @@ -40,17 +40,19 @@ public class TraceNodeInfo extends FullSpan { private String serverExceptionStr; + private String parentLevel; + public TraceNodeInfo() { } public TraceNodeInfo(Span span) { super(span); - this.colId = this.levelId; + this.colId = getTraceLevelId(); // 处理类型key-value String spanTypeStr = String.valueOf(span.getSpanTypeDesc()); - if (StringUtil.isBlank(spanTypeStr) || Constants.SPAN_TYPE_MAP.containsKey(spanTypeStr)) { + if (StringUtil.isEmpty(spanTypeStr) || Constants.SPAN_TYPE_MAP.containsKey(spanTypeStr)) { this.spanTypeStr = Constants.SPAN_TYPE_U; } this.spanTypeStr = spanTypeStr; @@ -63,7 +65,7 @@ public class TraceNodeInfo extends FullSpan { // 处理状态key-value String statusCodeStr = String.valueOf(getStatusCode()); - if (StringUtil.isBlank(statusCodeStr) || Constants.STATUS_CODE_MAP.containsKey(statusCodeStr)) { + if (StringUtil.isEmpty(statusCodeStr) || Constants.STATUS_CODE_MAP.containsKey(statusCodeStr)) { this.statusCodeStr = Constants.STATUS_CODE_9; } String statusCodeName = Constants.STATUS_CODE_MAP.get(statusCodeStr); @@ -71,7 +73,7 @@ public class TraceNodeInfo extends FullSpan { this.statusCodeName = statusCodeName; this.applicationIdStr = this.applicationId; - if (!StringUtil.isBlank(this.viewPointId) && this.viewPointId.length() > 60) { + if (!StringUtil.isEmpty(this.viewPointId) && this.viewPointId.length() > 60) { this.viewPointIdSub = this.viewPointId.substring(0, 30) + "..." + this.viewPointId .substring(this.viewPointId.length() - 30); } else { @@ -80,6 +82,8 @@ public class TraceNodeInfo extends FullSpan { this.addTimeLine(this.startDate, this.cost); this.endDate = this.startDate + this.cost; + + this.parentLevel = getParentLevelId(); } public String getColId() { @@ -167,4 +171,8 @@ public class TraceNodeInfo extends FullSpan { public void setExceptionStack(String exceptionStack) { this.exceptionStack = exceptionStack; } + + public String getParentLevel() { + return parentLevel; + } } diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/service/impl/TraceTreeService.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/service/impl/TraceTreeService.java index c116ab26abede11370ac5dd82d625e457349c31b..6af67e62a8839ad549393de512b6f63653604692 100644 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/service/impl/TraceTreeService.java +++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/service/impl/TraceTreeService.java @@ -51,7 +51,7 @@ public class TraceTreeService implements ITraceTreeService { if (endTime.get(0) < arg1.getEndDate()) { endTime.set(0, arg1.getEndDate()); } - return SpanLevelIdComparators.ascCompare(arg0.getColId(), arg1.getColId()); + return SpanLevelIdComparators.ascCompare(arg0.getTraceLevelId(), arg1.getTraceLevelId()); } }); @@ -63,10 +63,6 @@ public class TraceTreeService implements ITraceTreeService { traceTreeInfo.setHasBeenSpiltNodes(traceNodeInfoList.subList(0, subIndex)); traceTreeInfo.setBeginTime(traceNodeInfoList.get(0).getStartDate()); traceTreeInfo.setEndTime(endTime.get(0)); - if (traceNodeInfoList.get(0) != null) { - traceTreeInfo.fillCallChainTreeToken(ReplaceAddressUtil.replace(traceNodeInfoList.get(0).getViewPointId(), - traceNodeInfoList.get(0).getApplicationId())); - } } return traceTreeInfo; diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/util/SortUtil.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/util/SortUtil.java deleted file mode 100644 index 59572168dca5a0f8847d0ba4b27f60d74f6a2712..0000000000000000000000000000000000000000 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/util/SortUtil.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * - */ -package com.a.eye.skywalking.web.util; - -import com.a.eye.skywalking.web.dto.TimeLineEntry; -import com.a.eye.skywalking.web.dto.TraceNodeInfo; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.util.Map; - -public class SortUtil { - - private static Logger logger = LogManager.getLogger(SortUtil.class); - - public static void addCurNodeTreeMapKey(Map reMap, String colId, - TraceNodeInfo tmpEntry) { - reMap.put(colId, tmpEntry); - // 根据当前Id查找上级,如果不存在,插入空,再看上级,如果不存在还插入空,直到根"0" - while (colId.indexOf(Constants.VAL_SPLIT_CHAR) > -1) { - colId = colId.substring(0, colId.lastIndexOf(Constants.VAL_SPLIT_CHAR)); - if (!addParentNodeTreeMapKey(reMap, colId)) { - break; - } - } - } - - private static boolean addParentNodeTreeMapKey(Map reMap, String colId) { - if (reMap.containsKey(colId)) { - return false; - } else { - // 增加虚拟节点 - reMap.put(colId, addLostBuriedPointEntry(colId)); - // 根据当前Id查找上级,如果不存在,插入空,再看上级,如果不存在还插入空,直到根"0" - while (colId.indexOf(Constants.VAL_SPLIT_CHAR) > -1) { - colId = colId.substring(0, colId.lastIndexOf(Constants.VAL_SPLIT_CHAR)); - if (!addParentNodeTreeMapKey(reMap, colId)) { - break; - } - } - return false; - } - } - - /*** - * 补充丢失的链路信息 - * - * @param colId - * @return - */ - public static TraceNodeInfo addLostBuriedPointEntry(String colId) { - TraceNodeInfo result = new TraceNodeInfo(); - result.setColId(colId); - result.setLevelId(colId); - result.getTimeLineList().add(new TimeLineEntry()); - - // 其它默认值 - return result; - } -} diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/util/StringUtil.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/util/StringUtil.java deleted file mode 100644 index 574635aa644a04d320f1d0db6a467e136a61eb27..0000000000000000000000000000000000000000 --- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/util/StringUtil.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.a.eye.skywalking.web.util; - -public class StringUtil { - - public static boolean isBlank(String str) { - if (str == null || str.length() == 0) { - return true; - } - return false; - } -} diff --git a/skywalking-webui/src/main/resources/jdbc.properties b/skywalking-webui/src/main/resources/jdbc.properties index 2a1ebe9acf1d077aedd36cbde8370dade2982722..7b7ad2e459c540805cf451bcd3382c8db370960a 100644 --- a/skywalking-webui/src/main/resources/jdbc.properties +++ b/skywalking-webui/src/main/resources/jdbc.properties @@ -1,7 +1,7 @@ jdbc.driverClassName=com.mysql.jdbc.Driver -jdbc.url=jdbc:mysql://localhost:3306/sw_db -jdbc.username=sw_dbusr -jdbc.password=sw_dbusr +jdbc.url=jdbc:mysql://localhost:3307/test +jdbc.username=root +jdbc.password=root jdbc.maxTotal=200 jdbc.maxIdle=50 jdbc.maxWaitMillis=1000 diff --git a/skywalking-webui/src/main/sql/table.mysql b/skywalking-webui/src/main/sql/table.mysql index c00ea508dc2605de7a3482ee6a0c7b263731a5f1..3032598ee4898d0f0f6b762466b32255e6c4e0df 100644 --- a/skywalking-webui/src/main/sql/table.mysql +++ b/skywalking-webui/src/main/sql/table.mysql @@ -96,22 +96,3 @@ CREATE TABLE IF NOT EXISTS `exclude_rule` ( ENGINE = InnoDB; --- ----------------------------------------------------- --- Table `system_config` --- ----------------------------------------------------- -DROP TABLE IF EXISTS `system_config` ; - -CREATE TABLE IF NOT EXISTS `system_config` ( - `config_id` INT UNSIGNED NOT NULL, - `conf_key` VARCHAR(200) NOT NULL, - `conf_value` VARCHAR(500) NOT NULL, - `val_type` VARCHAR(45) NOT NULL, - `val_desc` VARCHAR(200) NULL, - `create_time` DATETIME NULL, - `sts` VARCHAR(2) NOT NULL, - `modify_time` DATETIME NULL, - PRIMARY KEY (`config_id`), - UNIQUE INDEX `conf_key_UNIQUE` (`conf_key` ASC)) -ENGINE = InnoDB; - -