diff --git a/alerter/src/main/java/com/usthe/alert/calculate/CalculateAlarm.java b/alerter/src/main/java/com/usthe/alert/calculate/CalculateAlarm.java index 2e0e597..5397794 100644 --- a/alerter/src/main/java/com/usthe/alert/calculate/CalculateAlarm.java +++ b/alerter/src/main/java/com/usthe/alert/calculate/CalculateAlarm.java @@ -20,6 +20,7 @@ import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * 根据告警定义规则和采集数据匹配计算告警 @@ -34,12 +35,14 @@ public class CalculateAlarm { private AlerterWorkerPool workerPool; private AlerterDataQueue dataQueue; private AlertDefineService alertDefineService; + private Map triggeredAlertMap; public CalculateAlarm (AlerterProperties properties, AlerterWorkerPool workerPool, AlerterDataQueue dataQueue, AlertDefineService alertDefineService) { this.workerPool = workerPool; this.dataQueue = dataQueue; this.alertDefineService = alertDefineService; + this.triggeredAlertMap = new ConcurrentHashMap<>(128); startCalculate(); } @@ -133,17 +136,34 @@ public class CalculateAlarm { Expression expression = AviatorEvaluator.compile(expr, true); Boolean match = (Boolean) expression.execute(fieldValueMap); if (match) { - // 阈值规则匹配,触发告警 - Alert alert = Alert.builder() - .monitorId(monitorId) - .priority(define.getPriority()) - .status((byte) 0) - .target(app + "." + metrics + "." + define.getField()) - .times(1) - // 模板中关键字匹配替换 - .content(AlertTemplateUtil.render(define.getTemplate(), fieldValueMap)) - .build(); - dataQueue.addAlertData(alert); + // 阈值规则匹配,判断已触发阈值次数,触发告警 + String monitorAlertKey = String.valueOf(monitorId) + define.getId(); + Alert triggeredAlert = triggeredAlertMap.get(monitorAlertKey); + if (triggeredAlert != null) { + int times = triggeredAlert.getTimes() + 1; + triggeredAlert.setTimes(times); + if (times >= define.getTimes()) { + triggeredAlertMap.remove(monitorAlertKey); + dataQueue.addAlertData(triggeredAlert); + } + } else { + int times = 1; + Alert alert = Alert.builder() + .monitorId(monitorId) + .alertDefineId(define.getId()) + .priority(define.getPriority()) + .status((byte) 0) + .target(app + "." + metrics + "." + define.getField()) + .times(times) + // 模板中关键字匹配替换 + .content(AlertTemplateUtil.render(define.getTemplate(), fieldValueMap)) + .build(); + if (times >= define.getTimes()) { + dataQueue.addAlertData(alert); + } else { + triggeredAlertMap.put(monitorAlertKey, alert); + } + } // 此优先级以下的阈值规则则忽略 break; } diff --git a/alerter/src/main/java/com/usthe/alert/controller/AlertsController.java b/alerter/src/main/java/com/usthe/alert/controller/AlertsController.java index 46930f8..6d04517 100644 --- a/alerter/src/main/java/com/usthe/alert/controller/AlertsController.java +++ b/alerter/src/main/java/com/usthe/alert/controller/AlertsController.java @@ -18,7 +18,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import javax.persistence.Id; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.Predicate; import java.util.HashSet; diff --git a/manager/src/main/java/com/usthe/manager/controller/AppController.java b/manager/src/main/java/com/usthe/manager/controller/AppController.java index 95b5c04..cae3875 100644 --- a/manager/src/main/java/com/usthe/manager/controller/AppController.java +++ b/manager/src/main/java/com/usthe/manager/controller/AppController.java @@ -48,8 +48,8 @@ public class AppController { if (lang == null || "".equals(lang)) { lang = "zh-CN"; } - lang = lang.equalsIgnoreCase("zh-cn")? "zh-CN" : lang; - lang = lang.equalsIgnoreCase("en-us")? "en-US" : lang; + lang = "zh-cn".equalsIgnoreCase(lang)? "zh-CN" : lang; + lang = "en-us".equalsIgnoreCase(lang)? "en-US" : lang; List appHierarchies = appService.getAllAppHierarchy(lang); return ResponseEntity.ok(new Message<>(appHierarchies)); } diff --git a/manager/src/main/java/com/usthe/manager/controller/I18nController.java b/manager/src/main/java/com/usthe/manager/controller/I18nController.java index bba7e9a..4f7fede 100644 --- a/manager/src/main/java/com/usthe/manager/controller/I18nController.java +++ b/manager/src/main/java/com/usthe/manager/controller/I18nController.java @@ -38,8 +38,8 @@ public class I18nController { if (lang == null || "".equals(lang)) { lang = "zh-CN"; } - lang = lang.equalsIgnoreCase("zh-cn")? "zh-CN" : lang; - lang = lang.equalsIgnoreCase("en-us")? "en-US" : lang; + lang = "zh-cn".equalsIgnoreCase(lang)? "zh-CN" : lang; + lang = "en-us".equalsIgnoreCase(lang)? "en-US" : lang; Map i18nResource = appService.getI18nResources(lang); return ResponseEntity.ok(new Message<>(i18nResource)); } diff --git a/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.html b/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.html index 4224f82..fc2aab2 100644 --- a/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.html +++ b/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.html @@ -44,7 +44,28 @@

状态

-

{{monitor?.status}}

+
+ + + 未监控 + + + + 正常监控 + + + + 监控不可用 + + + + 监控不可达 + + + + 监控已挂起 + +

采集间隔

diff --git a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html index 8782807..d87195e 100644 --- a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html +++ b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html @@ -50,7 +50,7 @@ 监控名称 监控状态 - 监控主机Host + 监控Host 监控类型 最新修改时间 操作