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:
@@ -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("").
|
||||
|
||||
Reference in New Issue
Block a user