feat(alerting): implement transform objects
This commit is contained in:
@@ -3,8 +3,6 @@ package alerting
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"math"
|
||||
|
||||
"github.com/grafana/grafana/pkg/bus"
|
||||
"github.com/grafana/grafana/pkg/log"
|
||||
m "github.com/grafana/grafana/pkg/models"
|
||||
@@ -26,63 +24,6 @@ func NewExecutor() *ExecutorImpl {
|
||||
}
|
||||
}
|
||||
|
||||
type compareFn func(float64, float64) bool
|
||||
type aggregationFn func(*tsdb.TimeSeries) float64
|
||||
|
||||
var operators = map[string]compareFn{
|
||||
">": func(num1, num2 float64) bool { return num1 > num2 },
|
||||
">=": func(num1, num2 float64) bool { return num1 >= num2 },
|
||||
"<": func(num1, num2 float64) bool { return num1 < num2 },
|
||||
"<=": func(num1, num2 float64) bool { return num1 <= num2 },
|
||||
"": func(num1, num2 float64) bool { return false },
|
||||
}
|
||||
var aggregator = map[string]aggregationFn{
|
||||
"avg": func(series *tsdb.TimeSeries) float64 {
|
||||
sum := float64(0)
|
||||
|
||||
for _, v := range series.Points {
|
||||
sum += v[0]
|
||||
}
|
||||
|
||||
return sum / float64(len(series.Points))
|
||||
},
|
||||
"sum": func(series *tsdb.TimeSeries) float64 {
|
||||
sum := float64(0)
|
||||
|
||||
for _, v := range series.Points {
|
||||
sum += v[0]
|
||||
}
|
||||
|
||||
return sum
|
||||
},
|
||||
"min": func(series *tsdb.TimeSeries) float64 {
|
||||
min := series.Points[0][0]
|
||||
|
||||
for _, v := range series.Points {
|
||||
if v[0] < min {
|
||||
min = v[0]
|
||||
}
|
||||
}
|
||||
|
||||
return min
|
||||
},
|
||||
"max": func(series *tsdb.TimeSeries) float64 {
|
||||
max := series.Points[0][0]
|
||||
|
||||
for _, v := range series.Points {
|
||||
if v[0] > max {
|
||||
max = v[0]
|
||||
}
|
||||
}
|
||||
|
||||
return max
|
||||
},
|
||||
"mean": func(series *tsdb.TimeSeries) float64 {
|
||||
midPosition := int64(math.Floor(float64(len(series.Points)) / float64(2)))
|
||||
return series.Points[midPosition][0]
|
||||
},
|
||||
}
|
||||
|
||||
func (e *ExecutorImpl) Execute(job *AlertJob, resultQueue chan *AlertResult) {
|
||||
timeSeries, err := e.executeQuery(job)
|
||||
if err != nil {
|
||||
@@ -156,32 +97,25 @@ func (e *ExecutorImpl) evaluateRule(rule *AlertRule, series tsdb.TimeSeriesSlice
|
||||
|
||||
for _, serie := range series {
|
||||
e.log.Debug("Evaluating series", "series", serie.Name)
|
||||
transformedValue, _ := rule.Transformer.Transform(serie)
|
||||
|
||||
if aggregator["avg"] == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
var aggValue = aggregator["avg"](serie)
|
||||
var critOperartor = operators[rule.Critical.Operator]
|
||||
var critResult = critOperartor(aggValue, rule.Critical.Level)
|
||||
|
||||
e.log.Debug("Alert execution Crit", "name", serie.Name, "aggValue", aggValue, "operator", rule.Critical.Operator, "level", rule.Critical.Level, "result", critResult)
|
||||
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)
|
||||
if critResult {
|
||||
return &AlertResult{
|
||||
State: alertstates.Critical,
|
||||
ActualValue: aggValue,
|
||||
Description: fmt.Sprintf(descriptionFmt, aggValue, serie.Name),
|
||||
ActualValue: transformedValue,
|
||||
Description: fmt.Sprintf(descriptionFmt, transformedValue, serie.Name),
|
||||
}
|
||||
}
|
||||
|
||||
var warnOperartor = operators[rule.Warning.Operator]
|
||||
var warnResult = warnOperartor(aggValue, rule.Warning.Level)
|
||||
e.log.Debug("Alert execution Warn", "name", serie.Name, "aggValue", aggValue, "operator", rule.Warning.Operator, "level", rule.Warning.Level, "result", warnResult)
|
||||
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)
|
||||
if warnResult {
|
||||
return &AlertResult{
|
||||
State: alertstates.Warn,
|
||||
Description: fmt.Sprintf(descriptionFmt, aggValue, serie.Name),
|
||||
ActualValue: aggValue,
|
||||
Description: fmt.Sprintf(descriptionFmt, transformedValue, serie.Name),
|
||||
ActualValue: transformedValue,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user