Alerting: Do not record rule version if no difference (#100364)

This commit is contained in:
Yuri Tseretyan 2025-02-11 09:46:26 -05:00 committed by GitHub
parent 6da6660def
commit 28f21e0a0d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 43 additions and 1 deletions

View File

@ -329,7 +329,13 @@ func (st DBstore) UpdateAlertRules(ctx context.Context, user *ngmodels.UserUID,
v := alertRuleToAlertRuleVersion(converted) v := alertRuleToAlertRuleVersion(converted)
v.Version++ v.Version++
v.ParentVersion = r.Existing.Version v.ParentVersion = r.Existing.Version
ruleVersions = append(ruleVersions, v)
// check if there is diff between existing and new, and if no, skip saving version.
existingConverted, err := alertRuleFromModelsAlertRule(*r.Existing)
if err != nil || !alertRuleToAlertRuleVersion(existingConverted).EqualSpec(v) {
ruleVersions = append(ruleVersions, v)
}
keys = append(keys, ngmodels.AlertRuleKey{OrgID: r.New.OrgID, UID: r.New.UID}) keys = append(keys, ngmodels.AlertRuleKey{OrgID: r.New.OrgID, UID: r.New.UID})
} }
if len(ruleVersions) > 0 { if len(ruleVersions) > 0 {

View File

@ -73,6 +73,16 @@ func TestIntegrationUpdateAlertRules(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, rule.Version+1, dbrule.Version) require.Equal(t, rule.Version+1, dbrule.Version)
t.Run("should create version record", func(t *testing.T) {
var count int64
err = sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error {
count, err = sess.Table(alertRuleVersion{}).Where("rule_uid = ?", rule.UID).Count()
return err
})
require.NoError(t, err)
require.EqualValues(t, 1, count) // only the current version, insert did not create version.
})
}) })
t.Run("updating record field should increase version", func(t *testing.T) { t.Run("updating record field should increase version", func(t *testing.T) {
@ -191,6 +201,32 @@ func TestIntegrationUpdateAlertRules(t *testing.T) {
assert.Nil(t, dbrule.UpdatedBy) assert.Nil(t, dbrule.UpdatedBy)
}) })
}) })
t.Run("should save noop update", func(t *testing.T) {
rule := createRule(t, store, gen)
newRule := models.CopyRule(rule)
err := store.UpdateAlertRules(context.Background(), &usr, []models.UpdateRule{{
Existing: rule,
New: *newRule,
},
})
require.NoError(t, err)
newRule, err = store.GetAlertRuleByUID(context.Background(), &models.GetAlertRuleByUIDQuery{UID: rule.UID})
require.NoError(t, err)
assert.Equal(t, rule.Version+1, newRule.Version)
t.Run("should not create version record", func(t *testing.T) {
var count int64
err = sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error {
count, err = sess.Table(alertRuleVersion{}).Where("rule_uid = ?", rule.UID).Count()
return err
})
require.NoError(t, err)
require.EqualValues(t, 1, count) // only the current version
})
})
} }
func TestIntegrationUpdateAlertRulesWithUniqueConstraintViolation(t *testing.T) { func TestIntegrationUpdateAlertRulesWithUniqueConstraintViolation(t *testing.T) {