From eb018c417d990a14681e478ca535ff49c559e337 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Tue, 15 Jun 2021 04:49:40 -0400 Subject: [PATCH] Alerting: Fix alert migration RefID generation (#35667) (#35679) * Alerting: Fix alert migration RefID generation if the alert has more than 26 conditions * Remove TODO comment * Make similar change under pkg/expr (cherry picked from commit c997f646ccf7588129fe0ccbc016b74480e6c50f) Co-authored-by: Sofia Papagiannaki --- pkg/expr/translate/translate.go | 14 +++++++++----- .../sqlstore/migrations/ualert/cond_trans.go | 15 ++++++++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/pkg/expr/translate/translate.go b/pkg/expr/translate/translate.go index fb2b3192ff2..f7f77ba572c 100644 --- a/pkg/expr/translate/translate.go +++ b/pkg/expr/translate/translate.go @@ -13,6 +13,7 @@ import ( "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/ngalert/eval" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" + "github.com/grafana/grafana/pkg/util" ) // DashboardAlertConditions turns dashboard alerting conditions into server side expression queries and a @@ -279,10 +280,6 @@ const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // getNewRefID finds first capital letter in the alphabet not in use // to use for a new RefID. It errors if it runs out of letters. -// -// TODO: Research if there is a limit. If so enforce is by -// number of queries not letters. If no limit generate more types -// of refIDs. func getNewRefID(refIDs map[string][]int) (string, error) { for _, r := range alpha { sR := string(r) @@ -291,7 +288,14 @@ func getNewRefID(refIDs map[string][]int) (string, error) { } return sR, nil } - return "", fmt.Errorf("ran out of letters when creating expression") + for i := 0; i < 20; i++ { + sR := util.GenerateShortUID() + if _, ok := refIDs[sR]; ok { + continue + } + return sR, nil + } + return "", fmt.Errorf("failed to generate unique RefID") } // getRelativeDuration turns the alerting durations for dashboard conditions diff --git a/pkg/services/sqlstore/migrations/ualert/cond_trans.go b/pkg/services/sqlstore/migrations/ualert/cond_trans.go index 047fcd29cf4..d96d999ac27 100644 --- a/pkg/services/sqlstore/migrations/ualert/cond_trans.go +++ b/pkg/services/sqlstore/migrations/ualert/cond_trans.go @@ -6,6 +6,8 @@ import ( "sort" "strings" "time" + + "github.com/grafana/grafana/pkg/util" ) func transConditions(set dashAlertSettings, orgID int64, dsUIDMap dsUIDLookup) (*condition, error) { @@ -211,10 +213,6 @@ const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // getNewRefID finds first capital letter in the alphabet not in use // to use for a new RefID. It errors if it runs out of letters. -// -// TODO: Research if there is a limit. If so enforce is by -// number of queries not letters. If no limit generate more types -// of refIDs. func getNewRefID(refIDs map[string][]int) (string, error) { for _, r := range alpha { sR := string(r) @@ -223,7 +221,14 @@ func getNewRefID(refIDs map[string][]int) (string, error) { } return sR, nil } - return "", fmt.Errorf("ran out of letters when creating expression") + for i := 0; i < 20; i++ { + sR := util.GenerateShortUID() + if _, ok := refIDs[sR]; ok { + continue + } + return sR, nil + } + return "", fmt.Errorf("failed to generate unique RefID") } // getRelativeDuration turns the alerting durations for dashboard conditions