From 623de12e354c8f92fd49802a04bafe5970fba0e9 Mon Sep 17 00:00:00 2001 From: Yuri Tseretyan Date: Mon, 7 Nov 2022 09:35:29 -0500 Subject: [PATCH] Alerting: Create AlertInstanceKey in one place (#58278) * use method GetAlertInstanceKey * do not add key if error --- pkg/services/ngalert/state/manager.go | 21 ++++++++------------- pkg/services/ngalert/state/state.go | 9 +++++++++ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/pkg/services/ngalert/state/manager.go b/pkg/services/ngalert/state/manager.go index f3a00b573e9..77d7c34e0cc 100644 --- a/pkg/services/ngalert/state/manager.go +++ b/pkg/services/ngalert/state/manager.go @@ -291,18 +291,13 @@ func (st *Manager) saveAlertStates(ctx context.Context, logger log.Logger, state instances := make([]ngModels.AlertInstance, 0, len(states)) for _, s := range states { - labels := ngModels.InstanceLabels(s.Labels) - _, hash, err := labels.StringAndHash() + key, err := s.GetAlertInstanceKey() if err != nil { logger.Error("Failed to create a key for alert state to save it to database. The state will be ignored ", "cacheID", s.CacheID, "error", err) continue } fields := ngModels.AlertInstance{ - AlertInstanceKey: ngModels.AlertInstanceKey{ - RuleOrgID: s.OrgID, - RuleUID: s.AlertRuleUID, - LabelsHash: hash, - }, + AlertInstanceKey: key, Labels: ngModels.InstanceLabels(s.Labels), CurrentState: ngModels.InstanceStateType(s.State.State.String()), CurrentReason: s.StateReason, @@ -352,13 +347,13 @@ func (st *Manager) staleResultsHandler(ctx context.Context, evaluatedAt time.Tim if _, ok := states[s.CacheID]; !ok && stateIsStale(evaluatedAt, s.LastEvaluationTime, alertRule.IntervalSeconds) { logger.Info("Removing stale state entry", "cacheID", s.CacheID, "state", s.State, "reason", s.StateReason) st.cache.deleteEntry(s.OrgID, s.AlertRuleUID, s.CacheID) - ilbs := ngModels.InstanceLabels(s.Labels) - _, labelsHash, err := ilbs.StringAndHash() - if err != nil { - logger.Error("Unable to get labelsHash", "error", err.Error(), s.AlertRuleUID) - } - toDelete = append(toDelete, ngModels.AlertInstanceKey{RuleOrgID: s.OrgID, RuleUID: s.AlertRuleUID, LabelsHash: labelsHash}) + key, err := s.GetAlertInstanceKey() + if err != nil { + logger.Error("Unable to get alert instance key to delete it from database. Ignoring", "error", err.Error()) + } else { + toDelete = append(toDelete, key) + } if s.State == eval.Alerting { oldState := s.State diff --git a/pkg/services/ngalert/state/state.go b/pkg/services/ngalert/state/state.go index bfd4237f27e..8f59cc6761a 100644 --- a/pkg/services/ngalert/state/state.go +++ b/pkg/services/ngalert/state/state.go @@ -73,6 +73,15 @@ func (a *State) GetRuleKey() models.AlertRuleKey { } } +func (a *State) GetAlertInstanceKey() (models.AlertInstanceKey, error) { + instanceLabels := models.InstanceLabels(a.Labels) + _, labelsHash, err := instanceLabels.StringAndHash() + if err != nil { + return models.AlertInstanceKey{}, err + } + return models.AlertInstanceKey{RuleOrgID: a.OrgID, RuleUID: a.AlertRuleUID, LabelsHash: labelsHash}, nil +} + // StateTransition describes the transition from one state to another. type StateTransition struct { *State