Alerting: Fix enrichment tab to be rendered only for grafana alerting rules (#113030)

fix enrichment tab to be rendered only for grafana alerting rules
This commit is contained in:
Sonia Aguilar
2025-10-27 10:54:50 +01:00
committed by GitHub
parent 4f2abe185c
commit 3c57a1880c
3 changed files with 48 additions and 10 deletions
@@ -4,6 +4,9 @@ import { FeatureState, NavModelItem } from '@grafana/data';
import { t } from '@grafana/i18n';
import { FeatureBadge, useStyles2 } from '@grafana/ui';
import { useAlertRule } from '../../components/rule-viewer/RuleContext';
import { rulerRuleType } from '../../utils/rules';
type SetActiveTab = (tab: string) => void;
type RuleViewTabBuilderArgs = {
@@ -12,15 +15,31 @@ type RuleViewTabBuilderArgs = {
};
type RuleViewTabBuilder = (args: RuleViewTabBuilderArgs) => NavModelItem;
type RuleViewTabBuilderConfig = {
filterOnlyGrafanaAlertRules: boolean;
ruleViewTabBuilder: RuleViewTabBuilder;
};
const ruleViewTabBuilders: RuleViewTabBuilder[] = [];
const ruleViewTabBuilders: RuleViewTabBuilderConfig[] = [];
export function registerRuleViewTab(builder: RuleViewTabBuilder) {
ruleViewTabBuilders.push(builder);
function registerRuleViewTab(builder: RuleViewTabBuilder) {
ruleViewTabBuilders.push({
filterOnlyGrafanaAlertRules: true,
ruleViewTabBuilder: builder,
});
}
export function getRuleViewExtensionTabs(args: RuleViewTabBuilderArgs): NavModelItem[] {
return ruleViewTabBuilders.map((builder) => builder(args));
export function useRuleViewExtensionTabs(args: RuleViewTabBuilderArgs): NavModelItem[] {
const { rule } = useAlertRule();
const isGrafanaAlertRule = rulerRuleType.grafana.alertingRule(rule.rulerRule);
return ruleViewTabBuilders
.filter((config) => {
if (config.filterOnlyGrafanaAlertRules) {
return isGrafanaAlertRule;
}
return true;
})
.map((config) => config.ruleViewTabBuilder(args));
}
export function addEnrichmentSection() {
@@ -40,6 +59,18 @@ export function __clearRuleViewTabsForTests() {
ruleViewTabBuilders.splice(0, ruleViewTabBuilders.length);
}
// ONLY FOR TESTS: non-hook version for testing
export function getRuleViewExtensionTabs(args: RuleViewTabBuilderArgs, isGrafanaAlertRule: boolean): NavModelItem[] {
return ruleViewTabBuilders
.filter((config) => {
if (config.filterOnlyGrafanaAlertRules) {
return isGrafanaAlertRule;
}
return true;
})
.map((config) => config.ruleViewTabBuilder(args));
}
function getStyles() {
return {
tabSuffix: css({
@@ -10,14 +10,14 @@ describe('rule-view-page navigation', () => {
});
it('does not include Alert enrichment tab when not registered', () => {
const tabs = getRuleViewExtensionTabs({ activeTab: 'query', setActiveTab: () => {} });
const tabs = getRuleViewExtensionTabs({ activeTab: 'query', setActiveTab: () => {} }, true);
const hasEnrichment = tabs.some((t) => t.text === 'Alert enrichment');
expect(hasEnrichment).toBe(false);
});
it('includes Alert enrichment tab when registered (enterprise + toggle on)', () => {
addEnrichmentSection();
const tabs = getRuleViewExtensionTabs({ activeTab: 'query', setActiveTab: () => {} });
const tabs = getRuleViewExtensionTabs({ activeTab: 'query', setActiveTab: () => {} }, true);
const enrichment = tabs.find((t) => t.text === 'Alert enrichment');
expect(enrichment).toBeTruthy();
expect(enrichment!.active).toBe(false);
@@ -25,12 +25,19 @@ describe('rule-view-page navigation', () => {
it('marks Alert enrichment tab active when selected', () => {
addEnrichmentSection();
const tabs = getRuleViewExtensionTabs({ activeTab: 'enrichment', setActiveTab: () => {} });
const tabs = getRuleViewExtensionTabs({ activeTab: 'enrichment', setActiveTab: () => {} }, true);
const enrichment = tabs.find((t) => t.text === 'Alert enrichment');
expect(enrichment).toBeTruthy();
expect(enrichment!.active).toBe(true);
});
it('excludes Alert enrichment tab when not a Grafana alert rule', () => {
addEnrichmentSection();
const tabs = getRuleViewExtensionTabs({ activeTab: 'query', setActiveTab: () => {} }, false);
const enrichment = tabs.find((t) => t.text === 'Alert enrichment');
expect(enrichment).toBeUndefined();
});
describe('enrichment section registration', () => {
it('should register enrichment section with correct prop interface', () => {
const mockEnrichmentSection = jest.fn(() => null);
@@ -1,7 +1,7 @@
import { NavModelItem } from '@grafana/data';
import { getRuleViewExtensionTabs } from './extensions';
import { useRuleViewExtensionTabs } from './extensions';
export function useRuleViewExtensionsNav(activeTab: string, setActiveTab: (tab: string) => void): NavModelItem[] {
return getRuleViewExtensionTabs({ activeTab, setActiveTab });
return useRuleViewExtensionTabs({ activeTab, setActiveTab });
}