From 0880592cbe362b8c2eac46865faecbde40543408 Mon Sep 17 00:00:00 2001 From: Alexander Akhmetov Date: Fri, 12 Dec 2025 17:38:01 +0100 Subject: [PATCH] Alerting: Apply rule_uid filter when fetching state of a single rule --- .../alerting/unified/api/alertRuleApi.test.ts | 14 ++++++++++++++ .../features/alerting/unified/api/alertRuleApi.ts | 8 ++++++++ .../alerting/unified/hooks/useCombinedRule.ts | 1 + 3 files changed, 23 insertions(+) diff --git a/public/app/features/alerting/unified/api/alertRuleApi.test.ts b/public/app/features/alerting/unified/api/alertRuleApi.test.ts index 70a2e969d14..e7b572330f3 100644 --- a/public/app/features/alerting/unified/api/alertRuleApi.test.ts +++ b/public/app/features/alerting/unified/api/alertRuleApi.test.ts @@ -69,5 +69,19 @@ describe('alertRuleApi', () => { expect(fetchMock).toHaveBeenCalledTimes(1); expect(request.params?.[PrometheusAPIFilters.LimitAlerts]).toBe('25'); }); + + it('includes rule_uid when provided', async () => { + const request = await executePrometheusRuleNamespacesQuery({ ruleUid: 'test-rule-uid-123' }); + + expect(fetchMock).toHaveBeenCalledTimes(1); + expect(request.params?.[PrometheusAPIFilters.RuleUID]).toBe('test-rule-uid-123'); + }); + + it('omits rule_uid when not provided', async () => { + const request = await executePrometheusRuleNamespacesQuery(); + + expect(fetchMock).toHaveBeenCalledTimes(1); + expect(request.params?.[PrometheusAPIFilters.RuleUID]).toBeUndefined(); + }); }); }); diff --git a/public/app/features/alerting/unified/api/alertRuleApi.ts b/public/app/features/alerting/unified/api/alertRuleApi.ts index 46cdf2546fe..6a8d05b06ee 100644 --- a/public/app/features/alerting/unified/api/alertRuleApi.ts +++ b/public/app/features/alerting/unified/api/alertRuleApi.ts @@ -54,6 +54,7 @@ export enum PrometheusAPIFilters { Namespace = 'file', NamespaceVanilla = 'file[]', FolderUID = 'folder_uid', + RuleUID = 'rule_uid', LimitAlerts = 'limit_alerts', MaxGroups = 'max_groups', ExcludeAlerts = 'exclude_alerts', @@ -169,6 +170,7 @@ export const alertRuleApi = alertingApi.injectEndpoints({ namespace?: string; groupName?: string; ruleName?: string; + ruleUid?: string; dashboardUid?: string; panelId?: number; limitAlerts?: number; @@ -181,6 +183,7 @@ export const alertRuleApi = alertingApi.injectEndpoints({ namespace, groupName, ruleName, + ruleUid, dashboardUid, panelId, limitAlerts, @@ -202,6 +205,11 @@ export const alertRuleApi = alertingApi.injectEndpoints({ queryParams[PrometheusAPIFilters.RuleNameVanilla] = ruleName; } + // Supported only by Grafana managed rules + if (ruleUid) { + queryParams[PrometheusAPIFilters.RuleUID] = ruleUid; + } + if (namespace) { if (isGrafanaRulesSource(ruleSourceName)) { queryParams[PrometheusAPIFilters.FolderUID] = namespace; diff --git a/public/app/features/alerting/unified/hooks/useCombinedRule.ts b/public/app/features/alerting/unified/hooks/useCombinedRule.ts index 3fd0faeb783..690d551b41e 100644 --- a/public/app/features/alerting/unified/hooks/useCombinedRule.ts +++ b/public/app/features/alerting/unified/hooks/useCombinedRule.ts @@ -122,6 +122,7 @@ export function useCombinedRule({ ruleIdentifier, limitAlerts }: Props): Request namespace: ruleLocation?.namespace, groupName: ruleLocation?.group, ruleName: ruleLocation?.ruleName, + ruleUid: isGrafanaRuleIdentifier(ruleIdentifier) ? ruleIdentifier.uid : undefined, limitAlerts, }, {