Alerting: Delete state from the database on reset (#53919)
* make ResetStatesByRuleUID return states * delete rule states when reset * rule eval routine to clean up the state only when rule is deleted
This commit is contained in:
@@ -180,11 +180,20 @@ func (c *cache) getStatesForRuleUID(orgID int64, alertRuleUID string) []*State {
|
||||
return ruleStates
|
||||
}
|
||||
|
||||
// removeByRuleUID deletes all entries in the state cache that match the given UID.
|
||||
func (c *cache) removeByRuleUID(orgID int64, uid string) {
|
||||
// removeByRuleUID deletes all entries in the state cache that match the given UID. Returns removed states
|
||||
func (c *cache) removeByRuleUID(orgID int64, uid string) []*State {
|
||||
c.mtxStates.Lock()
|
||||
defer c.mtxStates.Unlock()
|
||||
statesMap := c.states[orgID][uid]
|
||||
delete(c.states[orgID], uid)
|
||||
if statesMap == nil {
|
||||
return nil
|
||||
}
|
||||
states := make([]*State, 0, len(statesMap))
|
||||
for _, state := range statesMap {
|
||||
states = append(states, state)
|
||||
}
|
||||
return states
|
||||
}
|
||||
|
||||
func (c *cache) reset() {
|
||||
|
||||
@@ -73,7 +73,7 @@ func (st *Manager) Close(ctx context.Context) {
|
||||
|
||||
func (st *Manager) Warm(ctx context.Context) {
|
||||
st.log.Info("warming cache for startup")
|
||||
st.ResetCache()
|
||||
st.ResetAllStates()
|
||||
|
||||
orgIds, err := st.instanceStore.FetchOrgIds(ctx)
|
||||
if err != nil {
|
||||
@@ -149,20 +149,30 @@ func (st *Manager) Get(orgID int64, alertRuleUID, stateId string) (*State, error
|
||||
return st.cache.get(orgID, alertRuleUID, stateId)
|
||||
}
|
||||
|
||||
// ResetCache is used to ensure a clean cache on startup.
|
||||
func (st *Manager) ResetCache() {
|
||||
// ResetAllStates is used to ensure a clean cache on startup.
|
||||
func (st *Manager) ResetAllStates() {
|
||||
st.cache.reset()
|
||||
}
|
||||
|
||||
// RemoveByRuleUID deletes all entries in the state manager that match the given rule UID.
|
||||
func (st *Manager) RemoveByRuleUID(orgID int64, ruleUID string) {
|
||||
st.cache.removeByRuleUID(orgID, ruleUID)
|
||||
// ResetStateByRuleUID deletes all entries in the state manager that match the given rule UID.
|
||||
func (st *Manager) ResetStateByRuleUID(ctx context.Context, ruleKey ngModels.AlertRuleKey) []*State {
|
||||
logger := st.log.New(ruleKey.LogContext()...)
|
||||
logger.Debug("resetting state of the rule")
|
||||
states := st.cache.removeByRuleUID(ruleKey.OrgID, ruleKey.UID)
|
||||
if len(states) > 0 {
|
||||
err := st.instanceStore.DeleteAlertInstancesByRule(ctx, ruleKey)
|
||||
if err != nil {
|
||||
logger.Error("failed to delete states that belong to a rule from database", ruleKey.LogContext()...)
|
||||
}
|
||||
}
|
||||
logger.Info("rules state was reset", "deleted_states", len(states))
|
||||
return states
|
||||
}
|
||||
|
||||
// ProcessEvalResults updates the current states that belong to a rule with the evaluation results.
|
||||
// if extraLabels is not empty, those labels will be added to every state. The extraLabels take precedence over rule labels and result labels
|
||||
func (st *Manager) ProcessEvalResults(ctx context.Context, evaluatedAt time.Time, alertRule *ngModels.AlertRule, results eval.Results, extraLabels data.Labels) []*State {
|
||||
logger := st.log.New(alertRule.GetKey().LogContext())
|
||||
logger := st.log.New(alertRule.GetKey().LogContext()...)
|
||||
logger.Debug("state manager processing evaluation results", "resultCount", len(results))
|
||||
var states []*State
|
||||
processedResults := make(map[string]*State, len(results))
|
||||
|
||||
Reference in New Issue
Block a user