mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Add notification policies preview in alert rule form
Co-authored-by: Konrad Lalik <konrad.lalik@grafana.com>
* Refactor using new useGetPotentialInstances hook and apply some style changes
* Add notification policy detail modal
* Use backtesting api for simulating potential alert instances
* Fix logic to travserse all the children from the root route
* Split notification preview by alert manager
* Add instance count to matching policy header and fix some styles
* Move some logic to a new hook useGetAlertManagersSourceNames to make the code more clean
* Fix some tests
* Add initial test for NotificationPreview
* Use button to preview potential instances
* Add link to contact point details
* Add route matching result details
* Show AlertManager image in the routing preview list
* Add tests setup, add single AM preview test
* Handle no matchers and no labels use case
* Update some style in collapse component and fix policy path in modal
* Update modal styles
* Update styles
* Update collapse header styling
* Normalize tree nodes should happen before findMatchingRoutes call
* Fix findMatchingRoutes and findMatchingAlertGroups methods after reabasing
* Move instances matching to the web worker code
* Fix config fetching for vanilla prometheus AMs
* Add tests
* Add tests mocks
* Fix tests after adding web worker
* Display matching labels for each matching alert instance
* Add minor css improvements
* Revert changes added in Collapse component as we don't use it anymore
* Move the route details modal to a separate file
* Move NotificationRoute and preview hook into separate files
* Fix Alertmanager preview tests
* Fix tests
* Move matcher code to a separate file, improve matcher mock
* Add permissions control for contact point edit view link
* Fix from and to for the temporal use of backtesting api
* Fix tests, add lazy loading of the preview component
Co-authored-by: Sonia Aguilar <soniaaguilarpeiron@gmail.com>
* Fix preview test
* Add onclick on the header div so it collapse and expands when clicking on it, and update styles to be consistent with the rest of tables
* Adapt the code to the new rule testing endpoint definition
* Fix tests
* small changes after reviewing the final code
* compute entire inherited tree before computing the routes map
* Throw error in case of not having receiver in routesByIdMap and add test for the use case of inheriting receiver from parent to check UI throws no errors
* Add list of labels in the policy route path that produces the policy matchers to match potential instances
* Use color determined by the key, in label tags when hovering matchers in the policy tree
* Remove labels in modal and handle empty string as receiver to inherit from parent as we do with undefined
* Revert "Add list of labels in the policy route path that produces the policy matchers to match potential instances"
This reverts commit ee73ae9cf9.
* fix inheritance for computeInheritedTree
* Fix message shown when preview has not been executed yet
* First round for adressing PR review comments
* Adress the rest of PR review commments
* Update texts and rename id prop in NotificaitonStep to alertUid
---------
Co-authored-by: Konrad Lalik <konrad.lalik@grafana.com>
Co-authored-by: Gilles De Mey <gilles.de.mey@gmail.com>
55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
import { AlertmanagerGroup, RouteWithID } from '../../../plugins/datasource/alertmanager/types';
|
|
import { Labels } from '../../../types/unified-alerting-dto';
|
|
|
|
import {
|
|
AlertInstanceMatch,
|
|
findMatchingAlertGroups,
|
|
findMatchingRoutes,
|
|
normalizeRoute,
|
|
} from './utils/notification-policies';
|
|
|
|
export const routeGroupsMatcher = {
|
|
getRouteGroupsMap(rootRoute: RouteWithID, groups: AlertmanagerGroup[]): Map<string, AlertmanagerGroup[]> {
|
|
const normalizedRootRoute = normalizeRoute(rootRoute);
|
|
|
|
function addRouteGroups(route: RouteWithID, acc: Map<string, AlertmanagerGroup[]>) {
|
|
const routeGroups = findMatchingAlertGroups(normalizedRootRoute, route, groups);
|
|
acc.set(route.id, routeGroups);
|
|
|
|
route.routes?.forEach((r) => addRouteGroups(r, acc));
|
|
}
|
|
|
|
const routeGroupsMap = new Map<string, AlertmanagerGroup[]>();
|
|
addRouteGroups(normalizedRootRoute, routeGroupsMap);
|
|
|
|
return routeGroupsMap;
|
|
},
|
|
|
|
matchInstancesToRoute(routeTree: RouteWithID, instancesToMatch: Labels[]): Map<string, AlertInstanceMatch[]> {
|
|
const result = new Map<string, AlertInstanceMatch[]>();
|
|
|
|
const normalizedRootRoute = normalizeRoute(routeTree);
|
|
|
|
instancesToMatch.forEach((instance) => {
|
|
const matchingRoutes = findMatchingRoutes(normalizedRootRoute, Object.entries(instance));
|
|
matchingRoutes.forEach(({ route, details, labelsMatch }) => {
|
|
// Only to convert Label[] to Labels[] - needs better approach
|
|
const matchDetails = new Map(
|
|
Array.from(details.entries()).map(([matcher, labels]) => [matcher, Object.fromEntries(labels)])
|
|
);
|
|
|
|
const currentRoute = result.get(route.id);
|
|
if (currentRoute) {
|
|
currentRoute.push({ instance, matchDetails, labelsMatch });
|
|
} else {
|
|
result.set(route.id, [{ instance, matchDetails, labelsMatch }]);
|
|
}
|
|
});
|
|
});
|
|
|
|
return result;
|
|
},
|
|
};
|
|
|
|
export type RouteGroupsMatcher = typeof routeGroupsMatcher;
|