{"version":3,"file":"AlertGroups.61716ade3d714651828e.js","mappings":"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","sources":["webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/AlertStateFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/GroupBy.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/AlertGroupFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useFilteredAmGroups.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useGroupedAlerts.ts","webpack://grafana/./public/app/features/alerting/unified/AlertGroups.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Authorize.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Strong.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/AlertDetails.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/AlertGroupAlertsTable.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/AlertGroup.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/AmAlertStateTag.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { RadioButtonGroup, Label } from '@grafana/ui';\nimport { AlertState } from 'app/plugins/datasource/alertmanager/types';\n\ninterface Props {\n stateFilter?: AlertState;\n onStateFilterChange: (value: AlertState) => void;\n}\n\nexport const AlertStateFilter = ({ onStateFilterChange, stateFilter }: Props) => {\n const alertStateOptions: SelectableValue[] = Object.entries(AlertState)\n .sort(([labelA], [labelB]) => (labelA < labelB ? -1 : 1))\n .map(([label, state]) => ({\n label,\n value: state,\n }));\n\n return (\n
\n \n \n
\n );\n};\n","import { uniq } from 'lodash';\nimport React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Icon, Label, MultiSelect } from '@grafana/ui';\nimport { AlertmanagerGroup } from 'app/plugins/datasource/alertmanager/types';\n\ninterface Props {\n groups: AlertmanagerGroup[];\n groupBy: string[];\n onGroupingChange: (keys: string[]) => void;\n}\n\nexport const GroupBy = ({ groups, groupBy, onGroupingChange }: Props) => {\n const labelKeyOptions = uniq(groups.flatMap((group) => group.alerts).flatMap(({ labels }) => Object.keys(labels)))\n .filter((label) => !(label.startsWith('__') && label.endsWith('__'))) // Filter out private labels\n .map((key) => ({\n label: key,\n value: key,\n }));\n\n return (\n
\n \n }\n onChange={(items) => {\n onGroupingChange(items.map(({ value }) => value as string));\n }}\n options={labelKeyOptions}\n width={34}\n />\n
\n );\n};\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, useStyles2 } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { AlertmanagerGroup, AlertState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { getFiltersFromUrlParams } from '../../utils/misc';\n\nimport { AlertStateFilter } from './AlertStateFilter';\nimport { GroupBy } from './GroupBy';\nimport { MatcherFilter } from './MatcherFilter';\n\ninterface Props {\n groups: AlertmanagerGroup[];\n}\n\nexport const AlertGroupFilter = ({ groups }: Props) => {\n const [filterKey, setFilterKey] = useState(Math.floor(Math.random() * 100));\n const [queryParams, setQueryParams] = useQueryParams();\n const { groupBy = [], queryString, alertState } = getFiltersFromUrlParams(queryParams);\n const matcherFilterKey = `matcher-${filterKey}`;\n\n const styles = useStyles2(getStyles);\n\n const clearFilters = () => {\n setQueryParams({\n groupBy: null,\n queryString: null,\n alertState: null,\n });\n setTimeout(() => setFilterKey(filterKey + 1), 100);\n };\n\n const showClearButton = !!(groupBy.length > 0 || queryString || alertState);\n\n return (\n
\n
\n setQueryParams({ queryString: value ? value : null })}\n />\n setQueryParams({ groupBy: keys.length ? keys.join(',') : null })}\n />\n setQueryParams({ alertState: value ? value : null })}\n />\n {showClearButton && (\n \n )}\n
\n
\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n border-bottom: 1px solid ${theme.colors.border.medium};\n margin-bottom: ${theme.spacing(3)};\n `,\n filterSection: css`\n display: flex;\n flex-direction: row;\n margin-bottom: ${theme.spacing(3)};\n gap: ${theme.spacing(1)};\n `,\n clearButton: css`\n margin-left: ${theme.spacing(1)};\n margin-top: 19px;\n `,\n});\n","import { useMemo } from 'react';\n\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { AlertmanagerGroup } from 'app/plugins/datasource/alertmanager/types';\n\nimport { labelsMatchMatchers, parseMatchers } from '../utils/alertmanager';\nimport { getFiltersFromUrlParams } from '../utils/misc';\n\nexport const useFilteredAmGroups = (groups: AlertmanagerGroup[]) => {\n const [queryParams] = useQueryParams();\n const filters = getFiltersFromUrlParams(queryParams);\n const matchers = parseMatchers(filters.queryString || '');\n\n return useMemo(() => {\n return groups.reduce((filteredGroup: AlertmanagerGroup[], group) => {\n const alerts = group.alerts.filter(({ labels, status }) => {\n const labelsMatch = labelsMatchMatchers(labels, matchers);\n const filtersMatch = filters.alertState ? status.state === filters.alertState : true;\n return labelsMatch && filtersMatch;\n });\n if (alerts.length > 0) {\n // The ungrouped alerts should be first in the results\n if (Object.keys(group.labels).length === 0) {\n filteredGroup.unshift({ ...group, alerts });\n } else {\n filteredGroup.push({ ...group, alerts });\n }\n }\n return filteredGroup;\n }, []);\n }, [groups, filters, matchers]);\n};\n","import { uniqBy } from 'lodash';\nimport { useMemo } from 'react';\n\nimport { Labels } from '@grafana/data';\nimport { AlertmanagerGroup } from 'app/plugins/datasource/alertmanager/types';\n\nexport const useGroupedAlerts = (groups: AlertmanagerGroup[], groupBy: string[]): AlertmanagerGroup[] => {\n return useMemo(() => {\n if (groupBy.length === 0) {\n const emptyGroupings = groups.filter((group) => Object.keys(group.labels).length === 0);\n if (emptyGroupings.length > 1) {\n // Merges multiple ungrouped grouping\n return groups.reduce((combinedGroups, group) => {\n if (Object.keys(group.labels).length === 0) {\n const noGroupingGroup = combinedGroups.find(({ labels }) => Object.keys(labels));\n if (!noGroupingGroup) {\n combinedGroups.push({ alerts: group.alerts, labels: {}, receiver: { name: 'NONE' } });\n } else {\n noGroupingGroup.alerts = uniqBy([...noGroupingGroup.alerts, ...group.alerts], 'labels');\n }\n } else {\n combinedGroups.push(group);\n }\n return combinedGroups;\n }, []);\n } else {\n return groups;\n }\n }\n const alerts = groups.flatMap(({ alerts }) => alerts);\n return alerts.reduce((groupings, alert) => {\n const alertContainsGroupings = groupBy.every((groupByLabel) => Object.keys(alert.labels).includes(groupByLabel));\n\n if (alertContainsGroupings) {\n const existingGrouping = groupings.find((group) => {\n return groupBy.every((groupKey) => {\n return group.labels[groupKey] === alert.labels[groupKey];\n });\n });\n if (!existingGrouping) {\n const labels = groupBy.reduce((acc, key) => {\n acc = { ...acc, [key]: alert.labels[key] };\n return acc;\n }, {});\n groupings.push({\n alerts: [alert],\n labels,\n receiver: {\n name: 'NONE',\n },\n });\n } else {\n existingGrouping.alerts.push(alert);\n }\n } else {\n const noGroupingGroup = groupings.find((group) => Object.keys(group.labels).length === 0);\n if (!noGroupingGroup) {\n groupings.push({ alerts: [alert], labels: {}, receiver: { name: 'NONE' } });\n } else {\n noGroupingGroup.alerts.push(alert);\n }\n }\n\n return groupings;\n }, []);\n }, [groups, groupBy]);\n};\n","import { css } from '@emotion/css';\nimport React, { useEffect } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Alert, LoadingPlaceholder, useStyles2 } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { useDispatch } from 'app/types';\n\nimport { AlertmanagerChoice } from '../../../plugins/datasource/alertmanager/types';\n\nimport { alertmanagerApi } from './api/alertmanagerApi';\nimport { AlertmanagerPageWrapper } from './components/AlertingPageWrapper';\nimport { AlertGroup } from './components/alert-groups/AlertGroup';\nimport { AlertGroupFilter } from './components/alert-groups/AlertGroupFilter';\nimport { useFilteredAmGroups } from './hooks/useFilteredAmGroups';\nimport { useGroupedAlerts } from './hooks/useGroupedAlerts';\nimport { useUnifiedAlertingSelector } from './hooks/useUnifiedAlertingSelector';\nimport { useAlertmanager } from './state/AlertmanagerContext';\nimport { fetchAlertGroupsAction } from './state/actions';\nimport { NOTIFICATIONS_POLL_INTERVAL_MS } from './utils/constants';\nimport { GRAFANA_RULES_SOURCE_NAME } from './utils/datasource';\nimport { getFiltersFromUrlParams } from './utils/misc';\nimport { initialAsyncRequestState } from './utils/redux';\n\nconst AlertGroups = () => {\n const { useGetAlertmanagerChoiceStatusQuery } = alertmanagerApi;\n\n const { selectedAlertmanager } = useAlertmanager();\n const dispatch = useDispatch();\n const [queryParams] = useQueryParams();\n const { groupBy = [] } = getFiltersFromUrlParams(queryParams);\n const styles = useStyles2(getStyles);\n\n const { currentData: amConfigStatus } = useGetAlertmanagerChoiceStatusQuery();\n\n const alertGroups = useUnifiedAlertingSelector((state) => state.amAlertGroups);\n const { loading, error, result: results = [] } = alertGroups[selectedAlertmanager || ''] ?? initialAsyncRequestState;\n\n const groupedAlerts = useGroupedAlerts(results, groupBy);\n const filteredAlertGroups = useFilteredAmGroups(groupedAlerts);\n\n const grafanaAmDeliveryDisabled =\n selectedAlertmanager === GRAFANA_RULES_SOURCE_NAME &&\n amConfigStatus?.alertmanagersChoice === AlertmanagerChoice.External;\n\n useEffect(() => {\n function fetchNotifications() {\n if (selectedAlertmanager) {\n dispatch(fetchAlertGroupsAction(selectedAlertmanager));\n }\n }\n fetchNotifications();\n const interval = setInterval(fetchNotifications, NOTIFICATIONS_POLL_INTERVAL_MS);\n return () => {\n clearInterval(interval);\n };\n }, [dispatch, selectedAlertmanager]);\n\n return (\n <>\n \n {loading && }\n {error && !loading && (\n \n {error.message || 'Unknown error'}\n \n )}\n\n {grafanaAmDeliveryDisabled && (\n \n Grafana is configured to send alerts to external alertmanagers only. No alerts are expected to be available\n here for the selected Alertmanager.\n \n )}\n\n {results &&\n filteredAlertGroups.map((group, index) => {\n return (\n \n {((index === 1 && Object.keys(filteredAlertGroups[0].labels).length === 0) ||\n (index === 0 && Object.keys(group.labels).length > 0)) && (\n

Grouped by: {Object.keys(group.labels).join(', ')}

\n )}\n \n
\n );\n })}\n {results && !filteredAlertGroups.length &&

No results.

}\n \n );\n};\n\nconst AlertGroupsPage = () => (\n \n \n \n);\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n groupingBanner: css`\n margin: ${theme.spacing(2, 0)};\n `,\n});\n\nexport default AlertGroupsPage;\n","import { chain, filter } from 'lodash';\nimport React, { PropsWithChildren } from 'react';\n\nimport {\n Abilities,\n Action,\n AlertingAction,\n AlertmanagerAction,\n useAlertingAbilities,\n useAllAlertmanagerAbilities,\n} from '../hooks/useAbilities';\n\ninterface AuthorizeProps extends PropsWithChildren {\n actions: AlertmanagerAction[] | AlertingAction[];\n}\n\nexport const Authorize = ({ actions, children }: AuthorizeProps) => {\n const alertmanagerActions = filter(actions, isAlertmanagerAction) as AlertmanagerAction[];\n const alertSourceActions = filter(actions, isAlertingAction) as AlertingAction[];\n\n if (alertmanagerActions.length) {\n return {children};\n }\n\n if (alertSourceActions.length) {\n return {children};\n }\n\n return null;\n};\n\ninterface ActionsProps extends PropsWithChildren {\n actions: T[];\n}\n\nconst AuthorizeAlertmanager = ({ actions, children }: ActionsProps) => {\n const alertmanagerAbilties = useAllAlertmanagerAbilities();\n const allowed = actionsAllowed(alertmanagerAbilties, actions);\n\n if (allowed) {\n return <>{children};\n } else {\n return null;\n }\n};\n\nconst AuthorizeAlertsource = ({ actions, children }: ActionsProps) => {\n const alertSourceAbilities = useAlertingAbilities();\n const allowed = actionsAllowed(alertSourceAbilities, actions);\n\n if (allowed) {\n return <>{children};\n } else {\n return null;\n }\n};\n\n// TODO add some authorize helper components for alert source and individual alert rules\n\n// check if some action is allowed from the abilities\nfunction actionsAllowed(abilities: Abilities, actions: T[]) {\n return chain(abilities)\n .pick(actions)\n .values()\n .value()\n .some(([_supported, allowed]) => allowed === true);\n}\n\nfunction isAlertmanagerAction(action: AlertmanagerAction) {\n return Object.values(AlertmanagerAction).includes(action);\n}\n\nfunction isAlertingAction(action: AlertingAction) {\n return Object.values(AlertingAction).includes(action);\n}\n","import React from 'react';\n\nimport { useTheme2 } from '@grafana/ui';\n\ninterface Props {}\n\nconst Strong = ({ children }: React.PropsWithChildren) => {\n const theme = useTheme2();\n return {children};\n};\n\nexport { Strong };\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { LinkButton, useStyles2 } from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AlertmanagerAlert, AlertState } from 'app/plugins/datasource/alertmanager/types';\nimport { AccessControlAction } from 'app/types';\n\nimport { AlertmanagerAction } from '../../hooks/useAbilities';\nimport { isGrafanaRulesSource } from '../../utils/datasource';\nimport { makeAMLink, makeLabelBasedSilenceLink } from '../../utils/misc';\nimport { AnnotationDetailsField } from '../AnnotationDetailsField';\nimport { Authorize } from '../Authorize';\n\ninterface AmNotificationsAlertDetailsProps {\n alertManagerSourceName: string;\n alert: AlertmanagerAlert;\n}\n\nexport const AlertDetails = ({ alert, alertManagerSourceName }: AmNotificationsAlertDetailsProps) => {\n const styles = useStyles2(getStyles);\n\n // For Grafana Managed alerts the Generator URL redirects to the alert rule edit page, so update permission is required\n // For external alert manager the Generator URL redirects to an external service which we don't control\n const isGrafanaSource = isGrafanaRulesSource(alertManagerSourceName);\n const isSeeSourceButtonEnabled = isGrafanaSource\n ? contextSrv.hasPermission(AccessControlAction.AlertingRuleRead)\n : true;\n\n return (\n <>\n
\n {alert.status.state === AlertState.Suppressed && (\n \n \n Manage silences\n \n \n )}\n {alert.status.state === AlertState.Active && (\n \n \n Silence\n \n \n )}\n {isSeeSourceButtonEnabled && alert.generatorURL && (\n \n See source\n \n )}\n
\n {Object.entries(alert.annotations).map(([annotationKey, annotationValue]) => (\n \n ))}\n
\n Receivers:{' '}\n {alert.receivers\n .map(({ name }) => name)\n .filter((name) => !!name)\n .join(', ')}\n
\n \n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n button: css`\n & + & {\n margin-left: ${theme.spacing(1)};\n }\n `,\n actionsRow: css`\n padding: ${theme.spacing(2, 0)} !important;\n border-bottom: 1px solid ${theme.colors.border.medium};\n `,\n receivers: css`\n padding: ${theme.spacing(1, 0)};\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { AlertmanagerAlert } from 'app/plugins/datasource/alertmanager/types';\n\nimport { AlertLabels } from '../AlertLabels';\nimport { DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\nimport { DynamicTableWithGuidelines } from '../DynamicTableWithGuidelines';\nimport { AmAlertStateTag } from '../silences/AmAlertStateTag';\n\nimport { AlertDetails } from './AlertDetails';\n\ninterface Props {\n alerts: AlertmanagerAlert[];\n alertManagerSourceName: string;\n}\n\ntype AlertGroupAlertsTableColumnProps = DynamicTableColumnProps;\ntype AlertGroupAlertsTableItemProps = DynamicTableItemProps;\n\nexport const AlertGroupAlertsTable = ({ alerts, alertManagerSourceName }: Props) => {\n const styles = useStyles2(getStyles);\n\n const columns = useMemo(\n (): AlertGroupAlertsTableColumnProps[] => [\n {\n id: 'state',\n label: 'State',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: alert }) => (\n <>\n \n \n for{' '}\n {intervalToAbbreviatedDurationString({\n start: new Date(alert.startsAt),\n end: new Date(alert.endsAt),\n })}\n \n \n ),\n size: '220px',\n },\n {\n id: 'labels',\n label: 'Labels',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: { labels } }) => ,\n size: 1,\n },\n ],\n [styles]\n );\n\n const items = useMemo(\n (): AlertGroupAlertsTableItemProps[] =>\n alerts.map((alert) => ({\n id: alert.fingerprint,\n data: alert,\n })),\n [alerts]\n );\n\n return (\n
\n (\n \n )}\n />\n
\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n tableWrapper: css`\n margin-top: ${theme.spacing(3)};\n ${theme.breakpoints.up('md')} {\n margin-left: ${theme.spacing(4.5)};\n }\n `,\n duration: css`\n margin-left: ${theme.spacing(1)};\n font-size: ${theme.typography.bodySmall.fontSize};\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, Stack } from '@grafana/ui';\nimport { AlertmanagerGroup, AlertState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { AlertLabels } from '../AlertLabels';\nimport { CollapseToggle } from '../CollapseToggle';\nimport { MetaText } from '../MetaText';\nimport { Strong } from '../Strong';\n\nimport { AlertGroupAlertsTable } from './AlertGroupAlertsTable';\nimport { AlertGroupHeader } from './AlertGroupHeader';\n\ninterface Props {\n group: AlertmanagerGroup;\n alertManagerSourceName: string;\n}\n\nexport const AlertGroup = ({ alertManagerSourceName, group }: Props) => {\n const [isCollapsed, setIsCollapsed] = useState(true);\n const styles = useStyles2(getStyles);\n // When group is grouped, receiver.name is 'NONE' as it can contain multiple receivers\n const receiverInGroup = group.receiver.name !== 'NONE';\n return (\n
\n
\n
\n setIsCollapsed(!isCollapsed)}\n data-testid=\"alert-group-collapse-toggle\"\n />\n {Object.keys(group.labels).length ? (\n \n \n {receiverInGroup && (\n \n Delivered to {group.receiver.name}\n \n )}\n \n ) : (\n No grouping\n )}\n
\n \n
\n {!isCollapsed && }\n
\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n '& + &': {\n marginTop: theme.spacing(2),\n },\n }),\n header: css({\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${theme.spacing(1)} ${theme.spacing(1)} ${theme.spacing(1)} 0`,\n backgroundColor: theme.colors.background.secondary,\n width: '100%',\n }),\n group: css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n }),\n summary: css({}),\n [AlertState.Active]: css({\n color: theme.colors.error.main,\n }),\n [AlertState.Suppressed]: css({\n color: theme.colors.primary.main,\n }),\n [AlertState.Unprocessed]: css({\n color: theme.colors.secondary.main,\n }),\n});\n","import React from 'react';\n\nimport { AlertState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { State, StateTag } from '../StateTag';\n\nconst alertStateToState: Record = {\n [AlertState.Active]: 'bad',\n [AlertState.Unprocessed]: 'neutral',\n [AlertState.Suppressed]: 'info',\n};\n\ninterface Props {\n state: AlertState;\n}\n\nexport const AmAlertStateTag = ({ state }: Props) => {state};\n"],"names":["AlertStateFilter","onStateFilterChange","stateFilter","alertStateOptions","labelA","labelB","label","state","Label","RadioButtonGroup","GroupBy","groups","groupBy","onGroupingChange","labelKeyOptions","group","labels","key","Icon","items","value","AlertGroupFilter","filterKey","setFilterKey","queryParams","setQueryParams","useQueryParams","queryString","alertState","matcherFilterKey","styles","getStyles","clearFilters","showClearButton","MatcherFilter","keys","Button","theme","useFilteredAmGroups","filters","matchers","filteredGroup","alerts","status","labelsMatch","filtersMatch","useGroupedAlerts","combinedGroups","noGroupingGroup","groupings","alert","groupByLabel","existingGrouping","groupKey","acc","AlertGroups","useGetAlertmanagerChoiceStatusQuery","alertmanagerApi","selectedAlertmanager","dispatch","amConfigStatus","alertGroups","useUnifiedAlertingSelector","loading","error","results","groupedAlerts","filteredAlertGroups","grafanaAmDeliveryDisabled","fetchNotifications","interval","LoadingPlaceholder","Alert","index","AlertGroup","AlertGroupsPage","Authorize","actions","children","alertmanagerActions","isAlertmanagerAction","alertSourceActions","isAlertingAction","AuthorizeAlertmanager","AuthorizeAlertsource","alertmanagerAbilties","actionsAllowed","alertSourceAbilities","abilities","_supported","allowed","action","Strong","AlertDetails","alertManagerSourceName","isSeeSourceButtonEnabled","annotationKey","annotationValue","AnnotationDetailsField","name","AlertGroupAlertsTable","columns","AmAlertStateTag","AlertLabels","DynamicTableWithGuidelines","isCollapsed","setIsCollapsed","receiverInGroup","CollapseToggle","Stack","MetaText","AlertGroupHeader","alertStateToState"],"sourceRoot":""}