diff --git a/pkg/services/ngalert/api/api_prometheus_test.go b/pkg/services/ngalert/api/api_prometheus_test.go index 7f1e9c8e4a2..2b8ef4b48e7 100644 --- a/pkg/services/ngalert/api/api_prometheus_test.go +++ b/pkg/services/ngalert/api/api_prometheus_test.go @@ -912,6 +912,39 @@ func TestRouteGetRuleStatuses(t *testing.T) { require.Len(t, result.Data.RuleGroups[0].Rules, 1) require.Equal(t, expectedRule.Title, result.Data.RuleGroups[0].Rules[0].Name) }) + + t.Run("should only return rules with given rule_uid list", func(t *testing.T) { + expectedRuleInGroup1 := rulesInGroup1[0] + expectedRuleInGroup3 := rulesInGroup3[1] + + r, err := http.NewRequest("GET", fmt.Sprintf("/api/v1/rules?rule_uid=%s&rule_uid=%s", expectedRuleInGroup1.UID, expectedRuleInGroup3.UID), nil) + require.NoError(t, err) + + c.Context = &web.Context{Req: r} + + resp := api.RouteGetRuleStatuses(c) + require.Equal(t, http.StatusOK, resp.Status()) + result := &apimodels.RuleResponse{} + require.NoError(t, json.Unmarshal(resp.Body(), result)) + + require.Len(t, result.Data.RuleGroups, 2) + require.True(t, slices.ContainsFunc(result.Data.RuleGroups, func(rg apimodels.RuleGroup) bool { + return rg.Name == "rule-group-1" + })) + require.True(t, slices.ContainsFunc(result.Data.RuleGroups, func(rg apimodels.RuleGroup) bool { + return rg.Name == "rule-group-3" + })) + require.Len(t, result.Data.RuleGroups[0].Rules, 1) + require.Len(t, result.Data.RuleGroups[1].Rules, 1) + + if result.Data.RuleGroups[0].Name == "rule-group-1" { + require.Equal(t, expectedRuleInGroup1.UID, result.Data.RuleGroups[0].Rules[0].UID) + require.Equal(t, expectedRuleInGroup3.UID, result.Data.RuleGroups[1].Rules[0].UID) + } else { + require.Equal(t, expectedRuleInGroup1.UID, result.Data.RuleGroups[1].Rules[0].UID) + require.Equal(t, expectedRuleInGroup3.UID, result.Data.RuleGroups[0].Rules[0].UID) + } + }) }) t.Run("when requesting rules with pagination", func(t *testing.T) { diff --git a/pkg/services/ngalert/api/prometheus/api_prometheus.go b/pkg/services/ngalert/api/prometheus/api_prometheus.go index 99cb0d95530..c835fb2acdd 100644 --- a/pkg/services/ngalert/api/prometheus/api_prometheus.go +++ b/pkg/services/ngalert/api/prometheus/api_prometheus.go @@ -477,6 +477,7 @@ func PrepareRuleGroupStatusesV2(log log.Logger, store ListAlertRulesStoreV2, opt } ruleGroups := opts.Query["rule_group"] + ruleUIDs := opts.Query["rule_uid"] receiverName := opts.Query.Get("receiver_name") title := opts.Query.Get("search.rule_name") @@ -515,6 +516,7 @@ func PrepareRuleGroupStatusesV2(log log.Logger, store ListAlertRulesStoreV2, opt ListAlertRulesQuery: ngmodels.ListAlertRulesQuery{ OrgID: opts.OrgID, NamespaceUIDs: namespaceUIDs, + RuleUIDs: ruleUIDs, DashboardUID: dashboardUID, PanelID: panelID, RuleGroups: ruleGroups, @@ -650,6 +652,7 @@ func PrepareRuleGroupStatuses(log log.Logger, store ListAlertRulesStore, opts Ru } ruleGroups := opts.Query["rule_group"] + ruleUIDs := opts.Query["rule_uid"] receiverName := opts.Query.Get("receiver_name") title := opts.Query.Get("search.rule_name") @@ -658,6 +661,7 @@ func PrepareRuleGroupStatuses(log log.Logger, store ListAlertRulesStore, opts Ru alertRuleQuery := ngmodels.ListAlertRulesQuery{ OrgID: opts.OrgID, NamespaceUIDs: namespaceUIDs, + RuleUIDs: ruleUIDs, DashboardUID: dashboardUID, PanelID: panelID, RuleGroups: ruleGroups,