Skip to content

Commit 6cb4bdd

Browse files
committed
feat(alerting): adds a result list to alertresult
Since one query can return multiple series we might be interested in getting the result for each serie
1 parent a778249 commit 6cb4bdd

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

pkg/services/alerting/executor.go

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
)
1212

1313
var (
14-
descriptionFmt = "Actual value: %1.2f for %s"
14+
descriptionFmt = "Actual value: %1.2f for %s. "
1515
)
1616

1717
type ExecutorImpl struct {
@@ -95,30 +95,46 @@ func (e *ExecutorImpl) GetRequestForAlertRule(rule *AlertRule, datasource *m.Dat
9595
func (e *ExecutorImpl) evaluateRule(rule *AlertRule, series tsdb.TimeSeriesSlice) *AlertResult {
9696
e.log.Debug("Evaluating Alerting Rule", "seriesCount", len(series), "ruleName", rule.Name)
9797

98+
triggeredAlert := make([]*TriggeredAlert, 0)
99+
98100
for _, serie := range series {
99101
e.log.Debug("Evaluating series", "series", serie.Name)
100102
transformedValue, _ := rule.Transformer.Transform(serie)
101103

102104
critResult := evalCondition(rule.Critical, transformedValue)
103105
e.log.Debug("Alert execution Crit", "name", serie.Name, "transformedValue", transformedValue, "operator", rule.Critical.Operator, "level", rule.Critical.Level, "result", critResult)
104106
if critResult {
105-
return &AlertResult{
107+
triggeredAlert = append(triggeredAlert, &TriggeredAlert{
106108
State: alertstates.Critical,
107109
ActualValue: transformedValue,
108-
Description: fmt.Sprintf(descriptionFmt, transformedValue, serie.Name),
109-
}
110+
Name: serie.Name,
111+
})
110112
}
111113

112114
warnResult := evalCondition(rule.Warning, transformedValue)
113115
e.log.Debug("Alert execution Warn", "name", serie.Name, "transformedValue", transformedValue, "operator", rule.Warning.Operator, "level", rule.Warning.Level, "result", warnResult)
114116
if warnResult {
115-
return &AlertResult{
117+
triggeredAlert = append(triggeredAlert, &TriggeredAlert{
116118
State: alertstates.Warn,
117-
Description: fmt.Sprintf(descriptionFmt, transformedValue, serie.Name),
118119
ActualValue: transformedValue,
119-
}
120+
Name: serie.Name,
121+
})
122+
}
123+
}
124+
125+
executionState := alertstates.Ok
126+
description := ""
127+
for _, raised := range triggeredAlert {
128+
if raised.State == alertstates.Critical {
129+
executionState = alertstates.Critical
120130
}
131+
132+
if executionState != alertstates.Critical && raised.State == alertstates.Warn {
133+
executionState = alertstates.Warn
134+
}
135+
136+
description += fmt.Sprintf(descriptionFmt, raised.ActualValue, raised.Name)
121137
}
122138

123-
return &AlertResult{State: alertstates.Ok, Description: "Alert is OK!"}
139+
return &AlertResult{State: executionState, Description: description, TriggeredAlerts: triggeredAlert}
124140
}

pkg/services/alerting/models.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,19 @@ type AlertJob struct {
99
}
1010

1111
type AlertResult struct {
12-
State string
12+
State string
13+
ActualValue float64
14+
Duration float64
15+
TriggeredAlerts []*TriggeredAlert
16+
Description string
17+
Error error
18+
AlertJob *AlertJob
19+
}
20+
21+
type TriggeredAlert struct {
1322
ActualValue float64
14-
Duration float64
15-
Description string
16-
Error error
17-
AlertJob *AlertJob
23+
Name string
24+
State string
1825
}
1926

2027
type Level struct {

0 commit comments

Comments
 (0)