[v10.2.x] Alerting: Fix for data source filter on cloud rules. (#79327) (#79350)

Alerting: Fix for data source filter on cloud rules. (#79327)

* fix data source filter not worling for cloud rules

* Add test

(cherry picked from commit e6f2de51a3)
(cherry picked from commit b1cb170fa1)
This commit is contained in:
Sonia Aguilar
2023-12-21 20:32:45 +00:00
committed by Andreas Christou
parent e1e5fc90ad
commit 2f814bb786
3 changed files with 29 additions and 4 deletions
@@ -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', () => {
@@ -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;
}
}
@@ -657,6 +657,17 @@ export function mockCombinedRuleNamespace(namespace: Partial<CombinedRuleNamespa
...namespace,
};
}
export function mockCombinedCloudRuleNamespace(
namespace: Partial<CombinedRuleNamespace>,
dataSourceName: string
): CombinedRuleNamespace {
return {
name: 'Grafana',
groups: [],
rulesSource: mockDataSource({ name: dataSourceName, uid: 'Prometheus-1' }),
...namespace,
};
}
export function getGrafanaRule(override?: Partial<CombinedRule>, rulerOverride?: Partial<GrafanaRuleDefinition>) {
return mockCombinedRule({