From 20d356947c2bfaf461594bca451a43fe1b676a34 Mon Sep 17 00:00:00 2001 From: David Parrott Date: Wed, 26 May 2021 11:37:42 -0700 Subject: [PATCH] set state correctly and test (#34680) --- pkg/services/ngalert/state/cache.go | 1 - pkg/services/ngalert/state/manager.go | 2 +- pkg/services/ngalert/state/manager_test.go | 63 +++++++++++++++++++++- pkg/services/ngalert/state/state.go | 15 +++--- 4 files changed, 70 insertions(+), 11 deletions(-) diff --git a/pkg/services/ngalert/state/cache.go b/pkg/services/ngalert/state/cache.go index d48c19c5eab..6cee65a9680 100644 --- a/pkg/services/ngalert/state/cache.go +++ b/pkg/services/ngalert/state/cache.go @@ -68,7 +68,6 @@ func (c *cache) getOrCreate(alertRule *ngModels.AlertRule, result eval.Result) * OrgID: alertRule.OrgID, CacheId: id, Labels: lbs, - State: result.State, Annotations: annotations, EvaluationDuration: result.EvaluationDuration, } diff --git a/pkg/services/ngalert/state/manager.go b/pkg/services/ngalert/state/manager.go index c50d86f827d..0e4ab699c6e 100644 --- a/pkg/services/ngalert/state/manager.go +++ b/pkg/services/ngalert/state/manager.go @@ -83,7 +83,7 @@ func (st *Manager) setNextState(alertRule *ngModels.AlertRule, result eval.Resul st.Log.Debug("setting alert state", "uid", alertRule.UID) switch result.State { case eval.Normal: - currentState = resultNormal(currentState, result) + currentState = currentState.resultNormal(result) case eval.Alerting: currentState = currentState.resultAlerting(alertRule, result) case eval.Error: diff --git a/pkg/services/ngalert/state/manager_test.go b/pkg/services/ngalert/state/manager_test.go index 54e1fe98040..b020ac84910 100644 --- a/pkg/services/ngalert/state/manager_test.go +++ b/pkg/services/ngalert/state/manager_test.go @@ -346,7 +346,7 @@ func TestProcessEvalResults(t *testing.T) { }, }, { - desc: "normal -> pending when For is set but not exceeded", + desc: "normal -> pending when For is set but not exceeded and first result is normal", alertRule: &models.AlertRule{ OrgID: 1, Title: "test_title", @@ -406,6 +406,67 @@ func TestProcessEvalResults(t *testing.T) { }, }, }, + { + desc: "normal -> pending when For is set but not exceeded and first result is alerting", + alertRule: &models.AlertRule{ + OrgID: 1, + Title: "test_title", + UID: "test_alert_rule_uid_2", + NamespaceUID: "test_namespace_uid", + Annotations: map[string]string{"annotation": "test"}, + Labels: map[string]string{"label": "test"}, + IntervalSeconds: 10, + For: 1 * time.Minute, + }, + evalResults: []eval.Results{ + { + eval.Result{ + Instance: data.Labels{"instance_label": "test"}, + State: eval.Alerting, + EvaluatedAt: evaluationTime, + EvaluationDuration: evaluationDuration, + }, + }, + { + eval.Result{ + Instance: data.Labels{"instance_label": "test"}, + State: eval.Alerting, + EvaluatedAt: evaluationTime.Add(10 * time.Second), + EvaluationDuration: evaluationDuration, + }, + }, + }, + expectedStates: map[string]*state.State{ + `[["__alert_rule_namespace_uid__","test_namespace_uid"],["__alert_rule_uid__","test_alert_rule_uid_2"],["alertname","test_title"],["instance_label","test"],["label","test"]]`: { + AlertRuleUID: "test_alert_rule_uid_2", + OrgID: 1, + CacheId: `[["__alert_rule_namespace_uid__","test_namespace_uid"],["__alert_rule_uid__","test_alert_rule_uid_2"],["alertname","test_title"],["instance_label","test"],["label","test"]]`, + Labels: data.Labels{ + "__alert_rule_namespace_uid__": "test_namespace_uid", + "__alert_rule_uid__": "test_alert_rule_uid_2", + "alertname": "test_title", + "label": "test", + "instance_label": "test", + }, + State: eval.Pending, + Results: []state.Evaluation{ + { + EvaluationTime: evaluationTime, + EvaluationState: eval.Alerting, + }, + { + EvaluationTime: evaluationTime.Add(10 * time.Second), + EvaluationState: eval.Alerting, + }, + }, + StartsAt: evaluationTime, + EndsAt: evaluationTime.Add(1 * time.Minute), + LastEvaluationTime: evaluationTime.Add(10 * time.Second), + EvaluationDuration: evaluationDuration, + Annotations: map[string]string{"annotation": "test"}, + }, + }, + }, { desc: "normal -> alerting when result is NoData and NoDataState is alerting", alertRule: &models.AlertRule{ diff --git a/pkg/services/ngalert/state/state.go b/pkg/services/ngalert/state/state.go index f4ded8ba574..08c913e2db3 100644 --- a/pkg/services/ngalert/state/state.go +++ b/pkg/services/ngalert/state/state.go @@ -30,15 +30,14 @@ type Evaluation struct { EvaluationString string } -func resultNormal(alertState *State, result eval.Result) *State { - newState := alertState - if alertState.State != eval.Normal { - newState.EndsAt = result.EvaluatedAt - newState.StartsAt = result.EvaluatedAt +func (a *State) resultNormal(result eval.Result) *State { + if a.State != eval.Normal { + a.EndsAt = result.EvaluatedAt + a.StartsAt = result.EvaluatedAt } - newState.Error = result.Error // should be nil since state is not error - newState.State = eval.Normal - return newState + a.Error = result.Error // should be nil since state is not error + a.State = eval.Normal + return a } func (a *State) resultAlerting(alertRule *ngModels.AlertRule, result eval.Result) *State {