diff --git a/pkg/services/alerting/eval_context.go b/pkg/services/alerting/eval_context.go index 5a4b378ac28..17ed448bd2a 100644 --- a/pkg/services/alerting/eval_context.go +++ b/pkg/services/alerting/eval_context.go @@ -126,7 +126,7 @@ func (c *EvalContext) GetNewState() m.AlertStateType { } since := time.Now().Sub(c.Rule.LastStateChange) - if since > c.Rule.For { + if c.PrevAlertState == m.AlertStatePending && since > c.Rule.For { return m.AlertStateAlerting } diff --git a/pkg/services/alerting/eval_context_test.go b/pkg/services/alerting/eval_context_test.go index d9615ee4801..4c9b88f1881 100644 --- a/pkg/services/alerting/eval_context_test.go +++ b/pkg/services/alerting/eval_context_test.go @@ -66,8 +66,8 @@ func TestGetStateFromEvalContext(t *testing.T) { }, }, { - name: "ok -> alerting. since its been firing for more than FOR", - expected: models.AlertStateAlerting, + name: "ok -> pending. since it has to be pending longer than FOR and prev state is ok", + expected: models.AlertStatePending, applyFn: func(ec *EvalContext) { ec.PrevAlertState = models.AlertStateOK ec.Firing = true @@ -75,6 +75,16 @@ func TestGetStateFromEvalContext(t *testing.T) { ec.Rule.For = time.Minute * 2 }, }, + { + name: "pending -> alerting. since its been firing for more than FOR and prev state is pending", + expected: models.AlertStateAlerting, + applyFn: func(ec *EvalContext) { + ec.PrevAlertState = models.AlertStatePending + ec.Firing = true + ec.Rule.LastStateChange = time.Now().Add(-(time.Hour * 5)) + ec.Rule.For = time.Minute * 2 + }, + }, { name: "alerting -> alerting. should not update regardless of FOR", expected: models.AlertStateAlerting,