From 543f0ae37ed7d6d7c2508bda0a8278f47d3910b0 Mon Sep 17 00:00:00 2001 From: Fayzal Ghantiwala <114010985+fayzal-g@users.noreply.github.com> Date: Wed, 29 May 2024 11:50:33 +0100 Subject: [PATCH] Alerting: Update ListAlertRulesQuery to take a slice of RuleGroups (#88385) * Change ListAlertRulesQuery to take RuleGroup slice instead * Change func name * Change func name * Fix fakes * Fix function arg --- pkg/services/ngalert/api/api_ruler.go | 2 +- pkg/services/ngalert/models/alert_rule.go | 2 +- .../ngalert/provisioning/alert_rules.go | 6 ++--- pkg/services/ngalert/store/alert_rule.go | 23 ++++++++++++------- pkg/services/ngalert/store/deltas.go | 8 +++---- pkg/services/ngalert/tests/fakes/rules.go | 22 ++++-------------- pkg/services/ngalert/tests/util.go | 2 +- 7 files changed, 29 insertions(+), 36 deletions(-) diff --git a/pkg/services/ngalert/api/api_ruler.go b/pkg/services/ngalert/api/api_ruler.go index 94dece2a4ae..2470ba872b4 100644 --- a/pkg/services/ngalert/api/api_ruler.go +++ b/pkg/services/ngalert/api/api_ruler.go @@ -663,7 +663,7 @@ func (srv RulerSrv) getAuthorizedRuleGroup(ctx context.Context, c *contextmodel. q := ngmodels.ListAlertRulesQuery{ OrgID: ruleGroupKey.OrgID, NamespaceUIDs: []string{ruleGroupKey.NamespaceUID}, - RuleGroup: ruleGroupKey.RuleGroup, + RuleGroups: []string{ruleGroupKey.RuleGroup}, } rules, err := srv.store.ListAlertRules(ctx, &q) if err != nil { diff --git a/pkg/services/ngalert/models/alert_rule.go b/pkg/services/ngalert/models/alert_rule.go index a8a9a4a8c1e..e44d1947611 100644 --- a/pkg/services/ngalert/models/alert_rule.go +++ b/pkg/services/ngalert/models/alert_rule.go @@ -611,7 +611,7 @@ type ListAlertRulesQuery struct { OrgID int64 NamespaceUIDs []string ExcludeOrgs []int64 - RuleGroup string + RuleGroups []string // DashboardUID and PanelID are optional and allow filtering rules // to return just those for a dashboard and panel. diff --git a/pkg/services/ngalert/provisioning/alert_rules.go b/pkg/services/ngalert/provisioning/alert_rules.go index b8ac2c0a026..d69af6a6711 100644 --- a/pkg/services/ngalert/provisioning/alert_rules.go +++ b/pkg/services/ngalert/provisioning/alert_rules.go @@ -266,7 +266,7 @@ func (service *AlertRuleService) GetRuleGroup(ctx context.Context, user identity q := models.ListAlertRulesQuery{ OrgID: user.GetOrgID(), NamespaceUIDs: []string{namespaceUID}, - RuleGroup: group, + RuleGroups: []string{group}, } ruleList, err := service.ruleStore.ListAlertRules(ctx, &q) if err != nil { @@ -308,7 +308,7 @@ func (service *AlertRuleService) UpdateRuleGroup(ctx context.Context, user ident query := &models.ListAlertRulesQuery{ OrgID: user.GetOrgID(), NamespaceUIDs: []string{namespaceUID}, - RuleGroup: ruleGroup, + RuleGroups: []string{ruleGroup}, } ruleList, err := service.ruleStore.ListAlertRules(ctx, query) if err != nil { @@ -436,7 +436,7 @@ func (service *AlertRuleService) calcDelta(ctx context.Context, user identity.Re listRulesQuery := models.ListAlertRulesQuery{ OrgID: user.GetOrgID(), NamespaceUIDs: []string{group.FolderUID}, - RuleGroup: group.Title, + RuleGroups: []string{group.Title}, } ruleList, err := service.ruleStore.ListAlertRules(ctx, &listRulesQuery) if err != nil { diff --git a/pkg/services/ngalert/store/alert_rule.go b/pkg/services/ngalert/store/alert_rule.go index 53a31f18d69..c233e001034 100644 --- a/pkg/services/ngalert/store/alert_rule.go +++ b/pkg/services/ngalert/store/alert_rule.go @@ -363,17 +363,13 @@ func (st DBstore) ListAlertRules(ctx context.Context, query *ngmodels.ListAlertR } if len(query.NamespaceUIDs) > 0 { - args := make([]any, 0, len(query.NamespaceUIDs)) - in := make([]string, 0, len(query.NamespaceUIDs)) - for _, namespaceUID := range query.NamespaceUIDs { - args = append(args, namespaceUID) - in = append(in, "?") - } + args, in := getINSubQueryArgs(query.NamespaceUIDs) q = q.Where(fmt.Sprintf("namespace_uid IN (%s)", strings.Join(in, ",")), args...) } - if query.RuleGroup != "" { - q = q.Where("rule_group = ?", query.RuleGroup) + if len(query.RuleGroups) > 0 { + args, in := getINSubQueryArgs(query.RuleGroups) + q = q.Where(fmt.Sprintf("rule_group IN (%s)", strings.Join(in, ",")), args...) } if query.ReceiverName != "" { @@ -789,3 +785,14 @@ func (st DBstore) GetNamespacesByRuleUID(ctx context.Context, orgID int64, uids }) return result, err } + +func getINSubQueryArgs[T any](inputSlice []T) ([]any, []string) { + args := make([]any, 0, len(inputSlice)) + in := make([]string, 0, len(inputSlice)) + for _, t := range inputSlice { + args = append(args, t) + in = append(in, "?") + } + + return args, in +} diff --git a/pkg/services/ngalert/store/deltas.go b/pkg/services/ngalert/store/deltas.go index 2b24bf52ea1..c693d51d3b3 100644 --- a/pkg/services/ngalert/store/deltas.go +++ b/pkg/services/ngalert/store/deltas.go @@ -63,7 +63,7 @@ func CalculateChanges(ctx context.Context, ruleReader RuleReader, groupKey model q := &models.ListAlertRulesQuery{ OrgID: groupKey.OrgID, NamespaceUIDs: []string{groupKey.NamespaceUID}, - RuleGroup: groupKey.RuleGroup, + RuleGroups: []string{groupKey.RuleGroup}, } existingGroupRules, err := ruleReader.ListAlertRules(ctx, q) if err != nil { @@ -203,7 +203,7 @@ func CalculateRuleUpdate(ctx context.Context, ruleReader RuleReader, rule *model q := &models.ListAlertRulesQuery{ OrgID: rule.OrgID, NamespaceUIDs: []string{rule.NamespaceUID}, - RuleGroup: rule.RuleGroup, + RuleGroups: []string{rule.RuleGroup}, } existingGroupRules, err := ruleReader.ListAlertRules(ctx, q) if err != nil { @@ -232,7 +232,7 @@ func CalculateRuleGroupDelete(ctx context.Context, ruleReader RuleReader, groupK q := models.ListAlertRulesQuery{ OrgID: groupKey.OrgID, NamespaceUIDs: []string{groupKey.NamespaceUID}, - RuleGroup: groupKey.RuleGroup, + RuleGroups: []string{groupKey.RuleGroup}, } ruleList, err := ruleReader.ListAlertRules(ctx, &q) if err != nil { @@ -288,7 +288,7 @@ func CalculateRuleCreate(ctx context.Context, ruleReader RuleReader, rule *model q := &models.ListAlertRulesQuery{ OrgID: rule.OrgID, NamespaceUIDs: []string{rule.NamespaceUID}, - RuleGroup: rule.RuleGroup, + RuleGroups: []string{rule.RuleGroup}, } group, err := ruleReader.ListAlertRules(ctx, q) if err != nil { diff --git a/pkg/services/ngalert/tests/fakes/rules.go b/pkg/services/ngalert/tests/fakes/rules.go index 3bc41ab7758..bf6ce2dcc46 100644 --- a/pkg/services/ngalert/tests/fakes/rules.go +++ b/pkg/services/ngalert/tests/fakes/rules.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math/rand" + "slices" "sync" "testing" "time" @@ -198,33 +199,18 @@ func (f *RuleStore) ListAlertRules(_ context.Context, q *models.ListAlertRulesQu return true } - hasNamespace := func(r *models.AlertRule, namespaceUIDs []string) bool { - if len(namespaceUIDs) > 0 { - var ok bool - for _, uid := range q.NamespaceUIDs { - if uid == r.NamespaceUID { - ok = true - break - } - } - if !ok { - return false - } - } - return true - } - ruleList := models.RulesGroup{} for _, r := range f.Rules[q.OrgID] { if !hasDashboard(r, q.DashboardUID, q.PanelID) { continue } - if !hasNamespace(r, q.NamespaceUIDs) { + if len(q.NamespaceUIDs) > 0 && !slices.Contains(q.NamespaceUIDs, r.NamespaceUID) { continue } - if q.RuleGroup != "" && r.RuleGroup != q.RuleGroup { + if len(q.RuleGroups) > 0 && !slices.Contains(q.RuleGroups, r.RuleGroup) { continue } + ruleList = append(ruleList, r) } diff --git a/pkg/services/ngalert/tests/util.go b/pkg/services/ngalert/tests/util.go index 1e24685f3b9..dcfe48c0c87 100644 --- a/pkg/services/ngalert/tests/util.go +++ b/pkg/services/ngalert/tests/util.go @@ -141,7 +141,7 @@ func CreateTestAlertRuleWithLabels(t testing.TB, ctx context.Context, dbstore *s q := models.ListAlertRulesQuery{ OrgID: orgID, NamespaceUIDs: []string{folderUID}, - RuleGroup: ruleGroup, + RuleGroups: []string{ruleGroup}, } ruleList, err := dbstore.ListAlertRules(ctx, &q) require.NoError(t, err)