From 099a43aa102f19996b99c72def7d59e16a879ba7 Mon Sep 17 00:00:00 2001 From: Matthew Jacobson Date: Tue, 2 Sep 2025 14:33:41 -0400 Subject: [PATCH] Alerting: Fix insights panel for Grafana missed iterations (#110468) * Alerting: Fix insights panel for Grafana missed iterations Existing panel was copied from Mimir version, so it was using the wrong metric as well as incorrect assumptions on the series labels grafanacloud_instance_rule_group_iterations_missed_total -> grafanacloud_grafana_instance_alerting_schedule_rule_evaluations_missed_total parsing `rule_group` (ex. `/rules/12345/synthetic_monitoring;default`) -> using `rule_title` directly * Linting --- .../alerting/unified/home/Insights.tsx | 2 +- .../grafana/MissedIterationsScene.tsx | 46 ++----------------- 2 files changed, 6 insertions(+), 42 deletions(-) diff --git a/public/app/features/alerting/unified/home/Insights.tsx b/public/app/features/alerting/unified/home/Insights.tsx index 848c2dee9b2..05afaa748ca 100644 --- a/public/app/features/alerting/unified/home/Insights.tsx +++ b/public/app/features/alerting/unified/home/Insights.tsx @@ -289,7 +289,7 @@ function getGrafanaManagedScenes() { new SceneFlexLayout({ children: [ getGrafanaEvalSuccessVsFailuresScene(cloudUsageDs, 'Evaluation success vs failures'), - getGrafanaMissedIterationsScene(cloudUsageDs, 'Iterations missed per evaluation group'), + getGrafanaMissedIterationsScene(cloudUsageDs, 'Iterations missed per alert rule'), ], }), ], diff --git a/public/app/features/alerting/unified/insights/grafana/MissedIterationsScene.tsx b/public/app/features/alerting/unified/insights/grafana/MissedIterationsScene.tsx index 2bc5e3d426b..276dc5dae3f 100644 --- a/public/app/features/alerting/unified/insights/grafana/MissedIterationsScene.tsx +++ b/public/app/features/alerting/unified/insights/grafana/MissedIterationsScene.tsx @@ -1,20 +1,11 @@ -import { Observable, map } from 'rxjs'; - -import { DataFrame } from '@grafana/data'; -import { - CustomTransformOperator, - PanelBuilders, - SceneDataTransformer, - SceneFlexItem, - SceneQueryRunner, -} from '@grafana/scenes'; +import { PanelBuilders, SceneFlexItem, SceneQueryRunner } from '@grafana/scenes'; import { DataSourceRef, GraphDrawStyle, TooltipDisplayMode } from '@grafana/schema'; import { INSTANCE_ID, PANEL_STYLES } from '../../home/Insights'; import { InsightsMenuButton } from '../InsightsMenuButton'; export function getGrafanaMissedIterationsScene(datasource: DataSourceRef, panelTitle: string) { - const expr = `sum by(rule_group) (grafanacloud_instance_rule_group_iterations_missed_total:rate5m{id="${INSTANCE_ID}"})`; + const expr = `sum by(rule_title) (grafanacloud_grafana_instance_alerting_schedule_rule_evaluations_missed_total:rate5m{id="${INSTANCE_ID}"})`; const query = new SceneQueryRunner({ datasource, queries: [ @@ -22,44 +13,17 @@ export function getGrafanaMissedIterationsScene(datasource: DataSourceRef, panel refId: 'A', expr, range: true, - legendFormat: '{{rule_group}}', + legendFormat: '{{rule_title}}', }, ], }); - const legendTransformation: CustomTransformOperator = () => (source: Observable) => { - return source.pipe( - map((data: DataFrame[]) => { - return data.map((frame: DataFrame) => { - return { - ...frame, - fields: frame.fields.map((field) => { - const displayNameFromDs = field.config.displayNameFromDS || ''; - const matches = displayNameFromDs.match(/\/rules\/\d+\/(\w+);(\w+)/); - - if (matches) { - field.config.displayName = `Folder: ${matches[1]} - Group: ${matches[2]}`; - } - - return field; - }), - }; - }); - }) - ); - }; - - const transformation = new SceneDataTransformer({ - $data: query, - transformations: [legendTransformation], - }); - return new SceneFlexItem({ ...PANEL_STYLES, body: PanelBuilders.timeseries() .setTitle(panelTitle) - .setDescription('The number of missed iterations per evaluation group') - .setData(transformation) + .setDescription('The number of missed iterations per alert rule') + .setData(query) .setOption('tooltip', { mode: TooltipDisplayMode.Multi }) .setCustomFieldConfig('drawStyle', GraphDrawStyle.Line) .setHeaderActions([new InsightsMenuButton({ panel: panelTitle })])