mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: Cleanup the alert_configuration table on write (#51497)
This commit is contained in:
committed by
GitHub
parent
50ae42130b
commit
320262c3db
@@ -19,6 +19,10 @@ var (
|
||||
// ErrVersionLockedObjectNotFound is returned when an object is not
|
||||
// found using the current hash.
|
||||
ErrVersionLockedObjectNotFound = fmt.Errorf("could not find object using provided id and hash")
|
||||
// ConfigRecordsLimit defines the limit of how many alertmanager configuration versions
|
||||
// should be stored in the database for each organization including the current one.
|
||||
// Has to be > 0
|
||||
ConfigRecordsLimit int64 = 100
|
||||
)
|
||||
|
||||
// GetLatestAlertmanagerConfiguration returns the lastest version of the alertmanager configuration.
|
||||
@@ -78,7 +82,9 @@ func (st DBstore) SaveAlertmanagerConfigurationWithCallback(ctx context.Context,
|
||||
if _, err := sess.Insert(config); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := st.deleteOldConfigurations(ctx, cmd.OrgID, ConfigRecordsLimit); err != nil {
|
||||
st.Logger.Warn("failed to delete old am configs", "org", cmd.OrgID, "err", err)
|
||||
}
|
||||
if err := callback(); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -118,6 +124,9 @@ func (st *DBstore) UpdateAlertmanagerConfiguration(ctx context.Context, cmd *mod
|
||||
if rows == 0 {
|
||||
return ErrVersionLockedObjectNotFound
|
||||
}
|
||||
if _, err := st.deleteOldConfigurations(ctx, cmd.OrgID, ConfigRecordsLimit); err != nil {
|
||||
st.Logger.Warn("failed to delete old am configs", "org", cmd.OrgID, "err", err)
|
||||
}
|
||||
return err
|
||||
})
|
||||
}
|
||||
@@ -196,3 +205,39 @@ func getInsertQuery(driver string) string {
|
||||
)`
|
||||
}
|
||||
}
|
||||
|
||||
func (st *DBstore) deleteOldConfigurations(ctx context.Context, orgID, limit int64) (int64, error) {
|
||||
if limit < 1 {
|
||||
return 0, fmt.Errorf("failed to delete old configurations: limit is set to '%d' but needs to be > 0", limit)
|
||||
}
|
||||
var affactedRows int64
|
||||
err := st.SQLStore.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
|
||||
res, err := sess.Exec(`
|
||||
DELETE FROM
|
||||
alert_configuration
|
||||
WHERE
|
||||
org_id = ?
|
||||
AND
|
||||
id NOT IN (
|
||||
SELECT T.* FROM (
|
||||
SELECT id
|
||||
FROM alert_configuration
|
||||
WHERE org_id = ? ORDER BY id DESC LIMIT ?
|
||||
)AS T
|
||||
)
|
||||
`, orgID, orgID, limit)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rows, err := res.RowsAffected()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
affactedRows = rows
|
||||
if affactedRows > 0 {
|
||||
st.Logger.Info("deleted old alert_configuration(s)", "org", orgID, "limit", limit, "delete_count", affactedRows)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return affactedRows, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user