From 9d928a3ac6418fc04961f06e105e22b341839431 Mon Sep 17 00:00:00 2001 From: Yuri Tseretyan Date: Mon, 17 Nov 2025 13:43:29 -0500 Subject: [PATCH] Alerting: Remove stale states in two steps (#114044) --- pkg/services/ngalert/state/manager.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/pkg/services/ngalert/state/manager.go b/pkg/services/ngalert/state/manager.go index a968921de0a..401eeb079cf 100644 --- a/pkg/services/ngalert/state/manager.go +++ b/pkg/services/ngalert/state/manager.go @@ -532,7 +532,7 @@ func (st *Manager) processMissingSeriesStates(logger log.Logger, evaluatedAt tim missingTransitions := []StateTransition{} var staleStatesCount int64 = 0 - st.cache.deleteRuleStates(alertRule.GetKey(), func(s *State) bool { + toDelete := func(s *State) bool { // We need only states that are not present in the current evaluation, so // skip the state if it was just evaluated. if s.LastEvaluationTime.Equal(evaluatedAt) { @@ -584,6 +584,20 @@ func (st *Manager) processMissingSeriesStates(logger log.Logger, evaluatedAt tim missingTransitions = append(missingTransitions, record) return isStale + } + + states := st.cache.getStatesForRuleUID(alertRule.OrgID, alertRule.UID) + + toDeleteStates := map[data.Fingerprint]struct{}{} + for _, s := range states { + if toDelete(s) { + toDeleteStates[s.CacheID] = struct{}{} + } + } + + st.cache.deleteRuleStates(alertRule.GetKey(), func(s *State) bool { + _, ok := toDeleteStates[s.CacheID] + return ok }) return missingTransitions, staleStatesCount