Alerting: Add GUID to alert rule tables (#101321)

* add column guid to alert rule table and rule_guid to rule version table
+ populate the new field with UUID
* update storage and domain models
* patch GUID
* ignore GUID in fingerprint tests
This commit is contained in:
Yuri Tseretyan
2025-02-28 09:47:25 -05:00
committed by GitHub
parent 9eaaf95701
commit 879b121136
11 changed files with 138 additions and 6 deletions
@@ -145,4 +145,6 @@ func (oss *OSSMigrations) AddMigration(mg *Migrator) {
ualert.AddAlertRuleUpdatedByMigration(mg)
ualert.AddAlertRuleStateTable(mg)
ualert.AddAlertRuleGuidMigration(mg)
}
@@ -0,0 +1,83 @@
package ualert
import (
"github.com/google/uuid"
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
"xorm.io/xorm"
)
// AddAlertRuleGuidMigration sets up migrations for adding and managing GUID columns in alert_rule and alert_rule_version tables.
func AddAlertRuleGuidMigration(mg *migrator.Migrator) {
alertRuleVersion := migrator.Table{Name: "alert_rule_version"}
alertRule := migrator.Table{Name: "alert_rule"}
mg.AddMigration("add guid column to alert_rule table", migrator.NewAddColumnMigration(alertRule, &migrator.Column{
Name: "guid",
Type: migrator.DB_Varchar,
Length: 36,
Nullable: false,
Default: "''",
}))
mg.AddMigration("add rule_guid column to alert_rule_version table", migrator.NewAddColumnMigration(alertRuleVersion, &migrator.Column{
Name: "rule_guid",
Type: migrator.DB_Varchar,
Length: 36,
Nullable: false,
Default: "''",
}))
mg.AddMigration("drop index in alert_rule_version table on rule_org_id, rule_uid and version columns", migrator.NewDropIndexMigration(alertRuleVersion, alertRuleVersionUDX_OrgIdRuleUIDVersion))
mg.AddMigration("populate rule guid in alert rule table", &setRuleGuidMigration{})
mg.AddMigration("add index in alert_rule_version table on rule_org_id, rule_uid, rule_guid and version columns",
migrator.NewAddIndexMigration(alertRuleVersion,
&migrator.Index{Cols: []string{"rule_org_id", "rule_uid", "rule_guid", "version"}, Type: migrator.UniqueIndex},
),
)
mg.AddMigration("add index in alert_rule_version table on rule_guid and version columns",
migrator.NewAddIndexMigration(alertRuleVersion,
&migrator.Index{Cols: []string{"rule_guid", "version"}, Type: migrator.UniqueIndex},
),
)
mg.AddMigration("add index in alert_rule table on guid columns",
migrator.NewAddIndexMigration(alertRule,
&migrator.Index{Cols: []string{"guid"}, Type: migrator.UniqueIndex},
))
}
type setRuleGuidMigration struct {
migrator.MigrationBase
}
var _ migrator.CodeMigration = (*setRuleGuidMigration)(nil)
func (c setRuleGuidMigration) SQL(migrator.Dialect) string {
return codeMigration
}
func (c setRuleGuidMigration) Exec(sess *xorm.Session, mg *migrator.Migrator) error {
var results []string
if err := sess.SQL("SELECT uid FROM alert_rule").Find(&results); err != nil {
return err
}
if len(results) == 0 {
mg.Logger.Debug("no rules found")
return nil
}
for _, uid := range results {
u := uuid.NewString()
_, err := sess.Exec("UPDATE alert_rule_version SET rule_guid = ? WHERE rule_uid = ?", u, uid)
if err != nil {
mg.Logger.Error("Failed to update alert_rule_version table", "error", err)
return err
}
_, err = sess.Exec("UPDATE alert_rule SET guid = ? WHERE uid = ?", u, uid)
if err != nil {
mg.Logger.Error("Failed to update alert_rule table", "error", err)
return err
}
}
return nil
}
@@ -302,6 +302,8 @@ func addAlertRuleMigrations(mg *migrator.Migrator, defaultIntervalSeconds int64)
UPDATE alert_rule SET is_paused = false;`))
}
var alertRuleVersionUDX_OrgIdRuleUIDVersion = &migrator.Index{Cols: []string{"rule_org_id", "rule_uid", "version"}, Type: migrator.UniqueIndex}
func addAlertRuleVersionMigrations(mg *migrator.Migrator) {
// DO NOT EDIT
alertRuleVersion := migrator.Table{
@@ -325,12 +327,12 @@ func addAlertRuleVersionMigrations(mg *migrator.Migrator) {
{Name: "exec_err_state", Type: migrator.DB_NVarchar, Length: 15, Nullable: false, Default: "'Alerting'"},
},
Indices: []*migrator.Index{
{Cols: []string{"rule_org_id", "rule_uid", "version"}, Type: migrator.UniqueIndex},
alertRuleVersionUDX_OrgIdRuleUIDVersion,
{Cols: []string{"rule_org_id", "rule_namespace_uid", "rule_group"}, Type: migrator.IndexType},
},
}
mg.AddMigration("create alert_rule_version table", migrator.NewAddTableMigration(alertRuleVersion))
mg.AddMigration("add index in alert_rule_version table on rule_org_id, rule_uid and version columns", migrator.NewAddIndexMigration(alertRuleVersion, alertRuleVersion.Indices[0]))
mg.AddMigration("add index in alert_rule_version table on rule_org_id, rule_uid and version columns", migrator.NewAddIndexMigration(alertRuleVersion, alertRuleVersionUDX_OrgIdRuleUIDVersion))
mg.AddMigration("add index in alert_rule_version table on rule_org_id, rule_namespace_uid and rule_group columns", migrator.NewAddIndexMigration(alertRuleVersion, alertRuleVersion.Indices[1]))
mg.AddMigration("alter alert_rule_version table data column to mediumtext in mysql", migrator.NewRawSQLMigration("").