mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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
This commit is contained in:
parent
a77824939f
commit
6cb4bdd6cb
@ -11,7 +11,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
descriptionFmt = "Actual value: %1.2f for %s"
|
descriptionFmt = "Actual value: %1.2f for %s. "
|
||||||
)
|
)
|
||||||
|
|
||||||
type ExecutorImpl struct {
|
type ExecutorImpl struct {
|
||||||
@ -95,6 +95,8 @@ func (e *ExecutorImpl) GetRequestForAlertRule(rule *AlertRule, datasource *m.Dat
|
|||||||
func (e *ExecutorImpl) evaluateRule(rule *AlertRule, series tsdb.TimeSeriesSlice) *AlertResult {
|
func (e *ExecutorImpl) evaluateRule(rule *AlertRule, series tsdb.TimeSeriesSlice) *AlertResult {
|
||||||
e.log.Debug("Evaluating Alerting Rule", "seriesCount", len(series), "ruleName", rule.Name)
|
e.log.Debug("Evaluating Alerting Rule", "seriesCount", len(series), "ruleName", rule.Name)
|
||||||
|
|
||||||
|
triggeredAlert := make([]*TriggeredAlert, 0)
|
||||||
|
|
||||||
for _, serie := range series {
|
for _, serie := range series {
|
||||||
e.log.Debug("Evaluating series", "series", serie.Name)
|
e.log.Debug("Evaluating series", "series", serie.Name)
|
||||||
transformedValue, _ := rule.Transformer.Transform(serie)
|
transformedValue, _ := rule.Transformer.Transform(serie)
|
||||||
@ -102,23 +104,37 @@ func (e *ExecutorImpl) evaluateRule(rule *AlertRule, series tsdb.TimeSeriesSlice
|
|||||||
critResult := evalCondition(rule.Critical, transformedValue)
|
critResult := evalCondition(rule.Critical, transformedValue)
|
||||||
e.log.Debug("Alert execution Crit", "name", serie.Name, "transformedValue", transformedValue, "operator", rule.Critical.Operator, "level", rule.Critical.Level, "result", critResult)
|
e.log.Debug("Alert execution Crit", "name", serie.Name, "transformedValue", transformedValue, "operator", rule.Critical.Operator, "level", rule.Critical.Level, "result", critResult)
|
||||||
if critResult {
|
if critResult {
|
||||||
return &AlertResult{
|
triggeredAlert = append(triggeredAlert, &TriggeredAlert{
|
||||||
State: alertstates.Critical,
|
State: alertstates.Critical,
|
||||||
ActualValue: transformedValue,
|
ActualValue: transformedValue,
|
||||||
Description: fmt.Sprintf(descriptionFmt, transformedValue, serie.Name),
|
Name: serie.Name,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
warnResult := evalCondition(rule.Warning, transformedValue)
|
warnResult := evalCondition(rule.Warning, transformedValue)
|
||||||
e.log.Debug("Alert execution Warn", "name", serie.Name, "transformedValue", transformedValue, "operator", rule.Warning.Operator, "level", rule.Warning.Level, "result", warnResult)
|
e.log.Debug("Alert execution Warn", "name", serie.Name, "transformedValue", transformedValue, "operator", rule.Warning.Operator, "level", rule.Warning.Level, "result", warnResult)
|
||||||
if warnResult {
|
if warnResult {
|
||||||
return &AlertResult{
|
triggeredAlert = append(triggeredAlert, &TriggeredAlert{
|
||||||
State: alertstates.Warn,
|
State: alertstates.Warn,
|
||||||
Description: fmt.Sprintf(descriptionFmt, transformedValue, serie.Name),
|
|
||||||
ActualValue: transformedValue,
|
ActualValue: transformedValue,
|
||||||
}
|
Name: serie.Name,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return &AlertResult{State: alertstates.Ok, Description: "Alert is OK!"}
|
executionState := alertstates.Ok
|
||||||
|
description := ""
|
||||||
|
for _, raised := range triggeredAlert {
|
||||||
|
if raised.State == alertstates.Critical {
|
||||||
|
executionState = alertstates.Critical
|
||||||
|
}
|
||||||
|
|
||||||
|
if executionState != alertstates.Critical && raised.State == alertstates.Warn {
|
||||||
|
executionState = alertstates.Warn
|
||||||
|
}
|
||||||
|
|
||||||
|
description += fmt.Sprintf(descriptionFmt, raised.ActualValue, raised.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &AlertResult{State: executionState, Description: description, TriggeredAlerts: triggeredAlert}
|
||||||
}
|
}
|
||||||
|
@ -12,11 +12,18 @@ type AlertResult struct {
|
|||||||
State string
|
State string
|
||||||
ActualValue float64
|
ActualValue float64
|
||||||
Duration float64
|
Duration float64
|
||||||
|
TriggeredAlerts []*TriggeredAlert
|
||||||
Description string
|
Description string
|
||||||
Error error
|
Error error
|
||||||
AlertJob *AlertJob
|
AlertJob *AlertJob
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TriggeredAlert struct {
|
||||||
|
ActualValue float64
|
||||||
|
Name string
|
||||||
|
State string
|
||||||
|
}
|
||||||
|
|
||||||
type Level struct {
|
type Level struct {
|
||||||
Operator string
|
Operator string
|
||||||
Level float64
|
Level float64
|
||||||
|
Loading…
Reference in New Issue
Block a user