@@ -15,51 +15,54 @@ import (
15
15
)
16
16
17
17
// Metrics 包含 Prometheus、VictoriaMetrics 数据源
18
- func metrics (ctx * ctx.Context , datasourceId , datasourceType string , rule models.AlertRule ) []string {
18
+ func metrics (ctx * ctx.Context , datasourceId , datasourceType string , rule models.AlertRule ) ( []string , map [ string ] interface {}) {
19
19
pools := ctx .Redis .ProviderPools ()
20
20
var (
21
21
resQuery []provider.Metrics
22
22
externalLabels map [string ]interface {}
23
23
)
24
-
24
+ fingerPrintMetrics := make ( map [ string ] interface {})
25
25
switch datasourceType {
26
26
case provider .PrometheusDsProvider :
27
27
cli , err := pools .GetClient (datasourceId )
28
28
if err != nil {
29
29
logc .Errorf (ctx .Ctx , err .Error ())
30
- return nil
30
+ return nil , nil
31
31
}
32
32
33
33
resQuery , err = cli .(provider.PrometheusProvider ).Query (rule .PrometheusConfig .PromQL )
34
34
if err != nil {
35
35
logc .Error (ctx .Ctx , err .Error ())
36
- return nil
36
+ return nil , nil
37
37
}
38
38
39
39
externalLabels = cli .(provider.PrometheusProvider ).GetExternalLabels ()
40
40
case provider .VictoriaMetricsDsProvider :
41
41
cli , err := pools .GetClient (datasourceId )
42
42
if err != nil {
43
43
logc .Errorf (ctx .Ctx , err .Error ())
44
- return nil
44
+ return nil , nil
45
45
}
46
46
47
47
resQuery , err = cli .(provider.VictoriaMetricsProvider ).Query (rule .PrometheusConfig .PromQL )
48
48
if err != nil {
49
49
logc .Error (ctx .Ctx , err .Error ())
50
- return nil
50
+ return nil , nil
51
51
}
52
52
53
53
externalLabels = cli .(provider.VictoriaMetricsProvider ).GetExternalLabels ()
54
54
default :
55
55
logc .Errorf (ctx .Ctx , fmt .Sprintf ("Unsupported metrics type, type: %s" , datasourceType ))
56
- return nil
56
+ return nil , nil
57
57
}
58
58
59
59
if resQuery == nil {
60
- return nil
60
+ return nil , nil
61
61
}
62
62
63
+ // 获取已缓存事件指纹
64
+ fingerPrintMap := process .GetFingerPrint (ctx , rule .TenantId , rule .FaultCenterId , rule .RuleId )
65
+
63
66
var curFingerprints []string
64
67
for _ , v := range resQuery {
65
68
for _ , ruleExpr := range rule .PrometheusConfig .Rules {
@@ -69,36 +72,39 @@ func metrics(ctx *ctx.Context, datasourceId, datasourceType string, rule models.
69
72
continue
70
73
}
71
74
72
- event := func () * models.AlertCurEvent {
73
- event := process .BuildEvent (rule )
74
- event .DatasourceId = datasourceId
75
- event .Fingerprint = v .GetFingerprint ()
76
- event .Metric = v .GetMetric ()
77
- event .Metric ["severity" ] = ruleExpr .Severity
78
- for ek , ev := range externalLabels {
79
- event .Metric [ek ] = ev
80
- }
81
- event .Severity = ruleExpr .Severity
82
- event .Annotations = tools .ParserVariables (rule .PrometheusConfig .Annotations , event .Metric )
83
- event .SearchQL = rule .PrometheusConfig .PromQL
84
- curFingerprints = append (curFingerprints , event .Fingerprint )
85
-
86
- return & event
87
- }
88
-
89
75
option := models.EvalCondition {
90
76
Operator : operator ,
91
77
QueryValue : v .Value ,
92
78
ExpectedValue : value ,
93
79
}
94
80
81
+ event := process .BuildEvent (rule )
82
+ event .DatasourceId = datasourceId
83
+ event .Fingerprint = v .GetFingerprint ()
84
+ event .Metric = v .GetMetric ()
85
+ event .Metric ["severity" ] = ruleExpr .Severity
86
+ for ek , ev := range externalLabels {
87
+ event .Metric [ek ] = ev
88
+ }
89
+ event .Severity = ruleExpr .Severity
90
+ event .Annotations = tools .ParserVariables (rule .PrometheusConfig .Annotations , event .Metric )
91
+ event .SearchQL = rule .PrometheusConfig .PromQL
92
+
95
93
if process .EvalCondition (option ) {
96
- process .PushEventToFaultCenter (ctx , event ())
94
+ // 如果告警条件满足需要将告警事件指纹加入,不满足时应当直接跳过
95
+ curFingerprints = append (curFingerprints , event .Fingerprint )
96
+
97
+ process .PushEventToFaultCenter (ctx , & event )
98
+ } else {
99
+ // 仅更新已经触发事件的指纹对应指标
100
+ if _ , exist := fingerPrintMap [event .Fingerprint ]; exist {
101
+ fingerPrintMetrics [event .Fingerprint ] = event .Metric
102
+ }
97
103
}
98
104
}
99
105
}
100
106
101
- return curFingerprints
107
+ return curFingerprints , fingerPrintMetrics
102
108
}
103
109
104
110
// Logs 包含 AliSLS、Loki、ElasticSearch 数据源
0 commit comments