[alerter] 阈值触发次数后告警

This commit is contained in:
tomsun28
2021-12-15 09:07:01 +08:00
parent ebb257bbb6
commit 077f8b9d07
6 changed files with 58 additions and 18 deletions

View File

@@ -20,6 +20,7 @@ import org.springframework.context.annotation.Configuration;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* 根据告警定义规则和采集数据匹配计算告警 * 根据告警定义规则和采集数据匹配计算告警
@@ -34,12 +35,14 @@ public class CalculateAlarm {
private AlerterWorkerPool workerPool; private AlerterWorkerPool workerPool;
private AlerterDataQueue dataQueue; private AlerterDataQueue dataQueue;
private AlertDefineService alertDefineService; private AlertDefineService alertDefineService;
private Map<String, Alert> triggeredAlertMap;
public CalculateAlarm (AlerterProperties properties, AlerterWorkerPool workerPool, public CalculateAlarm (AlerterProperties properties, AlerterWorkerPool workerPool,
AlerterDataQueue dataQueue, AlertDefineService alertDefineService) { AlerterDataQueue dataQueue, AlertDefineService alertDefineService) {
this.workerPool = workerPool; this.workerPool = workerPool;
this.dataQueue = dataQueue; this.dataQueue = dataQueue;
this.alertDefineService = alertDefineService; this.alertDefineService = alertDefineService;
this.triggeredAlertMap = new ConcurrentHashMap<>(128);
startCalculate(); startCalculate();
} }
@@ -133,17 +136,34 @@ public class CalculateAlarm {
Expression expression = AviatorEvaluator.compile(expr, true); Expression expression = AviatorEvaluator.compile(expr, true);
Boolean match = (Boolean) expression.execute(fieldValueMap); Boolean match = (Boolean) expression.execute(fieldValueMap);
if (match) { if (match) {
// 阈值规则匹配,触发告警 // 阈值规则匹配,判断已触发阈值次数,触发告警
Alert alert = Alert.builder() String monitorAlertKey = String.valueOf(monitorId) + define.getId();
.monitorId(monitorId) Alert triggeredAlert = triggeredAlertMap.get(monitorAlertKey);
.priority(define.getPriority()) if (triggeredAlert != null) {
.status((byte) 0) int times = triggeredAlert.getTimes() + 1;
.target(app + "." + metrics + "." + define.getField()) triggeredAlert.setTimes(times);
.times(1) if (times >= define.getTimes()) {
// 模板中关键字匹配替换 triggeredAlertMap.remove(monitorAlertKey);
.content(AlertTemplateUtil.render(define.getTemplate(), fieldValueMap)) dataQueue.addAlertData(triggeredAlert);
.build(); }
dataQueue.addAlertData(alert); } 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; break;
} }

View File

@@ -18,7 +18,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.persistence.Id;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import java.util.HashSet; import java.util.HashSet;

View File

@@ -48,8 +48,8 @@ public class AppController {
if (lang == null || "".equals(lang)) { if (lang == null || "".equals(lang)) {
lang = "zh-CN"; lang = "zh-CN";
} }
lang = lang.equalsIgnoreCase("zh-cn")? "zh-CN" : lang; lang = "zh-cn".equalsIgnoreCase(lang)? "zh-CN" : lang;
lang = lang.equalsIgnoreCase("en-us")? "en-US" : lang; lang = "en-us".equalsIgnoreCase(lang)? "en-US" : lang;
List<Hierarchy> appHierarchies = appService.getAllAppHierarchy(lang); List<Hierarchy> appHierarchies = appService.getAllAppHierarchy(lang);
return ResponseEntity.ok(new Message<>(appHierarchies)); return ResponseEntity.ok(new Message<>(appHierarchies));
} }

View File

@@ -38,8 +38,8 @@ public class I18nController {
if (lang == null || "".equals(lang)) { if (lang == null || "".equals(lang)) {
lang = "zh-CN"; lang = "zh-CN";
} }
lang = lang.equalsIgnoreCase("zh-cn")? "zh-CN" : lang; lang = "zh-cn".equalsIgnoreCase(lang)? "zh-CN" : lang;
lang = lang.equalsIgnoreCase("en-us")? "en-US" : lang; lang = "en-us".equalsIgnoreCase(lang)? "en-US" : lang;
Map<String, String> i18nResource = appService.getI18nResources(lang); Map<String, String> i18nResource = appService.getI18nResources(lang);
return ResponseEntity.ok(new Message<>(i18nResource)); return ResponseEntity.ok(new Message<>(i18nResource));
} }

View File

@@ -44,7 +44,28 @@
</div> </div>
<div nz-row nzGutter="16"> <div nz-row nzGutter="16">
<div nz-col nzSpan="8"><p style="text-align: right">状态</p></div> <div nz-col nzSpan="8"><p style="text-align: right">状态</p></div>
<div nz-col nzSpan="16"><p style="text-align: left">{{monitor?.status}}</p></div> <div nz-col nzSpan="16">
<nz-tag *ngIf="monitor?.status == 0" nzColor="default">
<i nz-icon nzType="robot" nzTheme="outline"></i>
<span>未监控</span>
</nz-tag>
<nz-tag *ngIf="monitor?.status == 1" nzColor="success">
<i nz-icon nzType="smile" nzTheme="outline"></i>
<span>正常监控</span>
</nz-tag>
<nz-tag *ngIf="monitor?.status == 2" nzColor="warning">
<i nz-icon nzType="meh" nzTheme="outline"></i>
<span>监控不可用</span>
</nz-tag>
<nz-tag *ngIf="monitor?.status == 3" nzColor="error">
<i nz-icon nzType="frown" nzTheme="outline"></i>
<span>监控不可达</span>
</nz-tag>
<nz-tag *ngIf="monitor?.status == 4" nzColor="default">
<i nz-icon nzType="sync"></i>
<span>监控已挂起</span>
</nz-tag>
</div>
</div> </div>
<div nz-row nzGutter="16"> <div nz-row nzGutter="16">
<div nz-col nzSpan="8"><p style="text-align: right">采集间隔</p></div> <div nz-col nzSpan="8"><p style="text-align: right">采集间隔</p></div>

View File

@@ -50,7 +50,7 @@
<th nzAlign="center" nzLeft nzWidth="60px" [(nzChecked)]="checkedAll" (nzCheckedChange)="onAllChecked($event)"></th> <th nzAlign="center" nzLeft nzWidth="60px" [(nzChecked)]="checkedAll" (nzCheckedChange)="onAllChecked($event)"></th>
<th nzAlign="center">监控名称</th> <th nzAlign="center">监控名称</th>
<th nzAlign="center">监控状态</th> <th nzAlign="center">监控状态</th>
<th nzAlign="center">监控主机Host</th> <th nzAlign="center">监控Host</th>
<th nzAlign="center">监控类型</th> <th nzAlign="center">监控类型</th>
<th nzAlign="center">最新修改时间</th> <th nzAlign="center">最新修改时间</th>
<th nzAlign="center" nzRight>操作</th> <th nzAlign="center" nzRight>操作</th>