From 67b44ad22a8e4bfc811cd270814e731922d520ff Mon Sep 17 00:00:00 2001 From: Yuri Tseretyan Date: Tue, 4 Mar 2025 10:05:41 -0500 Subject: [PATCH] Alerting: Fix state reason (#101530) --------- Signed-off-by: Yuri Tseretyan --- pkg/services/ngalert/state/state.go | 4 +- pkg/services/ngalert/state/state_test.go | 58 ++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/pkg/services/ngalert/state/state.go b/pkg/services/ngalert/state/state.go index 54694664cca..9c79b624179 100644 --- a/pkg/services/ngalert/state/state.go +++ b/pkg/services/ngalert/state/state.go @@ -832,9 +832,9 @@ func (a *State) transition(alertRule *models.AlertRule, result eval.Result, extr } func resultStateReason(result eval.Result, rule *models.AlertRule) string { - if rule.ExecErrState == models.KeepLastErrState || rule.NoDataState == models.KeepLast { + if result.State == eval.Error && rule.ExecErrState == models.KeepLastErrState || + result.State == eval.NoData && rule.NoDataState == models.KeepLast { return models.ConcatReasons(result.State.String(), models.StateReasonKeepLast) } - return result.State.String() } diff --git a/pkg/services/ngalert/state/state_test.go b/pkg/services/ngalert/state/state_test.go index 7216784a65c..8200696d385 100644 --- a/pkg/services/ngalert/state/state_test.go +++ b/pkg/services/ngalert/state/state_test.go @@ -1132,3 +1132,61 @@ func TestPatch(t *testing.T) { assert.EqualValues(t, orig.Annotations, state.Annotations) }) } + +func TestResultStateReason(t *testing.T) { + gen := ngmodels.RuleGen + tests := []struct { + name string + result eval.Result + rule *ngmodels.AlertRule + expected string + }{ + { + name: "Error state with KeepLast", + result: eval.Result{ + State: eval.Error, + }, + rule: gen.With(ngmodels.RuleMuts.WithErrorExecAs(ngmodels.KeepLastErrState)).GenerateRef(), + expected: "Error, KeepLast", + }, + { + name: "Error state without KeepLast", + result: eval.Result{ + State: eval.Error, + }, + rule: gen.With(ngmodels.RuleMuts.WithErrorExecAs(ngmodels.ErrorErrState)).GenerateRef(), + expected: "Error", + }, + { + name: "NoData state with KeepLast state", + result: eval.Result{ + State: eval.NoData, + }, + rule: gen.With(ngmodels.RuleMuts.WithNoDataExecAs(ngmodels.KeepLast)).GenerateRef(), + expected: "NoData, KeepLast", + }, + { + name: "NoData state without KeepLast", + result: eval.Result{ + State: eval.NoData, + }, + rule: gen.With(ngmodels.RuleMuts.WithNoDataExecAs(ngmodels.NoData)).GenerateRef(), + expected: "NoData", + }, + { + name: "Normal state", + result: eval.Result{ + State: eval.NoData, + }, + rule: gen.With(ngmodels.RuleMuts.WithErrorExecAs(ngmodels.ErrorErrState), ngmodels.RuleMuts.WithNoDataExecAs(ngmodels.NoData)).GenerateRef(), + expected: "NoData", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + result := resultStateReason(tc.result, tc.rule) + assert.Equal(t, tc.expected, result) + }) + } +}