{"version":3,"file":"5657.766de06cfa1d0a077de4.js","mappings":"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","sources":["webpack://grafana/./public/app/features/alerting/unified/components/AnnotationDetailsField.tsx","webpack://grafana/./public/app/features/alerting/unified/components/DetailsField.tsx","webpack://grafana/./public/app/features/alerting/unified/components/DynamicTable.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Well.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsActionButtons.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/AlertInstanceDetails.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/AlertInstancesTable.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, { FC } from 'react';\nimport { Well } from './Well';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { Tooltip, useStyles } from '@grafana/ui';\nimport { DetailsField } from './DetailsField';\nimport { Annotation, annotationLabels } from '../utils/constants';\n\nconst wellableAnnotationKeys = ['message', 'description'];\n\ninterface Props {\n annotationKey: string;\n value: string;\n}\n\nexport const AnnotationDetailsField: FC = ({ annotationKey, value }) => {\n const label = annotationLabels[annotationKey as Annotation] ? (\n \n {annotationLabels[annotationKey as Annotation]}\n \n ) : (\n annotationKey\n );\n\n return (\n \n \n \n );\n};\n\nconst AnnotationValue: FC = ({ annotationKey, value }) => {\n const styles = useStyles(getStyles);\n if (wellableAnnotationKeys.includes(annotationKey)) {\n return {value};\n } else if (value && value.startsWith('http')) {\n return (\n \n {value}\n \n );\n }\n return <>{value};\n};\n\nexport const getStyles = (theme: GrafanaTheme) => ({\n well: css`\n word-break: break-all;\n `,\n link: css`\n word-break: break-all;\n color: ${theme.colors.textBlue};\n `,\n});\n","import React, { FC } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\ninterface Props {\n label: React.ReactNode;\n className?: string;\n horizontal?: boolean;\n}\n\nexport const DetailsField: FC = ({ className, label, horizontal, children }) => {\n const styles = useStyles2(getStyles);\n\n return (\n
\n
{label}
\n
{children}
\n
\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n fieldHorizontal: css`\n flex-direction: row;\n ${theme.breakpoints.down('md')} {\n flex-direction: column;\n }\n `,\n fieldVertical: css`\n flex-direction: column;\n `,\n field: css`\n display: flex;\n margin: ${theme.spacing(2)} 0;\n\n & > div:first-child {\n width: 110px;\n padding-right: ${theme.spacing(1)};\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.fontWeightBold};\n line-height: 1.8;\n }\n & > div:nth-child(2) {\n flex: 1;\n color: ${theme.colors.text.secondary};\n }\n `,\n});\n","import React, { ReactNode, useState } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { IconButton, useStyles2 } from '@grafana/ui';\n\nexport interface DynamicTableColumnProps {\n id: string | number;\n label: string;\n\n renderCell: (item: DynamicTableItemProps, index: number) => ReactNode;\n size?: number | string;\n}\n\nexport interface DynamicTableItemProps {\n id: string | number;\n data: T;\n renderExpandedContent?: () => ReactNode;\n}\n\nexport interface DynamicTableProps {\n cols: Array>;\n items: Array>;\n\n isExpandable?: boolean;\n\n // provide these to manually control expanded status\n onCollapse?: (item: DynamicTableItemProps) => void;\n onExpand?: (item: DynamicTableItemProps) => void;\n isExpanded?: (item: DynamicTableItemProps) => boolean;\n\n renderExpandedContent?: (\n item: DynamicTableItemProps,\n index: number,\n items: Array>\n ) => ReactNode;\n testIdGenerator?: (item: DynamicTableItemProps, index: number) => string;\n renderPrefixHeader?: () => ReactNode;\n renderPrefixCell?: (\n item: DynamicTableItemProps,\n index: number,\n items: Array>\n ) => ReactNode;\n}\n\nexport const DynamicTable = ({\n cols,\n items,\n isExpandable = false,\n onCollapse,\n onExpand,\n isExpanded,\n renderExpandedContent,\n testIdGenerator,\n\n // render a cell BEFORE expand icon for header/ each row.\n // currently use by RuleList to render guidelines\n renderPrefixCell,\n renderPrefixHeader,\n}: DynamicTableProps) => {\n if ((onCollapse || onExpand || isExpanded) && !(onCollapse && onExpand && isExpanded)) {\n throw new Error('either all of onCollapse, onExpand, isExpanded must be provided, or none');\n }\n if ((isExpandable || renderExpandedContent) && !(isExpandable && renderExpandedContent)) {\n throw new Error('either both isExpanded and renderExpandedContent must be provided, or neither');\n }\n const styles = useStyles2(getStyles(cols, isExpandable, !!renderPrefixHeader));\n\n const [expandedIds, setExpandedIds] = useState>([]);\n\n const toggleExpanded = (item: DynamicTableItemProps) => {\n if (isExpanded && onCollapse && onExpand) {\n isExpanded(item) ? onCollapse(item) : onExpand(item);\n } else {\n setExpandedIds(\n expandedIds.includes(item.id) ? expandedIds.filter((itemId) => itemId !== item.id) : [...expandedIds, item.id]\n );\n }\n };\n return (\n
\n
\n {renderPrefixHeader && renderPrefixHeader()}\n {isExpandable &&
}\n {cols.map((col) => (\n
\n {col.label}\n
\n ))}\n
\n\n {items.map((item, index) => {\n const isItemExpanded = isExpanded ? isExpanded(item) : expandedIds.includes(item.id);\n return (\n
\n {renderPrefixCell && renderPrefixCell(item, index, items)}\n {isExpandable && (\n
\n toggleExpanded(item)}\n type=\"button\"\n />\n
\n )}\n {cols.map((col) => (\n
\n {col.renderCell(item, index)}\n
\n ))}\n {isItemExpanded && renderExpandedContent && (\n
\n {renderExpandedContent(item, index, items)}\n
\n )}\n
\n );\n })}\n
\n );\n};\n\nconst getStyles = (\n cols: Array>,\n isExpandable: boolean,\n hasPrefixCell: boolean\n) => {\n const sizes = cols.map((col) => {\n if (!col.size) {\n return 'auto';\n }\n\n if (typeof col.size === 'number') {\n return `${col.size}fr`;\n }\n\n return col.size;\n });\n\n if (isExpandable) {\n sizes.unshift('calc(1em + 16px)');\n }\n\n if (hasPrefixCell) {\n sizes.unshift('0');\n }\n\n return (theme: GrafanaTheme2) => ({\n container: css`\n border: 1px solid ${theme.colors.border.strong};\n border-radius: 2px;\n color: ${theme.colors.text.secondary};\n `,\n row: css`\n display: grid;\n grid-template-columns: ${sizes.join(' ')};\n grid-template-rows: 1fr auto;\n\n &:nth-child(2n + 1) {\n background-color: ${theme.colors.background.secondary};\n }\n\n &:nth-child(2n) {\n background-color: ${theme.colors.background.primary};\n }\n\n ${theme.breakpoints.down('sm')} {\n grid-template-columns: auto 1fr;\n grid-template-areas: 'left right';\n padding: 0 ${theme.spacing(0.5)};\n\n &:first-child {\n display: none;\n }\n\n ${hasPrefixCell\n ? `\n & > *:first-child {\n display: none;\n }\n `\n : ''}\n }\n `,\n cell: css`\n align-items: center;\n padding: ${theme.spacing(1)};\n\n ${theme.breakpoints.down('sm')} {\n padding: ${theme.spacing(1)} 0;\n grid-template-columns: 1fr;\n }\n `,\n bodyCell: css`\n overflow: hidden;\n word-break: break-all;\n ${theme.breakpoints.down('sm')} {\n grid-column-end: right;\n grid-column-start: right;\n\n &::before {\n content: attr(data-column);\n display: block;\n color: ${theme.colors.text.primary};\n }\n }\n `,\n expandCell: css`\n justify-content: center;\n\n ${theme.breakpoints.down('sm')} {\n align-items: start;\n grid-area: left;\n }\n `,\n expandedContentRow: css`\n grid-column-end: ${sizes.length + 1};\n grid-column-start: ${hasPrefixCell ? 3 : 2};\n grid-row: 2;\n padding: 0 ${theme.spacing(3)} 0 ${theme.spacing(1)};\n position: relative;\n\n ${theme.breakpoints.down('sm')} {\n grid-column-start: 2;\n border-top: 1px solid ${theme.colors.border.strong};\n grid-row: auto;\n padding: ${theme.spacing(1)} 0 0 0;\n }\n `,\n expandButton: css`\n margin-right: 0;\n display: block;\n `,\n });\n};\n","import React, { FC } from 'react';\nimport { useStyles } from '@grafana/ui';\nimport { cx, css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\n\ntype Props = React.HTMLAttributes;\n\nexport const Well: FC = ({ children, className }) => {\n const styles = useStyles(getStyles);\n return
{children}
;\n};\nexport const getStyles = (theme: GrafanaTheme) => ({\n wrapper: css`\n background-color: ${theme.colors.panelBg};\n border: solid 1px ${theme.colors.formInputBorder};\n border-radius: ${theme.border.radius.sm};\n padding: ${theme.spacing.xs} ${theme.spacing.sm};\n font-family: ${theme.typography.fontFamily.monospace};\n `,\n});\n","import React, { FC, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\nimport { css } from '@emotion/css';\nimport { AppEvents, GrafanaTheme2, urlUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Button, ConfirmModal, ClipboardButton, HorizontalGroup, LinkButton, useStyles2 } from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { appEvents } from 'app/core/core';\nimport { useIsRuleEditable } from '../../hooks/useIsRuleEditable';\nimport { Annotation } from '../../utils/constants';\nimport { getRulesSourceName, isCloudRulesSource } from '../../utils/datasource';\nimport { createExploreLink, createViewLink } from '../../utils/misc';\nimport * as ruleId from '../../utils/rule-id';\nimport { deleteRuleAction } from '../../state/actions';\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\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 style = useStyles2(getStyles);\n const { namespace, group, rulerRule } = rule;\n const [ruleToDelete, setRuleToDelete] = useState();\n\n const leftButtons: JSX.Element[] = [];\n const rightButtons: JSX.Element[] = [];\n\n const { isEditable } = useIsRuleEditable(getRulesSourceName(rulesSource), 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 ruleUrl = `${encodeURIComponent(rulesSource.name)}/${encodeURIComponent(rule.name)}`;\n return `${config.appUrl}${config.appSubUrl}/alerting/${ruleUrl}/find`;\n }\n\n return window.location.href.split('?')[0];\n };\n\n // explore does not support grafana rule queries atm\n if (isCloudRulesSource(rulesSource) && contextSrv.isEditor) {\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 (!isViewMode) {\n rightButtons.push(\n \n View\n \n );\n }\n\n if (isEditable && rulerRule) {\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 appEvents.emit(AppEvents.alertSuccess, ['URL copied!']);\n }}\n onClipboardError={(e) => {\n appEvents.emit(AppEvents.alertError, ['Error while copying URL', e.text]);\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 setRuleToDelete(rule)}\n >\n Delete\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 from 'react';\nimport { css } from '@emotion/css';\nimport { useStyles2 } from '@grafana/ui';\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 { 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';\nimport React, { useMemo } from 'react';\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 {' '}\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 { Editor } from '@grafana/slate-react';\nimport React, { FC, useMemo } from 'react';\nimport PromqlSyntax from 'app/plugins/datasource/prometheus/promql';\nimport LogqlSyntax from 'app/plugins/datasource/loki/syntax';\nimport { LanguageMap, languages as prismLanguages } from 'prismjs';\nimport { makeValue, SlatePrism, useStyles } from '@grafana/ui';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { RulesSource } from 'app/types/unified-alerting';\nimport { DataSourceType, isCloudRulesSource } from '../utils/datasource';\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 React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\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 { Alert } from 'app/types/unified-alerting';\nimport React, { FC } from 'react';\nimport { AnnotationDetailsField } from '../AnnotationDetailsField';\nimport { DetailsField } from '../DetailsField';\n\ninterface Props {\n instance: Alert;\n}\n\nexport const AlertInstanceDetails: FC = ({ instance }) => {\n const annotations = (Object.entries(instance.annotations || {}) || []).filter(([_, value]) => !!value.trim());\n\n return (\n
\n {instance.value && (\n \n {instance.value}\n \n )}\n {annotations.map(([key, value]) => (\n \n ))}\n
\n );\n};\n","import { GrafanaTheme2 } from '@grafana/data';\nimport { Alert } from 'app/types/unified-alerting';\nimport { css } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\nimport { alertInstanceKey } from '../../utils/rules';\nimport { AlertLabels } from '../AlertLabels';\nimport { AlertInstanceDetails } from './AlertInstanceDetails';\nimport { AlertStateTag } from './AlertStateTag';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\n\ninterface Props {\n instances: Alert[];\n}\n\ntype AlertTableColumnProps = DynamicTableColumnProps;\ntype AlertTableItemProps = DynamicTableItemProps;\n\nexport const AlertInstancesTable: FC = ({ instances }) => {\n // add key & sort instance. API returns instances in random order, different every time.\n const items = useMemo(\n (): AlertTableItemProps[] =>\n instances\n .map((instance) => ({\n data: instance,\n id: alertInstanceKey(instance),\n }))\n .sort((a, b) => a.id.localeCompare(b.id)),\n [instances]\n );\n\n return (\n }\n />\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n colExpand: css`\n width: 36px;\n `,\n colState: css`\n width: 110px;\n `,\n labelsCell: css`\n padding-top: ${theme.spacing(0.5)} !important;\n padding-bottom: ${theme.spacing(0.5)} !important;\n `,\n createdCell: css`\n white-space: nowrap;\n `,\n table: css`\n td {\n vertical-align: top;\n padding-top: ${theme.spacing(1)};\n padding-bottom: ${theme.spacing(1)};\n }\n `,\n});\n\nconst columns: AlertTableColumnProps[] = [\n {\n id: 'state',\n label: 'State',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: { state } }) => ,\n size: '80px',\n },\n {\n id: 'labels',\n label: 'Labels',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: { labels } }) => ,\n },\n {\n id: 'created',\n label: 'Created',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: { activeAt } }) => (\n <>{activeAt.startsWith('0001') ? '-' : activeAt.substr(0, 19).replace('T', ' ')}\n ),\n size: '150px',\n },\n];\n","import { Rule } from 'app/types/unified-alerting';\nimport React from 'react';\nimport { isAlertingRule } from '../../utils/rules';\nimport { DetailsField } from '../DetailsField';\nimport { AlertInstancesTable } from './AlertInstancesTable';\n\ntype Props = {\n promRule?: Rule;\n};\n\nexport function RuleDetailsMatchingInstances(props: Props): JSX.Element | null {\n const { promRule } = props;\n\n if (!isAlertingRule(promRule) || !promRule.alerts?.length) {\n return null;\n }\n\n return (\n \n \n \n );\n}\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, Tooltip, useStyles2 } from '@grafana/ui';\nimport { Rule } from 'app/types/unified-alerting';\nimport React, { FC } from 'react';\n\ninterface Prom {\n rule: Rule;\n}\n\nexport const RuleHealth: FC = ({ rule }) => {\n const style = useStyles2(getStyle);\n if (rule.health === 'err' || rule.health === 'error') {\n return (\n \n
\n \n error\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 color: ${theme.colors.warning.text};\n & > * + * {\n margin-left: ${theme.spacing(1)};\n }\n `,\n});\n","import { css } from '@emotion/css';\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';\nimport React, { FC, useMemo } from 'react';\nimport { isAlertingRule, isRecordingRule, getFirstActiveAt } from '../../utils/rules';\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 {\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';\nimport { useMemo, useRef } from 'react';\nimport {\n getAllRulesSources,\n getRulesSourceByName,\n isCloudRulesSource,\n isGrafanaRulesSource,\n} from '../utils/datasource';\nimport { isAlertingRule, isAlertingRulerRule, isRecordingRulerRule } from '../utils/rules';\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 if (isGrafanaRulesSource(rulesSource)) {\n // merge all groups in case of grafana managed, essentially treating namespaces (folders) as gorups\n result.forEach((namespace) => {\n namespace.groups = [\n {\n name: 'default',\n rules: namespace.groups.flatMap((g) => g.rules).sort((a, b) => a.name.localeCompare(b.name)),\n },\n ];\n });\n }\n cache.current[rulesSourceName] = { promRules, rulerRules, result };\n return result;\n })\n .flat(),\n [promRulesResponses, rulerRulesResponses, rulesSources]\n );\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 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.substr(1, query.length - 2);\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 { FolderDTO } from 'app/types';\nimport { useDispatch } from 'react-redux';\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\nimport { useEffect } from 'react';\nimport { fetchFolderIfNotFetchedAction } from '../state/actions';\nimport { initialAsyncRequestState } from '../utils/redux';\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 { isGrafanaRulerRule } from '../utils/rules';\nimport { RulerRuleDTO } from 'app/types/unified-alerting-dto';\nimport { useFolder } from './useFolder';\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\nimport { useDispatch } from 'react-redux';\nimport { useEffect } from 'react';\nimport { checkIfLotexSupportsEditingRulesAction } from '../state/actions';\nimport { GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\ninterface ResultBag {\n isEditable?: boolean;\n loading: boolean;\n}\n\nexport function useIsRuleEditable(rulesSourceName: string, rule?: RulerRuleDTO): ResultBag {\n const checkEditingRequests = useUnifiedAlertingSelector((state) => state.lotexSupportsRuleEditing);\n const dispatch = useDispatch();\n const folderUID = rule && isGrafanaRulerRule(rule) ? rule.grafana_alert.namespace_uid : undefined;\n\n const { folder, loading } = useFolder(folderUID);\n\n useEffect(() => {\n if (checkEditingRequests[rulesSourceName] === undefined && rulesSourceName !== GRAFANA_RULES_SOURCE_NAME) {\n dispatch(checkIfLotexSupportsEditingRulesAction(rulesSourceName));\n }\n }, [rulesSourceName, checkEditingRequests, dispatch]);\n\n if (!rule) {\n return { isEditable: false, loading: false };\n }\n\n // grafana rules can be edited if user can edit the folder they're in\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 return {\n isEditable: folder?.canSave,\n loading,\n };\n }\n\n // prom rules are only editable by users with Editor role and only if rules source supports editing\n return {\n isEditable: contextSrv.isEditor && !!checkEditingRequests[rulesSourceName]?.result,\n loading: !!checkEditingRequests[rulesSourceName]?.loading,\n };\n}\n"],"names":["wellableAnnotationKeys","AnnotationDetailsField","annotationKey","value","label","annotationLabels","Tooltip","content","placement","theme","horizontal","AnnotationValue","styles","useStyles","getStyles","includes","startsWith","href","target","className","link","well","css","colors","textBlue","DetailsField","children","useStyles2","cx","field","fieldHorizontal","fieldVertical","breakpoints","down","spacing","typography","size","sm","fontWeightBold","text","secondary","DynamicTable","cols","items","isExpandable","onCollapse","onExpand","isExpanded","renderExpandedContent","testIdGenerator","renderPrefixCell","renderPrefixHeader","Error","expandedIds","setExpandedIds","useState","container","row","cell","map","col","id","item","index","isItemExpanded","expandCell","IconButton","expandButton","name","onClick","filter","itemId","toggleExpanded","type","bodyCell","renderCell","expandedContentRow","hasPrefixCell","sizes","unshift","border","strong","join","background","primary","length","Well","wrapper","panelBg","formInputBorder","radius","xs","fontFamily","monospace","RuleDetailsActionButtons","rule","rulesSource","dispatch","useDispatch","location","useLocation","style","namespace","group","rulerRule","ruleToDelete","setRuleToDelete","leftButtons","rightButtons","isEditable","useIsRuleEditable","getRulesSourceName","returnTo","pathname","search","isViewMode","endsWith","deleteRule","identifier","ruleId","deleteRuleAction","navigateTo","undefined","buildShareUrl","isCloudRulesSource","ruleUrl","encodeURIComponent","config","window","split","contextSrv","push","LinkButton","button","variant","icon","createExploreLink","query","annotations","Annotation","dashboardUID","panelId","createViewLink","sourceName","editURL","urlUtil","ClipboardButton","onClipboardCopy","appEvents","AppEvents","onClipboardError","e","getText","Button","HorizontalGroup","width","ConfirmModal","isOpen","title","body","confirmText","onConfirm","onDismiss","medium","RuleDetailsAnnotations","props","key","RuleDetailsDataSources","dataSources","useMemo","meta","info","logos","small","isGrafanaRulerRule","data","grafana_alert","unique","reduce","ds","getDataSourceSrv","getInstanceSettings","datasourceUid","uid","ExpressionDatasourceUID","Object","values","dataSourceIcon","src","HighlightedQuery","language","expr","plugins","SlatePrism","onlyIn","node","getSyntax","prismLanguages","LogqlSyntax","PromqlSyntax","slateValue","makeValue","readOnly","Expression","expression","DataSourceType","RuleDetailsExpression","exprRow","AlertInstanceDetails","instance","entries","_","trim","AlertInstancesTable","instances","alertInstanceKey","sort","a","b","localeCompare","columns","state","AlertStateTag","labels","AlertLabels","activeAt","substr","replace","RuleDetailsMatchingInstances","promRule","isAlertingRule","alerts","RuleHealth","getStyle","health","lastError","warn","Icon","warning","RuleState","isDeleting","isCreating","forTime","PromAlertingRuleState","firstActiveAt","getFirstActiveAt","String","for","intervalToAbbreviatedDurationString","start","end","Date","align","Spinner","isRecordingRule","bodySmall","fontSize","useCombinedRuleNamespaces","rulesSourceName","promRulesResponses","useUnifiedAlertingSelector","promRules","rulerRulesResponses","rulerRules","cache","useRef","rulesSources","getRulesSourceByName","getAllRulesSources","result","cached","current","namespaces","forEach","namespaceName","groups","combinedGroup","interval","rules","isAlertingRulerRule","alert","isRecordingRulerRule","record","rulerRuleToCombinedRule","addRulerGroupsToCombinedNamespace","find","g","existingRule","isGrafanaRulesSource","isCombinedRuleEqualToPromRule","getExistingRuleInGroup","promRuleToCombinedRule","addPromGroupsToCombinedNamespace","flatMap","flat","combinedRule","checkQuery","JSON","stringify","hashQuery","useFolder","folderRequests","folders","useEffect","fetchFolderIfNotFetchedAction","request","initialAsyncRequestState","folder","loading","checkEditingRequests","lotexSupportsRuleEditing","folderUID","namespace_uid","GRAFANA_RULES_SOURCE_NAME","checkIfLotexSupportsEditingRulesAction","canSave"],"sourceRoot":""}