|
|
@@ -2,8 +2,10 @@ package alerting
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ "fmt"
|
|
|
"testing"
|
|
|
|
|
|
+ "github.com/grafana/grafana/pkg/models"
|
|
|
. "github.com/smartystreets/goconvey/convey"
|
|
|
)
|
|
|
|
|
|
@@ -18,8 +20,8 @@ func (c *conditionStub) Eval(context *EvalContext) (*ConditionResult, error) {
|
|
|
return &ConditionResult{Firing: c.firing, EvalMatches: c.matches, Operator: c.operator, NoDataFound: c.noData}, nil
|
|
|
}
|
|
|
|
|
|
-func TestAlertingExecutor(t *testing.T) {
|
|
|
- Convey("Test alert execution", t, func() {
|
|
|
+func TestAlertingEvaluationHandler(t *testing.T) {
|
|
|
+ Convey("Test alert evaluation handler", t, func() {
|
|
|
handler := NewEvalHandler()
|
|
|
|
|
|
Convey("Show return triggered with single passing condition", func() {
|
|
|
@@ -164,5 +166,73 @@ func TestAlertingExecutor(t *testing.T) {
|
|
|
handler.Eval(context)
|
|
|
So(context.NoDataFound, ShouldBeTrue)
|
|
|
})
|
|
|
+
|
|
|
+ Convey("EvalHandler can replace alert state based for errors and no_data", func() {
|
|
|
+ ctx := NewEvalContext(context.TODO(), &Rule{Conditions: []Condition{&conditionStub{firing: true}}})
|
|
|
+ dummieError := fmt.Errorf("dummie error")
|
|
|
+ Convey("Should update alert state", func() {
|
|
|
+
|
|
|
+ Convey("ok -> alerting", func() {
|
|
|
+ ctx.PrevAlertState = models.AlertStateOK
|
|
|
+ ctx.Firing = true
|
|
|
+
|
|
|
+ So(handler.getNewState(ctx), ShouldEqual, models.AlertStateAlerting)
|
|
|
+ })
|
|
|
+
|
|
|
+ Convey("ok -> error(alerting)", func() {
|
|
|
+ ctx.PrevAlertState = models.AlertStateOK
|
|
|
+ ctx.Error = dummieError
|
|
|
+ ctx.Rule.ExecutionErrorState = models.ExecutionErrorSetAlerting
|
|
|
+
|
|
|
+ ctx.Rule.State = handler.getNewState(ctx)
|
|
|
+ So(ctx.Rule.State, ShouldEqual, models.AlertStateAlerting)
|
|
|
+ })
|
|
|
+
|
|
|
+ Convey("ok -> error(keep_last)", func() {
|
|
|
+ ctx.PrevAlertState = models.AlertStateOK
|
|
|
+ ctx.Error = dummieError
|
|
|
+ ctx.Rule.ExecutionErrorState = models.ExecutionErrorKeepState
|
|
|
+
|
|
|
+ ctx.Rule.State = handler.getNewState(ctx)
|
|
|
+ So(ctx.Rule.State, ShouldEqual, models.AlertStateOK)
|
|
|
+ })
|
|
|
+
|
|
|
+ Convey("pending -> error(keep_last)", func() {
|
|
|
+ ctx.PrevAlertState = models.AlertStatePending
|
|
|
+ ctx.Error = dummieError
|
|
|
+ ctx.Rule.ExecutionErrorState = models.ExecutionErrorKeepState
|
|
|
+
|
|
|
+ ctx.Rule.State = handler.getNewState(ctx)
|
|
|
+ So(ctx.Rule.State, ShouldEqual, models.AlertStatePending)
|
|
|
+ })
|
|
|
+
|
|
|
+ Convey("ok -> no_data(alerting)", func() {
|
|
|
+ ctx.PrevAlertState = models.AlertStateOK
|
|
|
+ ctx.Rule.NoDataState = models.NoDataSetAlerting
|
|
|
+ ctx.NoDataFound = true
|
|
|
+
|
|
|
+ ctx.Rule.State = handler.getNewState(ctx)
|
|
|
+ So(ctx.Rule.State, ShouldEqual, models.AlertStateAlerting)
|
|
|
+ })
|
|
|
+
|
|
|
+ Convey("ok -> no_data(keep_last)", func() {
|
|
|
+ ctx.PrevAlertState = models.AlertStateOK
|
|
|
+ ctx.Rule.NoDataState = models.NoDataKeepState
|
|
|
+ ctx.NoDataFound = true
|
|
|
+
|
|
|
+ ctx.Rule.State = handler.getNewState(ctx)
|
|
|
+ So(ctx.Rule.State, ShouldEqual, models.AlertStateOK)
|
|
|
+ })
|
|
|
+
|
|
|
+ Convey("pending -> no_data(keep_last)", func() {
|
|
|
+ ctx.PrevAlertState = models.AlertStatePending
|
|
|
+ ctx.Rule.NoDataState = models.NoDataKeepState
|
|
|
+ ctx.NoDataFound = true
|
|
|
+
|
|
|
+ ctx.Rule.State = handler.getNewState(ctx)
|
|
|
+ So(ctx.Rule.State, ShouldEqual, models.AlertStatePending)
|
|
|
+ })
|
|
|
+ })
|
|
|
+ })
|
|
|
})
|
|
|
}
|