|
|
@@ -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,
|
|
|
}
|
|
|
}
|
|
|
}
|