From e6f2de51a3e190832c8b2cd4fc4db2b7a2ee917b Mon Sep 17 00:00:00 2001 From: Sonia Aguilar <33540275+soniaAguilarPeiron@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:14:46 +0100 Subject: [PATCH] Alerting: Fix for data source filter on cloud rules. (#79327) * fix data source filter not worling for cloud rules * Add test --- .../unified/hooks/useFilteredRules.test.ts | 14 ++++++++++++-- .../alerting/unified/hooks/useFilteredRules.ts | 8 ++++++-- public/app/features/alerting/unified/mocks.ts | 17 ++++++++++++++--- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/public/app/features/alerting/unified/hooks/useFilteredRules.test.ts b/public/app/features/alerting/unified/hooks/useFilteredRules.test.ts index 4c2498409160..5b2c151e34d5 100644 --- a/public/app/features/alerting/unified/hooks/useFilteredRules.test.ts +++ b/public/app/features/alerting/unified/hooks/useFilteredRules.test.ts @@ -2,7 +2,9 @@ import { setDataSourceSrv } from '@grafana/runtime'; import { PromAlertingRuleState } from '../../../../types/unified-alerting-dto'; import { + getCloudRule, mockAlertQuery, + mockCombinedCloudRuleNamespace, mockCombinedRule, mockCombinedRuleGroup, mockCombinedRuleNamespace, @@ -154,16 +156,24 @@ describe('filterRules', function () { data: [mockAlertQuery({ datasourceUid: dataSources.loki.uid })], }), }), + getCloudRule({ name: 'Cloud' }), ]; const ns = mockCombinedRuleNamespace({ groups: [mockCombinedRuleGroup('Resources usage group', rules)], }); + const cloudNs = mockCombinedCloudRuleNamespace( + { + groups: [mockCombinedRuleGroup('Resources usage group', rules)], + }, + 'Prometheus-ds' + ); - const filtered = filterRules([ns], getFilter({ dataSourceNames: ['loki'] })); + const filtered = filterRules([ns, cloudNs], getFilter({ dataSourceNames: ['loki', 'Prometheus-ds'] })); - expect(filtered[0].groups[0].rules).toHaveLength(1); + expect(filtered[0].groups[0].rules).toHaveLength(2); expect(filtered[0].groups[0].rules[0].name).toBe('Memory too low'); + expect(filtered[0].groups[0].rules[1].name).toBe('Cloud'); }); it('should be able to combine multiple predicates with AND', () => { diff --git a/public/app/features/alerting/unified/hooks/useFilteredRules.ts b/public/app/features/alerting/unified/hooks/useFilteredRules.ts index 2b8ef7722d52..e8d7b222b762 100644 --- a/public/app/features/alerting/unified/hooks/useFilteredRules.ts +++ b/public/app/features/alerting/unified/hooks/useFilteredRules.ts @@ -204,9 +204,13 @@ const reduceGroups = (filterState: RulesFilter) => { } if ('dataSourceNames' in matchesFilterFor) { - const doesNotQueryDs = isGrafanaRulerRule(rule.rulerRule) && isQueryingDataSource(rule.rulerRule, filterState); + if (isGrafanaRulerRule(rule.rulerRule)) { + const doesNotQueryDs = isQueryingDataSource(rule.rulerRule, filterState); - if (doesNotQueryDs) { + if (doesNotQueryDs) { + matchesFilterFor.dataSourceNames = true; + } + } else { matchesFilterFor.dataSourceNames = true; } } diff --git a/public/app/features/alerting/unified/mocks.ts b/public/app/features/alerting/unified/mocks.ts index 4831544f40ef..5e787d74b5e1 100644 --- a/public/app/features/alerting/unified/mocks.ts +++ b/public/app/features/alerting/unified/mocks.ts @@ -15,16 +15,16 @@ import { ScopedVars, TestDataSourceResponse, } from '@grafana/data'; -import { config, DataSourceSrv, GetDataSourceListFilters } from '@grafana/runtime'; +import { DataSourceSrv, GetDataSourceListFilters, config } from '@grafana/runtime'; import { defaultDashboard } from '@grafana/schema'; import { contextSrv } from 'app/core/services/context_srv'; import { DatasourceSrv } from 'app/features/plugins/datasource_srv'; import { - AlertmanagerAlert, AlertManagerCortexConfig, + AlertState, + AlertmanagerAlert, AlertmanagerGroup, AlertmanagerStatus, - AlertState, GrafanaManagedReceiverConfig, MatcherOperator, Silence, @@ -657,6 +657,17 @@ export function mockCombinedRuleNamespace(namespace: Partial, + dataSourceName: string +): CombinedRuleNamespace { + return { + name: 'Grafana', + groups: [], + rulesSource: mockDataSource({ name: dataSourceName, uid: 'Prometheus-1' }), + ...namespace, + }; +} export function getGrafanaRule(override?: Partial, rulerOverride?: Partial) { return mockCombinedRule({