{"version":3,"file":"7062.514b9f883c4674c6d370.js","mappings":"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","sources":["webpack://grafana/./public/app/features/alerting/unified/components/Provisioning.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/MatcherFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/StateHistory.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useManagedAlertStateHistory.ts","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsActionButtons.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useStateHistoryModal.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsAnnotations.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsDataSources.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Expression.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsExpression.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsMatchingInstances.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleHealth.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleState.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useCombinedRuleNamespaces.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useFolder.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useIsRuleEditable.ts"],"sourcesContent":["import React from 'react';\n\nimport { Alert, Badge } from '@grafana/ui';\n\nexport enum ProvisionedResource {\n ContactPoint = 'contact point',\n Template = 'template',\n MuteTiming = 'mute timing',\n AlertRule = 'alert rule',\n RootNotificationPolicy = 'root notification policy',\n}\n\ninterface ProvisioningAlertProps {\n resource: ProvisionedResource;\n}\n\nexport const ProvisioningAlert = ({ resource }: ProvisioningAlertProps) => {\n return (\n \n This {resource} has been provisioned, that means it was created by config. Please contact your server admin to\n update this {resource}.\n \n );\n};\n\nexport const ProvisioningBadge = () => {\n return ;\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) => {\n const target = e.target as HTMLInputElement;\n onFilterChange(target.value);\n };\n const searchIcon = ;\n return (\n
\n
\n }\n >\n \n \n \n \n \n \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 { css } from '@emotion/css';\nimport { groupBy } from 'lodash';\nimport React, { FC, FormEvent, useCallback, useState } from 'react';\n\nimport { AlertState, dateTimeFormat, GrafanaTheme2 } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Alert, Field, Icon, Input, Label, LoadingPlaceholder, Tooltip, useStyles2 } from '@grafana/ui';\nimport { StateHistoryItem, StateHistoryItemData } from 'app/types/unified-alerting';\nimport { GrafanaAlertStateWithReason, PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { useManagedAlertStateHistory } from '../../hooks/useManagedAlertStateHistory';\nimport { AlertLabel } from '../AlertLabel';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\n\nimport { AlertStateTag } from './AlertStateTag';\n\ntype StateHistoryRowItem = {\n id: string;\n state: PromAlertingRuleState | GrafanaAlertStateWithReason | AlertState;\n text?: string;\n data?: StateHistoryItemData;\n timestamp?: number;\n stringifiedLabels: string;\n};\n\ntype StateHistoryMap = Record;\n\ntype StateHistoryRow = DynamicTableItemProps;\n\ninterface RuleStateHistoryProps {\n alertId: string;\n}\n\nconst StateHistory: FC = ({ alertId }) => {\n const [textFilter, setTextFilter] = useState('');\n const handleTextFilter = useCallback((event: FormEvent) => {\n setTextFilter(event.currentTarget.value);\n }, []);\n\n const { loading, error, result = [] } = useManagedAlertStateHistory(alertId);\n\n const styles = useStyles2(getStyles);\n\n if (loading && !error) {\n return ;\n }\n\n if (error && !loading) {\n return {error.message};\n }\n\n const columns: Array> = [\n { id: 'state', label: 'State', size: 'max-content', renderCell: renderStateCell },\n { id: 'value', label: '', size: 'auto', renderCell: renderValueCell },\n { id: 'timestamp', label: 'Time', size: 'max-content', renderCell: renderTimestampCell },\n ];\n\n // group the state history list by unique set of labels\n const tables = Object.entries(groupStateByLabels(result))\n // sort and filter each table\n .sort()\n .filter(([groupKey]) => matchKey(groupKey, textFilter))\n .map(([groupKey, items]) => {\n const tableItems: StateHistoryRow[] = items.map((historyItem) => ({\n id: historyItem.id,\n data: historyItem,\n }));\n\n return (\n
\n
\n {groupKey}\n
\n \n
\n );\n });\n\n return (\n
\n
\n }\n >\n \n \n \n \n }\n >\n } onChange={handleTextFilter} placeholder=\"Search\" />\n \n \n {tables}\n \n );\n};\n\n// group state history by labels\nexport function groupStateByLabels(\n history: Array>\n): StateHistoryMap {\n const items: StateHistoryRowItem[] = history.map((item) => {\n // let's grab the last matching set of `{}` since the alert name could also contain { or }\n const LABELS_REGEX = /{.*?}/g;\n const stringifiedLabels = item.text.match(LABELS_REGEX)?.at(-1) ?? '';\n\n return {\n id: String(item.id),\n state: item.newState,\n // let's omit the labels for each entry since it's just added noise to each state history item\n text: item.text.replace(stringifiedLabels, ''),\n data: item.data,\n timestamp: item.updated,\n stringifiedLabels,\n };\n });\n\n // we have to group our state history items by their unique combination of tags since we want to display a DynamicTable for each alert instance\n // (effectively unique combination of labels)\n return groupBy(items, (item) => item.stringifiedLabels);\n}\n\n// match a string either by exact text match or with regular expression when in the form of \"//\"\nexport function matchKey(groupKey: string, textFilter: string) {\n // if the text filter is empty we show all matches\n if (textFilter === '') {\n return true;\n }\n\n const isRegExp = textFilter.startsWith('/') && textFilter.endsWith('/');\n\n // not a regular expression, use normal text matching\n if (!isRegExp) {\n return groupKey.includes(textFilter);\n }\n\n // regular expression, try parsing and applying\n // when we fail to parse the text as a regular expression, we return no match\n try {\n return new RegExp(textFilter.slice(1, -1)).test(groupKey);\n } catch (err) {\n return false;\n }\n}\n\nfunction renderValueCell(item: StateHistoryRow) {\n const matches = item.data.data?.evalMatches ?? [];\n\n return (\n <>\n {item.data.text}\n \n {matches.map((match) => (\n \n ))}\n \n \n );\n}\n\nfunction renderStateCell(item: StateHistoryRow) {\n return ;\n}\n\nfunction renderTimestampCell(item: StateHistoryRow) {\n return (\n
{item.data.timestamp && {dateTimeFormat(item.data.timestamp)}}
\n );\n}\n\nconst LabelsWrapper: FC<{}> = ({ children }) => {\n const { wrapper } = useStyles2(getStyles);\n return
{children}
;\n};\n\nconst TimestampStyle = css`\n display: flex;\n align-items: flex-end;\n flex-direction: column;\n`;\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n & > * {\n margin-right: ${theme.spacing(1)};\n }\n `,\n tableGroupKey: css`\n margin-top: ${theme.spacing(2)};\n margin-bottom: ${theme.spacing(2)};\n `,\n});\n\nexport { StateHistory };\n","import { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { StateHistoryItem } from 'app/types/unified-alerting';\n\nimport { fetchGrafanaAnnotationsAction } from '../state/actions';\nimport { AsyncRequestState } from '../utils/redux';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\nexport function useManagedAlertStateHistory(alertId: string) {\n const dispatch = useDispatch();\n const history = useUnifiedAlertingSelector>(\n (state) => state.managedAlertStateHistory\n );\n\n useEffect(() => {\n dispatch(fetchGrafanaAnnotationsAction(alertId));\n }, [dispatch, alertId]);\n\n return history;\n}\n","import { css } from '@emotion/css';\nimport React, { FC, Fragment, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { GrafanaTheme2, urlUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Button, ClipboardButton, ConfirmModal, HorizontalGroup, LinkButton, useStyles2 } from '@grafana/ui';\nimport { useAppNotification } from 'app/core/copy/appNotification';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction } from 'app/types';\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { useIsRuleEditable } from '../../hooks/useIsRuleEditable';\nimport { useStateHistoryModal } from '../../hooks/useStateHistoryModal';\nimport { deleteRuleAction } from '../../state/actions';\nimport { getAlertmanagerByUid } from '../../utils/alertmanager';\nimport { Annotation } from '../../utils/constants';\nimport { getRulesSourceName, isCloudRulesSource, isGrafanaRulesSource } from '../../utils/datasource';\nimport { createExploreLink, createViewLink, makeRuleBasedSilenceLink } from '../../utils/misc';\nimport * as ruleId from '../../utils/rule-id';\nimport { isFederatedRuleGroup, isGrafanaRulerRule } from '../../utils/rules';\n\ninterface Props {\n rule: CombinedRule;\n rulesSource: RulesSource;\n}\n\nexport const RuleDetailsActionButtons: FC = ({ rule, rulesSource }) => {\n const dispatch = useDispatch();\n const location = useLocation();\n const notifyApp = useAppNotification();\n const style = useStyles2(getStyles);\n const { namespace, group, rulerRule } = rule;\n const [ruleToDelete, setRuleToDelete] = useState();\n const alertId = isGrafanaRulerRule(rule.rulerRule) ? rule.rulerRule.grafana_alert.id ?? '' : '';\n const { StateHistoryModal, showStateHistoryModal } = useStateHistoryModal(alertId);\n\n const alertmanagerSourceName = isGrafanaRulesSource(rulesSource)\n ? rulesSource\n : getAlertmanagerByUid(rulesSource.jsonData.alertmanagerUid)?.name;\n const rulesSourceName = getRulesSourceName(rulesSource);\n\n const hasExplorePermission = contextSrv.hasPermission(AccessControlAction.DataSourcesExplore);\n const isProvisioned = isGrafanaRulerRule(rule.rulerRule) && Boolean(rule.rulerRule.grafana_alert.provenance);\n\n const leftButtons: JSX.Element[] = [];\n const rightButtons: JSX.Element[] = [];\n\n const isFederated = isFederatedRuleGroup(group);\n const { isEditable, isRemovable } = useIsRuleEditable(rulesSourceName, rulerRule);\n const returnTo = location.pathname + location.search;\n const isViewMode = inViewMode(location.pathname);\n\n const deleteRule = () => {\n if (ruleToDelete && ruleToDelete.rulerRule) {\n const identifier = ruleId.fromRulerRule(\n getRulesSourceName(ruleToDelete.namespace.rulesSource),\n ruleToDelete.namespace.name,\n ruleToDelete.group.name,\n ruleToDelete.rulerRule\n );\n\n dispatch(deleteRuleAction(identifier, { navigateTo: isViewMode ? '/alerting/list' : undefined }));\n setRuleToDelete(undefined);\n }\n };\n\n const buildShareUrl = () => {\n if (isCloudRulesSource(rulesSource)) {\n const { appUrl, appSubUrl } = config;\n const baseUrl = appSubUrl !== '' ? `${appUrl}${appSubUrl}/` : config.appUrl;\n const ruleUrl = `${encodeURIComponent(rulesSource.name)}/${encodeURIComponent(rule.name)}`;\n return `${baseUrl}alerting/${ruleUrl}/find`;\n }\n\n return window.location.href.split('?')[0];\n };\n\n // explore does not support grafana rule queries atm\n // neither do \"federated rules\"\n if (isCloudRulesSource(rulesSource) && hasExplorePermission && !isFederated) {\n leftButtons.push(\n \n See graph\n \n );\n }\n if (rule.annotations[Annotation.runbookURL]) {\n leftButtons.push(\n \n View runbook\n \n );\n }\n if (rule.annotations[Annotation.dashboardUID]) {\n const dashboardUID = rule.annotations[Annotation.dashboardUID];\n if (dashboardUID) {\n leftButtons.push(\n \n Go to dashboard\n \n );\n const panelId = rule.annotations[Annotation.panelID];\n if (panelId) {\n leftButtons.push(\n \n Go to panel\n \n );\n }\n }\n }\n\n if (alertmanagerSourceName && contextSrv.hasAccess(AccessControlAction.AlertingInstanceCreate, contextSrv.isEditor)) {\n leftButtons.push(\n \n Silence\n \n );\n }\n\n if (alertId) {\n leftButtons.push(\n \n \n {StateHistoryModal}\n \n );\n }\n\n if (!isViewMode) {\n rightButtons.push(\n \n View\n \n );\n }\n\n if (isEditable && rulerRule && !isFederated && !isProvisioned) {\n const sourceName = getRulesSourceName(rulesSource);\n const identifier = ruleId.fromRulerRule(sourceName, namespace.name, group.name, rulerRule);\n\n const editURL = urlUtil.renderUrl(\n `${config.appSubUrl}/alerting/${encodeURIComponent(ruleId.stringifyIdentifier(identifier))}/edit`,\n {\n returnTo,\n }\n );\n\n if (isViewMode) {\n rightButtons.push(\n {\n notifyApp.error('Error while copying URL', copiedText);\n }}\n className={style.button}\n size=\"sm\"\n getText={buildShareUrl}\n >\n Copy link to rule\n \n );\n }\n\n rightButtons.push(\n \n Edit\n \n );\n }\n\n if (isRemovable && rulerRule && !isFederated && !isProvisioned) {\n rightButtons.push(\n setRuleToDelete(rule)}\n >\n Delete\n \n );\n }\n\n if (leftButtons.length || rightButtons.length) {\n return (\n <>\n
\n {leftButtons.length ? leftButtons :
}\n {rightButtons.length ? rightButtons :
}\n
\n {!!ruleToDelete && (\n setRuleToDelete(undefined)}\n />\n )}\n \n );\n }\n\n return null;\n};\n\nfunction inViewMode(pathname: string): boolean {\n return pathname.endsWith('/view');\n}\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n padding: ${theme.spacing(2)} 0;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n flex-wrap: wrap;\n border-bottom: solid 1px ${theme.colors.border.medium};\n `,\n button: css`\n height: 24px;\n margin-top: ${theme.spacing(1)};\n font-size: ${theme.typography.size.sm};\n `,\n});\n","import React, { useMemo, useState } from 'react';\n\nimport { Modal } from '@grafana/ui';\n\nimport { StateHistory } from '../components/rules/StateHistory';\n\nfunction useStateHistoryModal(alertId: string) {\n const [showModal, setShowModal] = useState(false);\n\n const StateHistoryModal = useMemo(\n () => (\n setShowModal(false)}\n closeOnBackdropClick={true}\n closeOnEscape={true}\n title=\"State history\"\n >\n \n \n ),\n [alertId, showModal]\n );\n\n return {\n StateHistoryModal,\n showStateHistoryModal: () => setShowModal(true),\n hideStateHistoryModal: () => setShowModal(false),\n };\n}\n\nexport { useStateHistoryModal };\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { AnnotationDetailsField } from '../AnnotationDetailsField';\n\ntype Props = {\n annotations: Array<[string, string]>;\n};\n\nexport function RuleDetailsAnnotations(props: Props): JSX.Element | null {\n const { annotations } = props;\n const styles = useStyles2(getStyles);\n\n if (annotations.length === 0) {\n return null;\n }\n\n return (\n
\n {annotations.map(([key, value]) => (\n \n ))}\n
\n );\n}\n\nconst getStyles = () => ({\n annotations: css`\n margin-top: 46px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\nimport { ExpressionDatasourceUID } from 'app/features/expressions/ExpressionDatasource';\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { isCloudRulesSource } from '../../utils/datasource';\nimport { isGrafanaRulerRule } from '../../utils/rules';\nimport { DetailsField } from '../DetailsField';\n\ntype Props = {\n rule: CombinedRule;\n rulesSource: RulesSource;\n};\n\nexport function RuleDetailsDataSources(props: Props): JSX.Element | null {\n const { rulesSource, rule } = props;\n const styles = useStyles2(getStyles);\n\n const dataSources: Array<{ name: string; icon?: string }> = useMemo(() => {\n if (isCloudRulesSource(rulesSource)) {\n return [{ name: rulesSource.name, icon: rulesSource.meta.info.logos.small }];\n }\n\n if (isGrafanaRulerRule(rule.rulerRule)) {\n const { data } = rule.rulerRule.grafana_alert;\n const unique = data.reduce((dataSources, query) => {\n const ds = getDataSourceSrv().getInstanceSettings(query.datasourceUid);\n\n if (!ds || ds.uid === ExpressionDatasourceUID) {\n return dataSources;\n }\n\n dataSources[ds.name] = { name: ds.name, icon: ds.meta.info.logos.small };\n return dataSources;\n }, {} as Record);\n\n return Object.values(unique);\n }\n\n return [];\n }, [rule, rulesSource]);\n\n if (dataSources.length === 0) {\n return null;\n }\n\n return (\n \n {dataSources.map(({ name, icon }, index) => (\n
\n {icon && (\n <>\n {`${name}{' '}\n \n )}\n {name}\n
\n ))}\n
\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n const size = theme.spacing(2);\n\n return {\n dataSourceIcon: css`\n width: ${size};\n height: ${size};\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { LanguageMap, languages as prismLanguages } from 'prismjs';\nimport React, { FC, useMemo } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Editor } from '@grafana/slate-react';\nimport { makeValue, SlatePrism, useStyles } from '@grafana/ui';\nimport LogqlSyntax from 'app/plugins/datasource/loki/syntax';\nimport PromqlSyntax from 'app/plugins/datasource/prometheus/promql';\nimport { RulesSource } from 'app/types/unified-alerting';\n\nimport { DataSourceType, isCloudRulesSource } from '../utils/datasource';\n\nimport { Well } from './Well';\n\ninterface Props {\n expression: string;\n rulesSource: RulesSource;\n}\n\nexport const HighlightedQuery: FC<{ language: 'promql' | 'logql'; expr: string }> = ({ language, expr }) => {\n const plugins = useMemo(\n () => [\n SlatePrism(\n {\n onlyIn: (node: any) => node.type === 'code_block',\n getSyntax: () => language,\n },\n { ...(prismLanguages as LanguageMap), [language]: language === 'logql' ? LogqlSyntax : PromqlSyntax }\n ),\n ],\n [language]\n );\n\n const slateValue = useMemo(() => makeValue(expr), [expr]);\n\n return ;\n};\n\nexport const Expression: FC = ({ expression: query, rulesSource }) => {\n const styles = useStyles(getStyles);\n\n return (\n \n {isCloudRulesSource(rulesSource) ? (\n \n ) : (\n query\n )}\n \n );\n};\n\nexport const getStyles = (theme: GrafanaTheme) => ({\n well: css`\n font-family: ${theme.typography.fontFamily.monospace};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { isCloudRulesSource } from '../../utils/datasource';\nimport { DetailsField } from '../DetailsField';\nimport { Expression } from '../Expression';\n\ntype Props = {\n rule: CombinedRule;\n rulesSource: RulesSource;\n annotations: Array<[string, string]>;\n};\n\nexport function RuleDetailsExpression(props: Props): JSX.Element | null {\n const { annotations, rulesSource, rule } = props;\n const styles = getStyles();\n\n if (!isCloudRulesSource(rulesSource)) {\n return null;\n }\n\n return (\n \n \n \n );\n}\n\nconst getStyles = () => ({\n exprRow: css`\n margin-bottom: 46px;\n `,\n});\n","import { css } from '@emotion/css';\nimport { capitalize } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data/src';\nimport { Label, RadioButtonGroup, Tag, useStyles2 } from '@grafana/ui';\nimport { GrafanaAlertState, PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nexport type InstanceStateFilter = GrafanaAlertState | PromAlertingRuleState.Pending | PromAlertingRuleState.Firing;\n\ninterface Props {\n className?: string;\n filterType: 'grafana' | 'prometheus';\n stateFilter?: InstanceStateFilter;\n onStateFilterChange: (value?: InstanceStateFilter) => void;\n itemPerStateStats?: Record;\n}\n\nexport const AlertInstanceStateFilter = ({\n className,\n onStateFilterChange,\n stateFilter,\n filterType,\n itemPerStateStats,\n}: Props) => {\n const styles = useStyles2(getStyles);\n\n const getOptionComponent = (state: InstanceStateFilter) => {\n return function InstanceStateCounter() {\n return itemPerStateStats && itemPerStateStats[state] ? (\n \n ) : null;\n };\n };\n\n const grafanaOptions = Object.values(GrafanaAlertState).map((state) => ({\n label: state,\n value: state,\n component: getOptionComponent(state),\n }));\n\n const promOptionValues = [PromAlertingRuleState.Firing, PromAlertingRuleState.Pending] as const;\n const promOptions = promOptionValues.map((state) => ({\n label: capitalize(state),\n value: state,\n component: getOptionComponent(state),\n }));\n\n const stateOptions = filterType === 'grafana' ? grafanaOptions : promOptions;\n\n return (\n
\n \n {\n if (v === stateFilter) {\n onStateFilterChange(undefined);\n }\n }}\n />\n
\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n tag: css`\n font-size: 11px;\n font-weight: normal;\n padding: ${theme.spacing(0.25, 0.5)};\n vertical-align: middle;\n margin-left: ${theme.spacing(0.5)};\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { countBy } from 'lodash';\nimport React, { useMemo, useState } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { LinkButton, useStyles } from '@grafana/ui';\nimport { MatcherFilter } from 'app/features/alerting/unified/components/alert-groups/MatcherFilter';\nimport {\n AlertInstanceStateFilter,\n InstanceStateFilter,\n} from 'app/features/alerting/unified/components/rules/AlertInstanceStateFilter';\nimport { labelsMatchMatchers, parseMatchers } from 'app/features/alerting/unified/utils/alertmanager';\nimport { createViewLink, sortAlerts } from 'app/features/alerting/unified/utils/misc';\nimport { SortOrder } from 'app/plugins/panel/alertlist/types';\nimport { Alert, CombinedRule, PaginationProps } from 'app/types/unified-alerting';\nimport { mapStateWithReasonToBaseState } from 'app/types/unified-alerting-dto';\n\nimport { GRAFANA_RULES_SOURCE_NAME, isGrafanaRulesSource } from '../../utils/datasource';\nimport { isAlertingRule } from '../../utils/rules';\nimport { DetailsField } from '../DetailsField';\n\nimport { AlertInstancesTable } from './AlertInstancesTable';\n\ninterface Props {\n rule: CombinedRule;\n pagination?: PaginationProps;\n itemsDisplayLimit?: number;\n}\n\ninterface ShowMoreStats {\n totalItemsCount: number;\n visibleItemsCount: number;\n}\n\nfunction ShowMoreInstances(props: { ruleViewPageLink: string; stats: ShowMoreStats }) {\n const styles = useStyles(getStyles);\n const { ruleViewPageLink, stats } = props;\n\n return (\n
\n
\n Showing {stats.visibleItemsCount} out of {stats.totalItemsCount} instances\n
\n {ruleViewPageLink && (\n \n Show all {stats.totalItemsCount} alert instances\n \n )}\n
\n );\n}\n\nexport function RuleDetailsMatchingInstances(props: Props): JSX.Element | null {\n const {\n rule: { promRule, namespace },\n itemsDisplayLimit = Number.POSITIVE_INFINITY,\n pagination,\n } = props;\n\n const [queryString, setQueryString] = useState();\n const [alertState, setAlertState] = useState();\n\n // This key is used to force a rerender on the inputs when the filters are cleared\n const [filterKey] = useState(Math.floor(Math.random() * 100));\n const queryStringKey = `queryString-${filterKey}`;\n\n const styles = useStyles(getStyles);\n\n const stateFilterType = isGrafanaRulesSource(namespace.rulesSource) ? GRAFANA_RULES_SOURCE_NAME : 'prometheus';\n\n const alerts = useMemo(\n (): Alert[] =>\n isAlertingRule(promRule) && promRule.alerts?.length\n ? filterAlerts(queryString, alertState, sortAlerts(SortOrder.Importance, promRule.alerts))\n : [],\n [promRule, alertState, queryString]\n );\n\n if (!isAlertingRule(promRule)) {\n return null;\n }\n\n const visibleInstances = alerts.slice(0, itemsDisplayLimit);\n\n const countAllByState = countBy(promRule.alerts, (alert) => mapStateWithReasonToBaseState(alert.state));\n const hiddenItemsCount = alerts.length - visibleInstances.length;\n\n const stats: ShowMoreStats = {\n totalItemsCount: alerts.length,\n visibleItemsCount: visibleInstances.length,\n };\n\n const ruleViewPageLink = createViewLink(namespace.rulesSource, props.rule, location.pathname + location.search);\n\n const footerRow = hiddenItemsCount ? (\n \n ) : undefined;\n\n return (\n \n
\n
\n setQueryString(value)}\n />\n \n
\n
\n\n \n
\n );\n}\n\nfunction filterAlerts(\n alertInstanceLabel: string | undefined,\n alertInstanceState: InstanceStateFilter | undefined,\n alerts: Alert[]\n): Alert[] {\n let filteredAlerts = [...alerts];\n if (alertInstanceLabel) {\n const matchers = parseMatchers(alertInstanceLabel || '');\n filteredAlerts = filteredAlerts.filter(({ labels }) => labelsMatchMatchers(labels, matchers));\n }\n if (alertInstanceState) {\n filteredAlerts = filteredAlerts.filter((alert) => {\n return mapStateWithReasonToBaseState(alert.state) === alertInstanceState;\n });\n }\n\n return filteredAlerts;\n}\n\nconst getStyles = (theme: GrafanaTheme) => {\n return {\n flexRow: css`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n width: 100%;\n flex-wrap: wrap;\n margin-bottom: ${theme.spacing.sm};\n `,\n spaceBetween: css`\n justify-content: space-between;\n `,\n rowChild: css`\n margin-right: ${theme.spacing.sm};\n `,\n footerRow: css`\n display: flex;\n flex-direction: column;\n gap: ${theme.spacing.sm};\n justify-content: space-between;\n align-items: center;\n width: 100%;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, Tooltip, useStyles2 } from '@grafana/ui';\nimport { Rule } from 'app/types/unified-alerting';\n\ninterface Prom {\n rule: Rule;\n}\n\nexport const RuleHealth: FC = ({ rule }) => {\n const style = useStyles2(getStyle);\n\n if (rule.health === 'err' || rule.health === 'error') {\n return (\n \n
\n \n error\n
\n
\n );\n }\n\n return <>{rule.health};\n};\n\nconst getStyle = (theme: GrafanaTheme2) => ({\n warn: css`\n display: inline-flex;\n flex-direction: row;\n align-items: center;\n gap: ${theme.spacing(1)};\n\n color: ${theme.colors.warning.text};\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\n\nimport { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { HorizontalGroup, Spinner, useStyles2 } from '@grafana/ui';\nimport { CombinedRule } from 'app/types/unified-alerting';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { isAlertingRule, isRecordingRule, getFirstActiveAt } from '../../utils/rules';\n\nimport { AlertStateTag } from './AlertStateTag';\n\ninterface Props {\n rule: CombinedRule;\n isDeleting: boolean;\n isCreating: boolean;\n}\n\nexport const RuleState: FC = ({ rule, isDeleting, isCreating }) => {\n const style = useStyles2(getStyle);\n const { promRule } = rule;\n\n // return how long the rule has been in it's firing state, if any\n const forTime = useMemo(() => {\n if (\n promRule &&\n isAlertingRule(promRule) &&\n promRule.alerts?.length &&\n promRule.state !== PromAlertingRuleState.Inactive\n ) {\n // find earliest alert\n const firstActiveAt = getFirstActiveAt(promRule);\n\n // calculate time elapsed from earliest alert\n if (firstActiveAt) {\n return (\n \n for{' '}\n {intervalToAbbreviatedDurationString(\n {\n start: firstActiveAt,\n end: new Date(),\n },\n false\n )}\n \n );\n }\n }\n return null;\n }, [promRule, style]);\n\n if (isDeleting) {\n return (\n \n \n deleting\n \n );\n } else if (isCreating) {\n return (\n \n {' '}\n \n creating\n \n );\n } else if (promRule && isAlertingRule(promRule)) {\n return (\n \n \n {forTime}\n \n );\n } else if (promRule && isRecordingRule(promRule)) {\n return <>Recording rule;\n }\n return <>n/a;\n};\n\nconst getStyle = (theme: GrafanaTheme2) => ({\n for: css`\n font-size: ${theme.typography.bodySmall.fontSize};\n color: ${theme.colors.text.secondary};\n white-space: nowrap;\n padding-top: 2px;\n `,\n});\n","import { useMemo, useRef } from 'react';\n\nimport {\n CombinedRule,\n CombinedRuleGroup,\n CombinedRuleNamespace,\n Rule,\n RuleGroup,\n RuleNamespace,\n RulesSource,\n} from 'app/types/unified-alerting';\nimport { RulerRuleDTO, RulerRuleGroupDTO, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto';\n\nimport {\n getAllRulesSources,\n getRulesSourceByName,\n isCloudRulesSource,\n isGrafanaRulesSource,\n} from '../utils/datasource';\nimport { isAlertingRule, isAlertingRulerRule, isRecordingRulerRule } from '../utils/rules';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\ninterface CacheValue {\n promRules?: RuleNamespace[];\n rulerRules?: RulerRulesConfigDTO | null;\n result: CombinedRuleNamespace[];\n}\n\n// this little monster combines prometheus rules and ruler rules to produce a unified data structure\n// can limit to a single rules source\nexport function useCombinedRuleNamespaces(rulesSourceName?: string): CombinedRuleNamespace[] {\n const promRulesResponses = useUnifiedAlertingSelector((state) => state.promRules);\n const rulerRulesResponses = useUnifiedAlertingSelector((state) => state.rulerRules);\n\n // cache results per rules source, so we only recalculate those for which results have actually changed\n const cache = useRef>({});\n\n const rulesSources = useMemo((): RulesSource[] => {\n if (rulesSourceName) {\n const rulesSource = getRulesSourceByName(rulesSourceName);\n if (!rulesSource) {\n throw new Error(`Unknown rules source: ${rulesSourceName}`);\n }\n return [rulesSource];\n }\n return getAllRulesSources();\n }, [rulesSourceName]);\n\n return useMemo(\n () =>\n rulesSources\n .map((rulesSource): CombinedRuleNamespace[] => {\n const rulesSourceName = isCloudRulesSource(rulesSource) ? rulesSource.name : rulesSource;\n const promRules = promRulesResponses[rulesSourceName]?.result;\n const rulerRules = rulerRulesResponses[rulesSourceName]?.result;\n\n const cached = cache.current[rulesSourceName];\n if (cached && cached.promRules === promRules && cached.rulerRules === rulerRules) {\n return cached.result;\n }\n const namespaces: Record = {};\n\n // first get all the ruler rules in\n Object.entries(rulerRules || {}).forEach(([namespaceName, groups]) => {\n const namespace: CombinedRuleNamespace = {\n rulesSource,\n name: namespaceName,\n groups: [],\n };\n namespaces[namespaceName] = namespace;\n addRulerGroupsToCombinedNamespace(namespace, groups);\n });\n\n // then correlate with prometheus rules\n promRules?.forEach(({ name: namespaceName, groups }) => {\n const ns = (namespaces[namespaceName] = namespaces[namespaceName] || {\n rulesSource,\n name: namespaceName,\n groups: [],\n });\n\n addPromGroupsToCombinedNamespace(ns, groups);\n });\n\n const result = Object.values(namespaces);\n\n cache.current[rulesSourceName] = { promRules, rulerRules, result };\n return result;\n })\n .flat(),\n [promRulesResponses, rulerRulesResponses, rulesSources]\n );\n}\n\n// merge all groups in case of grafana managed, essentially treating namespaces (folders) as groups\nexport function flattenGrafanaManagedRules(namespaces: CombinedRuleNamespace[]) {\n return namespaces.map((namespace) => {\n const newNamespace: CombinedRuleNamespace = {\n ...namespace,\n groups: [],\n };\n\n // add default group with ungrouped rules\n newNamespace.groups.push({\n name: 'default',\n rules: sortRulesByName(namespace.groups.flatMap((group) => group.rules)),\n });\n\n return newNamespace;\n });\n}\n\nexport function sortRulesByName(rules: CombinedRule[]) {\n return rules.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction addRulerGroupsToCombinedNamespace(namespace: CombinedRuleNamespace, groups: RulerRuleGroupDTO[]): void {\n namespace.groups = groups.map((group) => {\n const combinedGroup: CombinedRuleGroup = {\n name: group.name,\n interval: group.interval,\n source_tenants: group.source_tenants,\n rules: [],\n };\n combinedGroup.rules = group.rules.map((rule) => rulerRuleToCombinedRule(rule, namespace, combinedGroup));\n return combinedGroup;\n });\n}\n\nfunction addPromGroupsToCombinedNamespace(namespace: CombinedRuleNamespace, groups: RuleGroup[]): void {\n groups.forEach((group) => {\n let combinedGroup = namespace.groups.find((g) => g.name === group.name);\n if (!combinedGroup) {\n combinedGroup = {\n name: group.name,\n rules: [],\n };\n namespace.groups.push(combinedGroup);\n }\n\n (group.rules ?? []).forEach((rule) => {\n const existingRule = getExistingRuleInGroup(rule, combinedGroup!, namespace.rulesSource);\n if (existingRule) {\n existingRule.promRule = rule;\n } else {\n combinedGroup!.rules.push(promRuleToCombinedRule(rule, namespace, combinedGroup!));\n }\n });\n });\n}\n\nfunction promRuleToCombinedRule(rule: Rule, namespace: CombinedRuleNamespace, group: CombinedRuleGroup): CombinedRule {\n return {\n name: rule.name,\n query: rule.query,\n labels: rule.labels || {},\n annotations: isAlertingRule(rule) ? rule.annotations || {} : {},\n promRule: rule,\n namespace: namespace,\n group,\n };\n}\n\nfunction rulerRuleToCombinedRule(\n rule: RulerRuleDTO,\n namespace: CombinedRuleNamespace,\n group: CombinedRuleGroup\n): CombinedRule {\n return isAlertingRulerRule(rule)\n ? {\n name: rule.alert,\n query: rule.expr,\n labels: rule.labels || {},\n annotations: rule.annotations || {},\n rulerRule: rule,\n namespace,\n group,\n }\n : isRecordingRulerRule(rule)\n ? {\n name: rule.record,\n query: rule.expr,\n labels: rule.labels || {},\n annotations: {},\n rulerRule: rule,\n namespace,\n group,\n }\n : {\n name: rule.grafana_alert.title,\n query: '',\n labels: rule.labels || {},\n annotations: rule.annotations || {},\n rulerRule: rule,\n namespace,\n group,\n };\n}\n\n// find existing rule in group that matches the given prom rule\nfunction getExistingRuleInGroup(\n rule: Rule,\n group: CombinedRuleGroup,\n rulesSource: RulesSource\n): CombinedRule | undefined {\n if (isGrafanaRulesSource(rulesSource)) {\n // assume grafana groups have only the one rule. check name anyway because paranoid\n return group!.rules.find((existingRule) => existingRule.name === rule.name);\n }\n return (\n // try finding a rule that matches name, labels, annotations and query\n group!.rules.find(\n (existingRule) => !existingRule.promRule && isCombinedRuleEqualToPromRule(existingRule, rule, true)\n ) ??\n // if that fails, try finding a rule that only matches name, labels and annotations.\n // loki & prom can sometimes modify the query so it doesnt match, eg `2 > 1` becomes `1`\n group!.rules.find(\n (existingRule) => !existingRule.promRule && isCombinedRuleEqualToPromRule(existingRule, rule, false)\n )\n );\n}\n\nfunction isCombinedRuleEqualToPromRule(combinedRule: CombinedRule, rule: Rule, checkQuery = true): boolean {\n if (combinedRule.name === rule.name) {\n return (\n JSON.stringify([\n checkQuery ? hashQuery(combinedRule.query) : '',\n combinedRule.labels,\n combinedRule.annotations,\n ]) ===\n JSON.stringify([\n checkQuery ? hashQuery(rule.query) : '',\n rule.labels || {},\n isAlertingRule(rule) ? rule.annotations || {} : {},\n ])\n );\n }\n return false;\n}\n\n// there can be slight differences in how prom & ruler render a query, this will hash them accounting for the differences\nfunction hashQuery(query: string) {\n // one of them might be wrapped in parens\n if (query.length > 1 && query[0] === '(' && query[query.length - 1] === ')') {\n query = query.slice(1, -1);\n }\n // whitespace could be added or removed\n query = query.replace(/\\s|\\n/g, '');\n // labels matchers can be reordered, so sort the enitre string, esentially comparing just the character counts\n return query.split('').sort().join('');\n}\n","import { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { FolderDTO } from 'app/types';\n\nimport { fetchFolderIfNotFetchedAction } from '../state/actions';\nimport { initialAsyncRequestState } from '../utils/redux';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\ninterface ReturnBag {\n folder?: FolderDTO;\n loading: boolean;\n}\n\nexport function useFolder(uid?: string): ReturnBag {\n const dispatch = useDispatch();\n const folderRequests = useUnifiedAlertingSelector((state) => state.folders);\n useEffect(() => {\n if (uid) {\n dispatch(fetchFolderIfNotFetchedAction(uid));\n }\n }, [dispatch, uid]);\n\n if (uid) {\n const request = folderRequests[uid] || initialAsyncRequestState;\n return {\n folder: request.result,\n loading: request.loading,\n };\n }\n return {\n loading: false,\n };\n}\n","import { contextSrv } from 'app/core/services/context_srv';\nimport { RulerRuleDTO } from 'app/types/unified-alerting-dto';\n\nimport { getRulesPermissions } from '../utils/access-control';\nimport { isGrafanaRulerRule } from '../utils/rules';\n\nimport { useFolder } from './useFolder';\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\ninterface ResultBag {\n isEditable?: boolean;\n isRemovable?: boolean;\n loading: boolean;\n}\n\nexport function useIsRuleEditable(rulesSourceName: string, rule?: RulerRuleDTO): ResultBag {\n const dataSources = useUnifiedAlertingSelector((state) => state.dataSources);\n const folderUID = rule && isGrafanaRulerRule(rule) ? rule.grafana_alert.namespace_uid : undefined;\n\n const rulePermission = getRulesPermissions(rulesSourceName);\n\n const { folder, loading } = useFolder(folderUID);\n\n if (!rule) {\n return { isEditable: false, isRemovable: false, loading: false };\n }\n\n // Grafana rules can be edited if user can edit the folder they're in\n // When RBAC is disabled access to a folder is the only requirement for managing rules\n // When RBAC is enabled the appropriate alerting permissions need to be met\n if (isGrafanaRulerRule(rule)) {\n if (!folderUID) {\n throw new Error(\n `Rule ${rule.grafana_alert.title} does not have a folder uid, cannot determine if it is editable.`\n );\n }\n\n if (!folder) {\n // Loading or invalid folder UID\n return {\n isEditable: false,\n isRemovable: false,\n loading,\n };\n }\n const rbacDisabledFallback = folder.canSave;\n\n const canEditGrafanaRules = contextSrv.hasAccessInMetadata(rulePermission.update, folder, rbacDisabledFallback);\n const canRemoveGrafanaRules = contextSrv.hasAccessInMetadata(rulePermission.delete, folder, rbacDisabledFallback);\n\n return {\n isEditable: canEditGrafanaRules,\n isRemovable: canRemoveGrafanaRules,\n loading,\n };\n }\n\n // prom rules are only editable by users with Editor role and only if rules source supports editing\n const isRulerAvailable = Boolean(dataSources[rulesSourceName]?.result?.rulerConfig);\n const canEditCloudRules = contextSrv.hasAccess(rulePermission.update, contextSrv.isEditor);\n const canRemoveCloudRules = contextSrv.hasAccess(rulePermission.delete, contextSrv.isEditor);\n\n return {\n isEditable: canEditCloudRules && isRulerAvailable,\n isRemovable: canRemoveCloudRules && isRulerAvailable,\n loading: dataSources[rulesSourceName]?.loading,\n };\n}\n"],"names":["ProvisionedResource","ProvisioningAlert","resource","Alert","title","severity","ProvisioningBadge","Badge","text","color","MatcherFilter","className","onFilterChange","defaultQueryString","queryString","styles","useStyles2","getStyles","searchIcon","Icon","name","Label","Stack","gap","Tooltip","content","icon","size","Input","placeholder","defaultValue","value","onChange","e","target","prefix","inputWidth","theme","css","spacing","StateHistory","alertId","textFilter","setTextFilter","useState","handleTextFilter","useCallback","event","currentTarget","loading","error","result","dispatch","useDispatch","history","useUnifiedAlertingSelector","state","managedAlertStateHistory","useEffect","fetchGrafanaAnnotationsAction","useManagedAlertStateHistory","LoadingPlaceholder","message","columns","id","label","renderCell","renderStateCell","renderValueCell","renderTimestampCell","tables","Object","entries","items","map","item","LABELS_REGEX","stringifiedLabels","match","at","String","newState","replace","data","timestamp","updated","groupBy","groupStateByLabels","sort","filter","groupKey","startsWith","endsWith","includes","RegExp","slice","test","err","matchKey","tableItems","historyItem","tableGroupKey","DynamicTable","cols","Field","matches","evalMatches","LabelsWrapper","AlertLabel","labelKey","metric","AlertStateTag","TimestampStyle","dateTimeFormat","children","wrapper","RuleDetailsActionButtons","rule","rulesSource","location","useLocation","notifyApp","useAppNotification","style","namespace","group","rulerRule","ruleToDelete","setRuleToDelete","isGrafanaRulerRule","grafana_alert","StateHistoryModal","showStateHistoryModal","showModal","setShowModal","useMemo","Modal","isOpen","onDismiss","closeOnBackdropClick","closeOnEscape","hideStateHistoryModal","useStateHistoryModal","alertmanagerSourceName","isGrafanaRulesSource","getAlertmanagerByUid","jsonData","alertmanagerUid","rulesSourceName","getRulesSourceName","hasExplorePermission","contextSrv","AccessControlAction","isProvisioned","Boolean","provenance","leftButtons","rightButtons","isFederated","isFederatedRuleGroup","isEditable","isRemovable","useIsRuleEditable","returnTo","pathname","search","isViewMode","deleteRule","identifier","ruleId","deleteRuleAction","navigateTo","undefined","buildShareUrl","isCloudRulesSource","appUrl","appSubUrl","config","encodeURIComponent","window","href","split","push","LinkButton","button","variant","createExploreLink","query","annotations","Annotation","dashboardUID","panelId","makeRuleBasedSilenceLink","Fragment","Button","onClick","createViewLink","sourceName","editURL","urlUtil","ClipboardButton","onClipboardError","copiedText","getText","type","length","HorizontalGroup","width","ConfirmModal","body","confirmText","onConfirm","colors","border","medium","typography","sm","RuleDetailsAnnotations","props","key","annotationKey","RuleDetailsDataSources","dataSources","meta","info","logos","small","unique","reduce","ds","getDataSourceSrv","getInstanceSettings","datasourceUid","uid","ExpressionDatasourceUID","values","index","alt","dataSourceIcon","src","HighlightedQuery","language","expr","plugins","SlatePrism","onlyIn","node","getSyntax","prismLanguages","LogqlSyntax","PromqlSyntax","slateValue","makeValue","readOnly","Expression","expression","useStyles","Well","cx","well","DataSourceType","fontFamily","monospace","RuleDetailsExpression","DetailsField","horizontal","exprRow","AlertInstanceStateFilter","onStateFilterChange","stateFilter","filterType","itemPerStateStats","getOptionComponent","Tag","toFixed","colorIndex","tag","grafanaOptions","GrafanaAlertState","component","promOptions","PromAlertingRuleState","capitalize","stateOptions","RadioButtonGroup","options","v","ShowMoreInstances","ruleViewPageLink","stats","footerRow","visibleItemsCount","totalItemsCount","RuleDetailsMatchingInstances","promRule","itemsDisplayLimit","Number","POSITIVE_INFINITY","pagination","setQueryString","alertState","setAlertState","filterKey","Math","floor","random","queryStringKey","stateFilterType","GRAFANA_RULES_SOURCE_NAME","alerts","isAlertingRule","alertInstanceLabel","alertInstanceState","filteredAlerts","matchers","parseMatchers","labels","labelsMatchMatchers","alert","mapStateWithReasonToBaseState","filterAlerts","sortAlerts","SortOrder","visibleInstances","countAllByState","countBy","hiddenItemsCount","flexRow","spaceBetween","rowChild","AlertInstancesTable","instances","RuleHealth","getStyle","health","lastError","warn","warning","RuleState","isDeleting","isCreating","forTime","firstActiveAt","getFirstActiveAt","for","intervalToAbbreviatedDurationString","start","end","Date","align","Spinner","isRecordingRule","bodySmall","fontSize","secondary","useCombinedRuleNamespaces","promRulesResponses","promRules","rulerRulesResponses","rulerRules","cache","useRef","rulesSources","getRulesSourceByName","Error","getAllRulesSources","cached","current","namespaces","forEach","namespaceName","groups","combinedGroup","interval","source_tenants","rules","isAlertingRulerRule","isRecordingRulerRule","record","rulerRuleToCombinedRule","addRulerGroupsToCombinedNamespace","find","g","existingRule","isCombinedRuleEqualToPromRule","getExistingRuleInGroup","promRuleToCombinedRule","addPromGroupsToCombinedNamespace","flat","flattenGrafanaManagedRules","newNamespace","flatMap","a","b","localeCompare","combinedRule","checkQuery","JSON","stringify","hashQuery","join","useFolder","folderRequests","folders","fetchFolderIfNotFetchedAction","request","initialAsyncRequestState","folder","folderUID","namespace_uid","rulePermission","getRulesPermissions","rbacDisabledFallback","canSave","update","delete","isRulerAvailable","rulerConfig"],"sourceRoot":""}