From 01c7283a88a16379dd27e711e73d38e89a1fec2a Mon Sep 17 00:00:00 2001 From: Tom Ratcliffe Date: Wed, 26 Mar 2025 08:59:45 +0000 Subject: [PATCH] Alerting: Check recording rules are enabled as well as feature toggle (#102633) * Add `recordingRulesEnabled` to grafanaBootData * Check for recording rules being enabled, as well as feature toggle * Remove unnecessary config line * Move recording rules check to featureToggles file * Update NoRulesCTA.tsx --- packages/grafana-data/src/types/config.ts | 1 + packages/grafana-runtime/src/config.ts | 1 + pkg/api/dtos/frontend_settings.go | 1 + pkg/api/frontendsettings.go | 2 ++ .../alerting/unified/components/rules/GrafanaRules.tsx | 4 ++-- .../features/alerting/unified/components/rules/NoRulesCTA.tsx | 4 ++-- public/app/features/alerting/unified/featureToggles.ts | 3 +++ 7 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/grafana-data/src/types/config.ts b/packages/grafana-data/src/types/config.ts index a85914216ec..d97f02cc465 100644 --- a/packages/grafana-data/src/types/config.ts +++ b/packages/grafana-data/src/types/config.ts @@ -72,6 +72,7 @@ export interface UnifiedAlertingConfig { alertStateHistoryBackend?: string; // will be undefined if implementation is not "multiple" alertStateHistoryPrimary?: string; + recordingRulesEnabled?: boolean; } /** Supported OAuth services diff --git a/packages/grafana-runtime/src/config.ts b/packages/grafana-runtime/src/config.ts index 8990d064bd7..a1fc027889a 100644 --- a/packages/grafana-runtime/src/config.ts +++ b/packages/grafana-runtime/src/config.ts @@ -160,6 +160,7 @@ export class GrafanaBootConfig implements GrafanaConfig { minInterval: '', alertStateHistoryBackend: undefined, alertStateHistoryPrimary: undefined, + recordingRulesEnabled: false, }; applicationInsightsConnectionString?: string; applicationInsightsEndpointUrl?: string; diff --git a/pkg/api/dtos/frontend_settings.go b/pkg/api/dtos/frontend_settings.go index 19306e3d4aa..b87b063cecb 100644 --- a/pkg/api/dtos/frontend_settings.go +++ b/pkg/api/dtos/frontend_settings.go @@ -97,6 +97,7 @@ type FrontendSettingsUnifiedAlertingDTO struct { MinInterval string `json:"minInterval"` AlertStateHistoryBackend string `json:"alertStateHistoryBackend,omitempty"` AlertStateHistoryPrimary string `json:"alertStateHistoryPrimary,omitempty"` + RecordingRulesEnabled bool `json:"recordingRulesEnabled"` } // Enterprise-only diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index 070e977af90..75defb7cf21 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -337,6 +337,8 @@ func (hs *HTTPServer) getFrontendSettings(c *contextmodel.ReqContext) (*dtos.Fro frontendSettings.UnifiedAlerting.AlertStateHistoryPrimary = hs.Cfg.UnifiedAlerting.StateHistory.MultiPrimary } + frontendSettings.UnifiedAlerting.RecordingRulesEnabled = hs.Cfg.UnifiedAlerting.RecordingRules.Enabled + if hs.Cfg.UnifiedAlerting.Enabled != nil { frontendSettings.UnifiedAlertingEnabled = *hs.Cfg.UnifiedAlerting.Enabled } diff --git a/public/app/features/alerting/unified/components/rules/GrafanaRules.tsx b/public/app/features/alerting/unified/components/rules/GrafanaRules.tsx index 39e7f462346..0a6365c571b 100644 --- a/public/app/features/alerting/unified/components/rules/GrafanaRules.tsx +++ b/public/app/features/alerting/unified/components/rules/GrafanaRules.tsx @@ -2,7 +2,6 @@ import { css } from '@emotion/css'; import { useToggle } from 'react-use'; import { GrafanaTheme2 } from '@grafana/data'; -import { config } from '@grafana/runtime'; import { Button, LinkButton, LoadingPlaceholder, Pagination, Spinner, Stack, Text, useStyles2 } from '@grafana/ui'; import { useQueryParams } from 'app/core/hooks/useQueryParams'; import { Trans, t } from 'app/core/internationalization'; @@ -10,6 +9,7 @@ import { CombinedRuleNamespace } from 'app/types/unified-alerting'; import { DEFAULT_PER_PAGE_PAGINATION } from '../../../../../core/constants'; import { LogMessages, logInfo } from '../../Analytics'; +import { useGrafanaManagedRecordingRulesSupport } from '../../featureToggles'; import { AlertingAction, useAlertingAbility } from '../../hooks/useAbilities'; import { flattenGrafanaManagedRules } from '../../hooks/useCombinedRuleNamespaces'; import { usePagination } from '../../hooks/usePagination'; @@ -57,7 +57,7 @@ export const GrafanaRules = ({ namespaces, expandAll }: Props) => { const [showExportDrawer, toggleShowExportDrawer] = useToggle(false); const hasGrafanaAlerts = namespaces.length > 0; - const grafanaRecordingRulesEnabled = config.featureToggles.grafanaManagedRecordingRules; + const grafanaRecordingRulesEnabled = useGrafanaManagedRecordingRulesSupport(); return (
diff --git a/public/app/features/alerting/unified/components/rules/NoRulesCTA.tsx b/public/app/features/alerting/unified/components/rules/NoRulesCTA.tsx index 37d977b004d..35c1c42ffdd 100644 --- a/public/app/features/alerting/unified/components/rules/NoRulesCTA.tsx +++ b/public/app/features/alerting/unified/components/rules/NoRulesCTA.tsx @@ -1,12 +1,12 @@ -import { config } from '@grafana/runtime'; import { Dropdown, EmptyState, LinkButton, Menu, MenuItem, Stack, TextLink } from '@grafana/ui'; import { Trans, t } from 'app/core/internationalization'; +import { useGrafanaManagedRecordingRulesSupport } from '../../featureToggles'; import { useRulesAccess } from '../../utils/accessControlHooks'; const RecordingRulesButtons = () => { const { canCreateGrafanaRules, canCreateCloudRules } = useRulesAccess(); - const grafanaRecordingRulesEnabled = config.featureToggles.grafanaManagedRecordingRules; + const grafanaRecordingRulesEnabled = useGrafanaManagedRecordingRulesSupport(); const canCreateAll = canCreateGrafanaRules && canCreateCloudRules && grafanaRecordingRulesEnabled; // User can create Grafana and DS-managed recording rules, show a dropdown diff --git a/public/app/features/alerting/unified/featureToggles.ts b/public/app/features/alerting/unified/featureToggles.ts index 8e7ebc60c0e..3f35bb2479e 100644 --- a/public/app/features/alerting/unified/featureToggles.ts +++ b/public/app/features/alerting/unified/featureToggles.ts @@ -1,3 +1,6 @@ import { config } from '@grafana/runtime'; export const shouldUsePrometheusRulesPrimary = () => config.featureToggles.alertingPrometheusRulesPrimary ?? false; + +export const useGrafanaManagedRecordingRulesSupport = () => + config.unifiedAlerting.recordingRulesEnabled && config.featureToggles.grafanaManagedRecordingRules;