AlertGroups.98ab02c233dab193b78e.js.map 48 KB

1
  1. {"version":3,"file":"AlertGroups.98ab02c233dab193b78e.js","mappings":"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","sources":["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/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/AlertGroups.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useGroupedAlerts.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useFilteredAmGroups.ts","webpack://grafana/./public/app/features/alerting/unified/components/AlertingPageWrapper.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Authorize.tsx","webpack://grafana/./public/app/features/alerting/unified/components/DynamicTableWithGuidelines.tsx","webpack://grafana/./public/app/features/alerting/unified/components/NoAlertManagerWarning.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/MatcherFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/AmAlertStateTag.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useAlertManagerSourceName.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useAlertManagerSources.ts"],"sourcesContent":["import { css } from '@emotion/css';\nimport React, { FC } 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 { getInstancesPermissions } from '../../utils/access-control';\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: FC<AmNotificationsAlertDetailsProps> = ({ alert, alertManagerSourceName }) => {\n const styles = useStyles2(getStyles);\n const instancePermissions = getInstancesPermissions(alertManagerSourceName);\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 <div className={styles.actionsRow}>\n <Authorize actions={[instancePermissions.update, instancePermissions.create]} fallback={contextSrv.isEditor}>\n {alert.status.state === AlertState.Suppressed && (\n <LinkButton\n href={`${makeAMLink(\n '/alerting/silences',\n alertManagerSourceName\n )}&silenceIds=${alert.status.silencedBy.join(',')}`}\n className={styles.button}\n icon={'bell'}\n size={'sm'}\n >\n Manage silences\n </LinkButton>\n )}\n {alert.status.state === AlertState.Active && (\n <LinkButton\n href={makeLabelBasedSilenceLink(alertManagerSourceName, alert.labels)}\n className={styles.button}\n icon={'bell-slash'}\n size={'sm'}\n >\n Silence\n </LinkButton>\n )}\n </Authorize>\n {isSeeSourceButtonEnabled && alert.generatorURL && (\n <LinkButton className={styles.button} href={alert.generatorURL} icon={'chart-line'} size={'sm'}>\n See source\n </LinkButton>\n )}\n </div>\n {Object.entries(alert.annotations).map(([annotationKey, annotationValue]) => (\n <AnnotationDetailsField key={annotationKey} annotationKey={annotationKey} value={annotationValue} />\n ))}\n <div className={styles.receivers}>\n Receivers:{' '}\n {alert.receivers\n .map(({ name }) => name)\n .filter((name) => !!name)\n .join(', ')}\n </div>\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<AlertmanagerAlert>;\ntype AlertGroupAlertsTableItemProps = DynamicTableItemProps<AlertmanagerAlert>;\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 <AmAlertStateTag state={alert.status.state} />\n <span className={styles.duration}>\n for{' '}\n {intervalToAbbreviatedDurationString({\n start: new Date(alert.startsAt),\n end: new Date(alert.endsAt),\n })}\n </span>\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 } }) => <AlertLabels className={styles.labels} labels={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 <div className={styles.tableWrapper} data-testid=\"alert-group-table\">\n <DynamicTableWithGuidelines\n cols={columns}\n items={items}\n isExpandable={true}\n renderExpandedContent={({ data: alert }) => (\n <AlertDetails alert={alert} alertManagerSourceName={alertManagerSourceName} />\n )}\n />\n </div>\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 labels: css`\n padding-bottom: 0;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { AlertmanagerGroup, AlertState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { AlertLabels } from '../AlertLabels';\nimport { CollapseToggle } from '../CollapseToggle';\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<boolean>(true);\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n <div className={styles.header}>\n <div className={styles.group} data-testid=\"alert-group\">\n <CollapseToggle\n isCollapsed={isCollapsed}\n onToggle={() => setIsCollapsed(!isCollapsed)}\n data-testid=\"alert-group-collapse-toggle\"\n />\n {Object.keys(group.labels).length ? (\n <AlertLabels className={styles.headerLabels} labels={group.labels} />\n ) : (\n <span>No grouping</span>\n )}\n </div>\n <AlertGroupHeader group={group} />\n </div>\n {!isCollapsed && <AlertGroupAlertsTable alertManagerSourceName={alertManagerSourceName} alerts={group.alerts} />}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n & + & {\n margin-top: ${theme.spacing(2)};\n }\n `,\n headerLabels: css`\n padding-bottom: 0 !important;\n margin-bottom: -${theme.spacing(0.5)};\n `,\n header: css`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: ${theme.spacing(1, 1, 1, 0)};\n background-color: ${theme.colors.background.secondary};\n width: 100%;\n `,\n group: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n `,\n summary: css``,\n spanElement: css`\n margin-left: ${theme.spacing(0.5)};\n `,\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 { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { RadioButtonGroup, Label, useStyles2 } 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 styles = useStyles2(getStyles);\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 <div className={styles.wrapper}>\n <Label>State</Label>\n <RadioButtonGroup options={alertStateOptions} value={stateFilter} onChange={onStateFilterChange} />\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n margin-left: ${theme.spacing(1)};\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 className?: string;\n groups: AlertmanagerGroup[];\n groupBy: string[];\n onGroupingChange: (keys: string[]) => void;\n}\n\nexport const GroupBy = ({ className, 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<SelectableValue>((key) => ({\n label: key,\n value: key,\n }));\n\n return (\n <div data-testid={'group-by-container'} className={className}>\n <Label>Custom group by</Label>\n <MultiSelect\n aria-label={'group by label keys'}\n value={groupBy}\n placeholder=\"Group by\"\n prefix={<Icon name={'tag-alt'} />}\n onChange={(items) => {\n onGroupingChange(items.map(({ value }) => value as string));\n }}\n options={labelKeyOptions}\n />\n </div>\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 { useAlertManagerSourceName } from '../../hooks/useAlertManagerSourceName';\nimport { useAlertManagersByPermission } from '../../hooks/useAlertManagerSources';\nimport { getFiltersFromUrlParams } from '../../utils/misc';\nimport { AlertManagerPicker } from '../AlertManagerPicker';\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<number>(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 alertManagers = useAlertManagersByPermission('instance');\n const [alertManagerSourceName, setAlertManagerSourceName] = useAlertManagerSourceName(alertManagers);\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 <div className={styles.wrapper}>\n <AlertManagerPicker\n current={alertManagerSourceName}\n onChange={setAlertManagerSourceName}\n dataSources={alertManagers}\n />\n <div className={styles.filterSection}>\n <MatcherFilter\n className={styles.filterInput}\n key={matcherFilterKey}\n defaultQueryString={queryString}\n onFilterChange={(value) => setQueryParams({ queryString: value ? value : null })}\n />\n <GroupBy\n className={styles.filterInput}\n groups={groups}\n groupBy={groupBy}\n onGroupingChange={(keys) => setQueryParams({ groupBy: keys.length ? keys.join(',') : null })}\n />\n <AlertStateFilter\n stateFilter={alertState as AlertState}\n onStateFilterChange={(value) => setQueryParams({ alertState: value ? value : null })}\n />\n {showClearButton && (\n <Button className={styles.clearButton} variant={'secondary'} icon=\"times\" onClick={clearFilters}>\n Clear filters\n </Button>\n )}\n </div>\n </div>\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 `,\n filterInput: css`\n width: 340px;\n & + & {\n margin-left: ${theme.spacing(1)};\n }\n `,\n clearButton: css`\n margin-left: ${theme.spacing(1)};\n margin-top: 19px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Alert, LoadingPlaceholder, useStyles2 } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\n\nimport { AlertingPageWrapper } from './components/AlertingPageWrapper';\nimport { NoAlertManagerWarning } from './components/NoAlertManagerWarning';\nimport { AlertGroup } from './components/alert-groups/AlertGroup';\nimport { AlertGroupFilter } from './components/alert-groups/AlertGroupFilter';\nimport { useAlertManagerSourceName } from './hooks/useAlertManagerSourceName';\nimport { useAlertManagersByPermission } from './hooks/useAlertManagerSources';\nimport { useFilteredAmGroups } from './hooks/useFilteredAmGroups';\nimport { useGroupedAlerts } from './hooks/useGroupedAlerts';\nimport { useUnifiedAlertingSelector } from './hooks/useUnifiedAlertingSelector';\nimport { fetchAlertGroupsAction } from './state/actions';\nimport { NOTIFICATIONS_POLL_INTERVAL_MS } from './utils/constants';\nimport { getFiltersFromUrlParams } from './utils/misc';\nimport { initialAsyncRequestState } from './utils/redux';\n\nconst AlertGroups = () => {\n const alertManagers = useAlertManagersByPermission('instance');\n const [alertManagerSourceName] = useAlertManagerSourceName(alertManagers);\n const dispatch = useDispatch();\n const [queryParams] = useQueryParams();\n const { groupBy = [] } = getFiltersFromUrlParams(queryParams);\n const styles = useStyles2(getStyles);\n\n const alertGroups = useUnifiedAlertingSelector((state) => state.amAlertGroups);\n const {\n loading,\n error,\n result: results = [],\n } = alertGroups[alertManagerSourceName || ''] ?? initialAsyncRequestState;\n\n const groupedAlerts = useGroupedAlerts(results, groupBy);\n const filteredAlertGroups = useFilteredAmGroups(groupedAlerts);\n\n useEffect(() => {\n function fetchNotifications() {\n if (alertManagerSourceName) {\n dispatch(fetchAlertGroupsAction(alertManagerSourceName));\n }\n }\n fetchNotifications();\n const interval = setInterval(fetchNotifications, NOTIFICATIONS_POLL_INTERVAL_MS);\n return () => {\n clearInterval(interval);\n };\n }, [dispatch, alertManagerSourceName]);\n\n if (!alertManagerSourceName) {\n return (\n <AlertingPageWrapper pageId=\"groups\">\n <NoAlertManagerWarning availableAlertManagers={alertManagers} />\n </AlertingPageWrapper>\n );\n }\n\n return (\n <AlertingPageWrapper pageId=\"groups\">\n <AlertGroupFilter groups={results} />\n {loading && <LoadingPlaceholder text=\"Loading notifications\" />}\n {error && !loading && (\n <Alert title={'Error loading notifications'} severity={'error'}>\n {error.message || 'Unknown error'}\n </Alert>\n )}\n {results &&\n filteredAlertGroups.map((group, index) => {\n return (\n <React.Fragment key={`${JSON.stringify(group.labels)}-group-${index}`}>\n {((index === 1 && Object.keys(filteredAlertGroups[0].labels).length === 0) ||\n (index === 0 && Object.keys(group.labels).length > 0)) && (\n <p className={styles.groupingBanner}>Grouped by: {Object.keys(group.labels).join(', ')}</p>\n )}\n <AlertGroup alertManagerSourceName={alertManagerSourceName || ''} group={group} />\n </React.Fragment>\n );\n })}\n {results && !filteredAlertGroups.length && <p>No results.</p>}\n </AlertingPageWrapper>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n groupingBanner: css`\n margin: ${theme.spacing(2, 0)};\n `,\n});\n\nexport default AlertGroups;\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 }, [] as AlertmanagerGroup[]);\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 }, {} as Labels);\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 }, [] as AlertmanagerGroup[]);\n }, [groups, groupBy]);\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 React, { FC } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport Page from 'app/core/components/Page/Page';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { StoreState } from 'app/types/store';\n\ninterface Props {\n pageId: string;\n isLoading?: boolean;\n}\n\nexport const AlertingPageWrapper: FC<Props> = ({ children, pageId, isLoading }) => {\n const navModel = getNavModel(\n useSelector((state: StoreState) => state.navIndex),\n pageId\n );\n\n return (\n <Page navModel={navModel}>\n <Page.Contents isLoading={isLoading}>{children}</Page.Contents>\n </Page>\n );\n};\n","import React, { FC } from 'react';\n\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction } from 'app/types';\n\ntype Props = {\n actions: AccessControlAction[];\n fallback?: boolean;\n};\n\nexport const Authorize: FC<Props> = ({ actions, children, fallback = true }) => {\n if (actions.some((action) => contextSrv.hasAccess(action, fallback))) {\n return <>{children}</>;\n } else {\n return null;\n }\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { DynamicTable, DynamicTableProps } from './DynamicTable';\n\nexport type DynamicTableWithGuidelinesProps<T> = Omit<DynamicTableProps<T>, 'renderPrefixHeader, renderPrefixCell'>;\n\n// DynamicTable, but renders visual guidelines on the left, for larger screen widths\nexport const DynamicTableWithGuidelines = <T extends object>({\n renderExpandedContent,\n ...props\n}: DynamicTableWithGuidelinesProps<T>) => {\n const styles = useStyles2(getStyles);\n return (\n <DynamicTable\n renderExpandedContent={\n renderExpandedContent\n ? (item, index, items) => (\n <>\n {!(index === items.length - 1) && <div className={cx(styles.contentGuideline, styles.guideline)} />}\n {renderExpandedContent(item, index, items)}\n </>\n )\n : undefined\n }\n renderPrefixHeader={() => (\n <div className={styles.relative}>\n <div className={cx(styles.headerGuideline, styles.guideline)} />\n </div>\n )}\n renderPrefixCell={(_, index, items) => (\n <div className={styles.relative}>\n <div className={cx(styles.topGuideline, styles.guideline)} />\n {!(index === items.length - 1) && <div className={cx(styles.bottomGuideline, styles.guideline)} />}\n </div>\n )}\n {...props}\n />\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n relative: css`\n position: relative;\n height: 100%;\n `,\n guideline: css`\n left: -19px;\n border-left: 1px solid ${theme.colors.border.medium};\n position: absolute;\n\n ${theme.breakpoints.down('md')} {\n display: none;\n }\n `,\n topGuideline: css`\n width: 18px;\n border-bottom: 1px solid ${theme.colors.border.medium};\n top: 0;\n bottom: 50%;\n `,\n bottomGuideline: css`\n top: 50%;\n bottom: 0;\n `,\n contentGuideline: css`\n top: 0;\n bottom: 0;\n left: -49px !important;\n `,\n headerGuideline: css`\n top: -25px;\n bottom: 0;\n `,\n});\n","import React from 'react';\n\nimport { Alert } from '@grafana/ui';\n\nimport { useAlertManagerSourceName } from '../hooks/useAlertManagerSourceName';\nimport { AlertManagerDataSource } from '../utils/datasource';\n\nimport { AlertManagerPicker } from './AlertManagerPicker';\n\ninterface Props {\n availableAlertManagers: AlertManagerDataSource[];\n}\n\nconst NoAlertManagersAvailable = () => (\n <Alert title=\"No Alertmanager found\" severity=\"warning\">\n We could not find any external Alertmanagers and you may not have access to the built-in Grafana Alertmanager.\n </Alert>\n);\n\nconst OtherAlertManagersAvailable = () => (\n <Alert title=\"Selected Alertmanager not found. Select a different Alertmanager.\" severity=\"warning\">\n Selected Alertmanager no longer exists or you may not have permission to access it.\n </Alert>\n);\n\nexport const NoAlertManagerWarning = ({ availableAlertManagers }: Props) => {\n const [_, setAlertManagerSourceName] = useAlertManagerSourceName(availableAlertManagers);\n const hasOtherAMs = availableAlertManagers.length > 0;\n\n return (\n <div>\n {hasOtherAMs ? (\n <>\n <AlertManagerPicker onChange={setAlertManagerSourceName} dataSources={availableAlertManagers} />\n <OtherAlertManagersAvailable />\n </>\n ) : (\n <NoAlertManagersAvailable />\n )}\n </div>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { FormEvent } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Label, Tooltip, Input, Icon, useStyles2 } from '@grafana/ui';\n\ninterface Props {\n className?: string;\n queryString?: string;\n defaultQueryString?: string;\n onFilterChange: (filterString: string) => void;\n}\n\nexport const MatcherFilter = ({ className, onFilterChange, defaultQueryString, queryString }: Props) => {\n const styles = useStyles2(getStyles);\n const handleSearchChange = (e: FormEvent<HTMLInputElement>) => {\n const target = e.target as HTMLInputElement;\n onFilterChange(target.value);\n };\n const searchIcon = <Icon name={'search'} />;\n return (\n <div className={className}>\n <Label>\n <Stack gap={0.5}>\n <span>Search by label</span>\n <Tooltip\n content={\n <div>\n Filter alerts using label querying, ex:\n <pre>{`{severity=\"critical\", instance=~\"cluster-us-.+\"}`}</pre>\n </div>\n }\n >\n <Icon className={styles.icon} name=\"info-circle\" size=\"sm\" />\n </Tooltip>\n </Stack>\n </Label>\n <Input\n placeholder=\"Search\"\n defaultValue={defaultQueryString}\n value={queryString}\n onChange={handleSearchChange}\n data-testid=\"search-query-input\"\n prefix={searchIcon}\n className={styles.inputWidth}\n />\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n icon: css`\n margin-right: ${theme.spacing(0.5)};\n `,\n inputWidth: css`\n width: 340px;\n flex-grow: 0;\n `,\n});\n","import React, { FC } from 'react';\n\nimport { AlertState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { State, StateTag } from '../StateTag';\n\nconst alertStateToState: Record<AlertState, State> = {\n [AlertState.Active]: 'bad',\n [AlertState.Unprocessed]: 'neutral',\n [AlertState.Suppressed]: 'info',\n};\n\ninterface Props {\n state: AlertState;\n}\n\nexport const AmAlertStateTag: FC<Props> = ({ state }) => <StateTag state={alertStateToState[state]}>{state}</StateTag>;\n","import { useCallback } from 'react';\n\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport store from 'app/core/store';\n\nimport { ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, ALERTMANAGER_NAME_QUERY_KEY } from '../utils/constants';\nimport { AlertManagerDataSource, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\nfunction useIsAlertManagerAvailable(availableAlertManagers: AlertManagerDataSource[]) {\n return useCallback(\n (alertManagerName: string) => {\n const availableAlertManagersNames = availableAlertManagers.map((am) => am.name);\n return availableAlertManagersNames.includes(alertManagerName);\n },\n [availableAlertManagers]\n );\n}\n\n/* This will return am name either from query params or from local storage or a default (grafana).\n * Due to RBAC permissions Grafana Managed Alert manager or external alert managers may not be available\n * In the worst case neihter GMA nor external alert manager is available\n */\nexport function useAlertManagerSourceName(\n availableAlertManagers: AlertManagerDataSource[]\n): [string | undefined, (alertManagerSourceName: string) => void] {\n const [queryParams, updateQueryParams] = useQueryParams();\n const isAlertManagerAvailable = useIsAlertManagerAvailable(availableAlertManagers);\n\n const update = useCallback(\n (alertManagerSourceName: string) => {\n if (!isAlertManagerAvailable(alertManagerSourceName)) {\n return;\n }\n if (alertManagerSourceName === GRAFANA_RULES_SOURCE_NAME) {\n store.delete(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);\n updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: null });\n } else {\n store.set(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, alertManagerSourceName);\n updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: alertManagerSourceName });\n }\n },\n [updateQueryParams, isAlertManagerAvailable]\n );\n\n const querySource = queryParams[ALERTMANAGER_NAME_QUERY_KEY];\n\n if (querySource && typeof querySource === 'string') {\n if (isAlertManagerAvailable(querySource)) {\n return [querySource, update];\n } else {\n // non existing alertmanager\n return [undefined, update];\n }\n }\n\n const storeSource = store.get(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);\n if (storeSource && typeof storeSource === 'string' && isAlertManagerAvailable(storeSource)) {\n update(storeSource);\n return [storeSource, update];\n }\n\n if (isAlertManagerAvailable(GRAFANA_RULES_SOURCE_NAME)) {\n return [GRAFANA_RULES_SOURCE_NAME, update];\n }\n\n return [undefined, update];\n}\n","import { useMemo } from 'react';\n\nimport { getAlertManagerDataSourcesByPermission } from '../utils/datasource';\n\nexport function useAlertManagersByPermission(accessType: 'instance' | 'notification') {\n return useMemo(() => getAlertManagerDataSourcesByPermission(accessType), [accessType]);\n}\n"],"names":["AlertDetails","alert","alertManagerSourceName","styles","useStyles2","getStyles","instancePermissions","getInstancesPermissions","isSeeSourceButtonEnabled","isGrafanaRulesSource","contextSrv","AccessControlAction","className","actionsRow","Authorize","actions","update","create","fallback","status","state","AlertState","LinkButton","href","makeAMLink","silencedBy","join","button","icon","size","makeLabelBasedSilenceLink","labels","generatorURL","Object","entries","annotations","map","annotationKey","annotationValue","AnnotationDetailsField","value","receivers","name","filter","theme","css","spacing","colors","border","medium","AlertGroupAlertsTable","alerts","columns","useMemo","id","label","renderCell","data","AmAlertStateTag","duration","intervalToAbbreviatedDurationString","start","Date","startsAt","end","endsAt","AlertLabels","items","fingerprint","tableWrapper","DynamicTableWithGuidelines","cols","isExpandable","renderExpandedContent","breakpoints","up","typography","bodySmall","fontSize","AlertGroup","group","isCollapsed","setIsCollapsed","useState","wrapper","header","CollapseToggle","onToggle","keys","length","headerLabels","AlertGroupHeader","background","secondary","summary","spanElement","error","main","primary","AlertStateFilter","onStateFilterChange","stateFilter","alertStateOptions","sort","labelA","labelB","Label","RadioButtonGroup","options","onChange","GroupBy","groups","groupBy","onGroupingChange","labelKeyOptions","uniq","flatMap","startsWith","endsWith","key","MultiSelect","placeholder","prefix","Icon","AlertGroupFilter","filterKey","setFilterKey","Math","floor","random","queryParams","setQueryParams","useQueryParams","queryString","alertState","getFiltersFromUrlParams","matcherFilterKey","alertManagers","useAlertManagersByPermission","setAlertManagerSourceName","useAlertManagerSourceName","showClearButton","AlertManagerPicker","current","dataSources","filterSection","MatcherFilter","filterInput","defaultQueryString","onFilterChange","Button","clearButton","variant","onClick","setTimeout","groupingBanner","dispatch","useDispatch","alertGroups","useUnifiedAlertingSelector","amAlertGroups","loading","result","results","initialAsyncRequestState","groupedAlerts","reduce","combinedGroups","noGroupingGroup","find","uniqBy","push","receiver","groupings","every","groupByLabel","includes","existingGrouping","groupKey","acc","useGroupedAlerts","filteredAlertGroups","filters","matchers","parseMatchers","filteredGroup","labelsMatch","labelsMatchMatchers","filtersMatch","unshift","useFilteredAmGroups","useEffect","fetchNotifications","fetchAlertGroupsAction","interval","setInterval","NOTIFICATIONS_POLL_INTERVAL_MS","clearInterval","AlertingPageWrapper","pageId","LoadingPlaceholder","text","Alert","title","severity","message","index","JSON","stringify","NoAlertManagerWarning","availableAlertManagers","children","isLoading","navModel","getNavModel","useSelector","navIndex","some","action","props","item","cx","contentGuideline","guideline","undefined","renderPrefixHeader","relative","headerGuideline","renderPrefixCell","_","topGuideline","bottomGuideline","down","NoAlertManagersAvailable","OtherAlertManagersAvailable","hasOtherAMs","searchIcon","Stack","gap","Tooltip","content","Input","defaultValue","e","target","inputWidth","alertStateToState","updateQueryParams","isAlertManagerAvailable","useCallback","alertManagerName","am","useIsAlertManagerAvailable","GRAFANA_RULES_SOURCE_NAME","store","ALERTMANAGER_NAME_LOCAL_STORAGE_KEY","ALERTMANAGER_NAME_QUERY_KEY","querySource","storeSource","accessType","getAlertManagerDataSourcesByPermission"],"sourceRoot":""}