{"version":3,"file":"AlertSilences.0dfd49f78dc93c695e30.js","mappings":"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","sources":["webpack://grafana/./public/app/core/hooks/useCleanup.ts","webpack://grafana/./public/app/features/alerting/unified/components/silences/MatchedSilencedRules.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/MatchersField.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencePeriod.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencesEditor.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/ActionButton.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/NoSilencesCTA.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencedAlertsTableRow.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencedAlertsTable.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilenceDetails.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilenceStateTag.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencesFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencesTable.tsx","webpack://grafana/./public/app/features/alerting/unified/Silences.tsx","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/NoAlertManagerWarning.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/ActionIcon.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/AmAlertStateTag.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/Matchers.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useAlertManagerSourceName.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useAlertManagerSources.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useCombinedRuleNamespaces.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useURLSearchParams.ts","webpack://grafana/./public/app/features/alerting/unified/styles/table.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { cleanUpAction, StateSelector } from '../actions/cleanUp';\n\nexport function useCleanup<T>(stateSelector: StateSelector<T>) {\n const dispatch = useDispatch();\n //bit of a hack to unburden user from having to wrap stateSelcetor in a useCallback. Otherwise cleanup would happen on every render\n const selectorRef = useRef(stateSelector);\n selectorRef.current = stateSelector;\n useEffect(() => {\n return () => {\n dispatch(cleanUpAction({ stateSelector: selectorRef.current }));\n };\n }, [dispatch]);\n}\n","import { css } from '@emotion/css';\nimport React, { useEffect, useState } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { useDispatch } from 'react-redux';\nimport { useDebounce } from 'react-use';\n\nimport { dateTime, GrafanaTheme2 } from '@grafana/data';\nimport { Badge, useStyles2 } from '@grafana/ui';\nimport { Alert, AlertingRule } from 'app/types/unified-alerting';\n\nimport { useCombinedRuleNamespaces } from '../../hooks/useCombinedRuleNamespaces';\nimport { fetchAllPromAndRulerRulesAction } from '../../state/actions';\nimport { MatcherFieldValue, SilenceFormFields } from '../../types/silence-form';\nimport { findAlertInstancesWithMatchers } from '../../utils/matchers';\nimport { isAlertingRule } from '../../utils/rules';\nimport { AlertLabels } from '../AlertLabels';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\nimport { AlertStateTag } from '../rules/AlertStateTag';\n\ntype MatchedRulesTableItemProps = DynamicTableItemProps<{\n matchedInstance: Alert;\n}>;\ntype MatchedRulesTableColumnProps = DynamicTableColumnProps<{ matchedInstance: Alert }>;\n\nexport const MatchedSilencedRules = () => {\n const [matchedAlertRules, setMatchedAlertRules] = useState<MatchedRulesTableItemProps[]>([]);\n const formApi = useFormContext<SilenceFormFields>();\n const dispatch = useDispatch();\n const { watch } = formApi;\n const matchers: MatcherFieldValue[] = watch('matchers');\n const styles = useStyles2(getStyles);\n const columns = useColumns();\n\n useEffect(() => {\n dispatch(fetchAllPromAndRulerRulesAction());\n }, [dispatch]);\n\n const combinedNamespaces = useCombinedRuleNamespaces();\n useDebounce(\n () => {\n const matchedInstances = combinedNamespaces.flatMap((namespace) => {\n return namespace.groups.flatMap((group) => {\n return group.rules\n .map((combinedRule) => combinedRule.promRule)\n .filter((rule): rule is AlertingRule => isAlertingRule(rule))\n .flatMap((rule) => findAlertInstancesWithMatchers(rule.alerts ?? [], matchers));\n });\n });\n setMatchedAlertRules(matchedInstances);\n },\n 500,\n [combinedNamespaces, matchers]\n );\n\n return (\n <div>\n <h4 className={styles.title}>\n Affected alert instances\n {matchedAlertRules.length > 0 ? (\n <Badge className={styles.badge} color=\"blue\" text={matchedAlertRules.length} />\n ) : null}\n </h4>\n <div className={styles.table}>\n {matchers.every((matcher) => !matcher.value && !matcher.name) ? (\n <span>Add a valid matcher to see affected alerts</span>\n ) : (\n <>\n <DynamicTable items={matchedAlertRules.slice(0, 5) ?? []} isExpandable={false} cols={columns} />\n {matchedAlertRules.length > 5 && (\n <div className={styles.moreMatches}>and {matchedAlertRules.length - 5} more</div>\n )}\n </>\n )}\n </div>\n </div>\n );\n};\n\nfunction useColumns(): MatchedRulesTableColumnProps[] {\n return [\n {\n id: 'state',\n label: 'State',\n renderCell: function renderStateTag({ data: { matchedInstance } }) {\n return <AlertStateTag state={matchedInstance.state} />;\n },\n size: '160px',\n },\n {\n id: 'labels',\n label: 'Labels',\n renderCell: function renderName({ data: { matchedInstance } }) {\n return <AlertLabels labels={matchedInstance.labels} />;\n },\n size: '250px',\n },\n {\n id: 'created',\n label: 'Created',\n renderCell: function renderSummary({ data: { matchedInstance } }) {\n return (\n <>\n {matchedInstance.activeAt.startsWith('0001')\n ? '-'\n : dateTime(matchedInstance.activeAt).format('YYYY-MM-DD HH:mm:ss')}\n </>\n );\n },\n size: '400px',\n },\n ];\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n table: css`\n max-width: ${theme.breakpoints.values.lg}px;\n `,\n moreMatches: css`\n margin-top: ${theme.spacing(1)};\n `,\n title: css`\n display: flex;\n align-items: center;\n `,\n badge: css`\n margin-left: ${theme.spacing(1)};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\nimport { useFormContext, useFieldArray } from 'react-hook-form';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, Field, Input, IconButton, InputControl, useStyles2, Select } from '@grafana/ui';\nimport { MatcherOperator } from 'app/plugins/datasource/alertmanager/types';\n\nimport { SilenceFormFields } from '../../types/silence-form';\nimport { matcherFieldOptions } from '../../utils/alertmanager';\n\ninterface Props {\n className?: string;\n}\n\nconst MatchersField: FC<Props> = ({ className }) => {\n const styles = useStyles2(getStyles);\n const formApi = useFormContext<SilenceFormFields>();\n const {\n control,\n register,\n formState: { errors },\n } = formApi;\n\n const { fields: matchers = [], append, remove } = useFieldArray<SilenceFormFields>({ name: 'matchers' });\n\n return (\n <div className={cx(className, styles.wrapper)}>\n <Field label=\"Matching labels\" required>\n <div>\n <div className={styles.matchers}>\n {matchers.map((matcher, index) => {\n return (\n <div className={styles.row} key={`${matcher.id}`} data-testid=\"matcher\">\n <Field\n label=\"Label\"\n invalid={!!errors?.matchers?.[index]?.name}\n error={errors?.matchers?.[index]?.name?.message}\n >\n <Input\n {...register(`matchers.${index}.name` as const, {\n required: { value: true, message: 'Required.' },\n })}\n defaultValue={matcher.name}\n placeholder=\"label\"\n />\n </Field>\n <Field label={'Operator'}>\n <InputControl\n control={control}\n render={({ field: { onChange, ref, ...field } }) => (\n <Select\n {...field}\n menuShouldPortal\n onChange={(value) => onChange(value.value)}\n className={styles.matcherOptions}\n options={matcherFieldOptions}\n aria-label=\"operator\"\n />\n )}\n defaultValue={matcher.operator || matcherFieldOptions[0].value}\n name={`matchers.${index}.operator` as const}\n rules={{ required: { value: true, message: 'Required.' } }}\n />\n </Field>\n <Field\n label=\"Value\"\n invalid={!!errors?.matchers?.[index]?.value}\n error={errors?.matchers?.[index]?.value?.message}\n >\n <Input\n {...register(`matchers.${index}.value` as const, {\n required: { value: true, message: 'Required.' },\n })}\n defaultValue={matcher.value}\n placeholder=\"value\"\n />\n </Field>\n {matchers.length > 1 && (\n <IconButton\n className={styles.removeButton}\n tooltip=\"Remove matcher\"\n name={'trash-alt'}\n onClick={() => remove(index)}\n >\n Remove\n </IconButton>\n )}\n </div>\n );\n })}\n </div>\n <Button\n type=\"button\"\n icon=\"plus\"\n variant=\"secondary\"\n onClick={() => {\n const newMatcher = { name: '', value: '', operator: MatcherOperator.equal };\n append(newMatcher);\n }}\n >\n Add matcher\n </Button>\n </div>\n </Field>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n margin-top: ${theme.spacing(2)};\n `,\n row: css`\n display: flex;\n align-items: flex-start;\n flex-direction: row;\n background-color: ${theme.colors.background.secondary};\n padding: ${theme.spacing(1)} ${theme.spacing(1)} 0 ${theme.spacing(1)};\n & > * + * {\n margin-left: ${theme.spacing(2)};\n }\n `,\n removeButton: css`\n margin-left: ${theme.spacing(1)};\n margin-top: ${theme.spacing(2.5)};\n `,\n matcherOptions: css`\n min-width: 140px;\n `,\n matchers: css`\n max-width: ${theme.breakpoints.values.sm}px;\n margin: ${theme.spacing(1)} 0;\n padding-top: ${theme.spacing(0.5)};\n `,\n };\n};\n\nexport default MatchersField;\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useController, useFormContext } from 'react-hook-form';\n\nimport { dateTime, GrafanaTheme } from '@grafana/data';\nimport { Field, TimeRangeInput, useStyles } from '@grafana/ui';\n\nimport { SilenceFormFields } from '../../types/silence-form';\n\nexport const SilencePeriod = () => {\n const { control, getValues } = useFormContext<SilenceFormFields>();\n const styles = useStyles(getStyles);\n const {\n field: { onChange: onChangeStartsAt, value: startsAt },\n fieldState: { invalid: startsAtInvalid },\n } = useController({\n name: 'startsAt',\n control,\n rules: {\n validate: (value) => getValues().endsAt > value,\n },\n });\n\n const {\n field: { onChange: onChangeEndsAt, value: endsAt },\n fieldState: { invalid: endsAtInvalid },\n } = useController({\n name: 'endsAt',\n control,\n rules: {\n validate: (value) => getValues().startsAt < value,\n },\n });\n\n const {\n field: { onChange: onChangeTimeZone, value: timeZone },\n } = useController({\n name: 'timeZone',\n control,\n });\n\n const invalid = startsAtInvalid || endsAtInvalid;\n\n const from = dateTime(startsAt);\n const to = dateTime(endsAt);\n\n return (\n <Field\n className={styles.timeRange}\n label=\"Silence start and end\"\n error={invalid ? 'To is before or the same as from' : ''}\n invalid={invalid}\n >\n <TimeRangeInput\n value={{\n from,\n to,\n raw: {\n from,\n to,\n },\n }}\n timeZone={timeZone}\n onChange={(newValue) => {\n onChangeStartsAt(dateTime(newValue.from));\n onChangeEndsAt(dateTime(newValue.to));\n }}\n onChangeTimeZone={(newValue) => onChangeTimeZone(newValue)}\n hideTimeZone={false}\n hideQuickRanges={true}\n placeholder={'Select time range'}\n />\n </Field>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n timeRange: css`\n width: 400px;\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport { pickBy } from 'lodash';\nimport React, { FC, useMemo, useState } from 'react';\nimport { useForm, FormProvider } from 'react-hook-form';\nimport { useDispatch } from 'react-redux';\nimport { useDebounce } from 'react-use';\n\nimport {\n DefaultTimeZone,\n parseDuration,\n intervalToAbbreviatedDurationString,\n addDurationToDate,\n dateTime,\n isValidDate,\n GrafanaTheme2,\n} from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Button, Field, FieldSet, Input, LinkButton, TextArea, useStyles2 } from '@grafana/ui';\nimport { useCleanup } from 'app/core/hooks/useCleanup';\nimport { MatcherOperator, Silence, SilenceCreatePayload } from 'app/plugins/datasource/alertmanager/types';\n\nimport { useURLSearchParams } from '../../hooks/useURLSearchParams';\nimport { useUnifiedAlertingSelector } from '../../hooks/useUnifiedAlertingSelector';\nimport { createOrUpdateSilenceAction } from '../../state/actions';\nimport { SilenceFormFields } from '../../types/silence-form';\nimport { matcherToMatcherField, matcherFieldToMatcher } from '../../utils/alertmanager';\nimport { parseQueryParamMatchers } from '../../utils/matchers';\nimport { makeAMLink } from '../../utils/misc';\n\nimport { MatchedSilencedRules } from './MatchedSilencedRules';\nimport MatchersField from './MatchersField';\nimport { SilencePeriod } from './SilencePeriod';\n\ninterface Props {\n silence?: Silence;\n alertManagerSourceName: string;\n}\n\nconst defaultsFromQuery = (searchParams: URLSearchParams): Partial<SilenceFormFields> => {\n const defaults: Partial<SilenceFormFields> = {};\n\n const comment = searchParams.get('comment');\n const matchers = searchParams.getAll('matcher');\n\n const formMatchers = parseQueryParamMatchers(matchers);\n if (formMatchers.length) {\n defaults.matchers = formMatchers.map(matcherToMatcherField);\n }\n\n if (comment) {\n defaults.comment = comment;\n }\n\n return defaults;\n};\n\nconst getDefaultFormValues = (searchParams: URLSearchParams, silence?: Silence): SilenceFormFields => {\n const now = new Date();\n if (silence) {\n const isExpired = Date.parse(silence.endsAt) < Date.now();\n const interval = isExpired\n ? {\n start: now,\n end: addDurationToDate(now, { hours: 2 }),\n }\n : { start: new Date(silence.startsAt), end: new Date(silence.endsAt) };\n return {\n id: silence.id,\n startsAt: interval.start.toISOString(),\n endsAt: interval.end.toISOString(),\n comment: silence.comment,\n createdBy: silence.createdBy,\n duration: intervalToAbbreviatedDurationString(interval),\n isRegex: false,\n matchers: silence.matchers?.map(matcherToMatcherField) || [],\n matcherName: '',\n matcherValue: '',\n timeZone: DefaultTimeZone,\n };\n } else {\n const endsAt = addDurationToDate(now, { hours: 2 }); // Default time period is now + 2h\n return {\n id: '',\n startsAt: now.toISOString(),\n endsAt: endsAt.toISOString(),\n comment: `created ${dateTime().format('YYYY-MM-DD HH:mm')}`,\n createdBy: config.bootData.user.name,\n duration: '2h',\n isRegex: false,\n matchers: [{ name: '', value: '', operator: MatcherOperator.equal }],\n matcherName: '',\n matcherValue: '',\n timeZone: DefaultTimeZone,\n ...defaultsFromQuery(searchParams),\n };\n }\n};\n\nexport const SilencesEditor: FC<Props> = ({ silence, alertManagerSourceName }) => {\n const [urlSearchParams] = useURLSearchParams();\n\n const defaultValues = useMemo(() => getDefaultFormValues(urlSearchParams, silence), [silence, urlSearchParams]);\n const formAPI = useForm({ defaultValues });\n const dispatch = useDispatch();\n const styles = useStyles2(getStyles);\n\n const { loading } = useUnifiedAlertingSelector((state) => state.updateSilence);\n\n useCleanup((state) => state.unifiedAlerting.updateSilence);\n\n const { register, handleSubmit, formState, watch, setValue, clearErrors } = formAPI;\n\n const onSubmit = (data: SilenceFormFields) => {\n const { id, startsAt, endsAt, comment, createdBy, matchers: matchersFields } = data;\n const matchers = matchersFields.map(matcherFieldToMatcher);\n const payload = pickBy(\n {\n id,\n startsAt,\n endsAt,\n comment,\n createdBy,\n matchers,\n },\n (value) => !!value\n ) as SilenceCreatePayload;\n dispatch(\n createOrUpdateSilenceAction({\n alertManagerSourceName,\n payload,\n exitOnSave: true,\n successMessage: `Silence ${payload.id ? 'updated' : 'created'}`,\n })\n );\n };\n\n const duration = watch('duration');\n const startsAt = watch('startsAt');\n const endsAt = watch('endsAt');\n\n // Keep duration and endsAt in sync\n const [prevDuration, setPrevDuration] = useState(duration);\n useDebounce(\n () => {\n if (isValidDate(startsAt) && isValidDate(endsAt)) {\n if (duration !== prevDuration) {\n setValue('endsAt', dateTime(addDurationToDate(new Date(startsAt), parseDuration(duration))).toISOString());\n setPrevDuration(duration);\n } else {\n const startValue = new Date(startsAt).valueOf();\n const endValue = new Date(endsAt).valueOf();\n if (endValue > startValue) {\n const nextDuration = intervalToAbbreviatedDurationString({\n start: new Date(startsAt),\n end: new Date(endsAt),\n });\n setValue('duration', nextDuration);\n setPrevDuration(nextDuration);\n }\n }\n }\n },\n 700,\n [clearErrors, duration, endsAt, prevDuration, setValue, startsAt]\n );\n\n return (\n <FormProvider {...formAPI}>\n <form onSubmit={handleSubmit(onSubmit)}>\n <FieldSet label={`${silence ? 'Recreate silence' : 'Create silence'}`}>\n <div className={cx(styles.flexRow, styles.silencePeriod)}>\n <SilencePeriod />\n <Field\n label=\"Duration\"\n invalid={!!formState.errors.duration}\n error={\n formState.errors.duration &&\n (formState.errors.duration.type === 'required' ? 'Required field' : formState.errors.duration.message)\n }\n >\n <Input\n className={styles.createdBy}\n {...register('duration', {\n validate: (value) =>\n Object.keys(parseDuration(value)).length === 0\n ? 'Invalid duration. Valid example: 1d 4h (Available units: y, M, w, d, h, m, s)'\n : undefined,\n })}\n id=\"duration\"\n />\n </Field>\n </div>\n\n <MatchersField />\n <Field\n className={cx(styles.field, styles.textArea)}\n label=\"Comment\"\n required\n error={formState.errors.comment?.message}\n invalid={!!formState.errors.comment}\n >\n <TextArea\n {...register('comment', { required: { value: true, message: 'Required.' } })}\n rows={5}\n placeholder=\"Details about the silence\"\n />\n </Field>\n <MatchedSilencedRules />\n </FieldSet>\n <div className={styles.flexRow}>\n {loading && (\n <Button disabled={true} icon=\"fa fa-spinner\" variant=\"primary\">\n Saving...\n </Button>\n )}\n {!loading && <Button type=\"submit\">Submit</Button>}\n <LinkButton\n href={makeAMLink('alerting/silences', alertManagerSourceName)}\n variant={'secondary'}\n fill=\"outline\"\n >\n Cancel\n </LinkButton>\n </div>\n </form>\n </FormProvider>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n field: css`\n margin: ${theme.spacing(1, 0)};\n `,\n textArea: css`\n max-width: ${theme.breakpoints.values.sm}px;\n `,\n createdBy: css`\n width: 200px;\n `,\n flexRow: css`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n\n & > * {\n margin-right: ${theme.spacing(1)};\n }\n `,\n silencePeriod: css`\n max-width: ${theme.breakpoints.values.sm}px;\n `,\n});\n\nexport default SilencesEditor;\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { useStyles } from '@grafana/ui';\nimport { Button, ButtonProps } from '@grafana/ui/src/components/Button';\n\ntype Props = Omit<ButtonProps, 'variant' | 'size'>;\n\nexport const ActionButton: FC<Props> = ({ className, ...restProps }) => (\n <Button variant=\"secondary\" size=\"xs\" className={cx(useStyles(getStyle), className)} {...restProps} />\n);\n\nexport const getStyle = (theme: GrafanaTheme) => css`\n height: 24px;\n font-size: ${theme.typography.size.sm};\n`;\n","import React, { FC } from 'react';\n\nimport { CallToActionCard } from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { contextSrv } from 'app/core/services/context_srv';\n\nimport { getInstancesPermissions } from '../../utils/access-control';\nimport { makeAMLink } from '../../utils/misc';\n\ntype Props = {\n alertManagerSourceName: string;\n};\n\nexport const NoSilencesSplash: FC<Props> = ({ alertManagerSourceName }) => {\n const permissions = getInstancesPermissions(alertManagerSourceName);\n\n if (contextSrv.hasAccess(permissions.create, contextSrv.isEditor)) {\n return (\n <EmptyListCTA\n title=\"You haven't created any silences yet\"\n buttonIcon=\"bell-slash\"\n buttonLink={makeAMLink('alerting/silence/new', alertManagerSourceName)}\n buttonTitle=\"New silence\"\n />\n );\n }\n return <CallToActionCard callToActionElement={<div />} message=\"No silences found.\" />;\n};\n","import React, { FC, useState } from 'react';\n\nimport { intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { AlertmanagerAlert } from 'app/plugins/datasource/alertmanager/types';\n\nimport { AlertLabels } from '../AlertLabels';\nimport { CollapseToggle } from '../CollapseToggle';\n\nimport { AmAlertStateTag } from './AmAlertStateTag';\n\ninterface Props {\n alert: AlertmanagerAlert;\n className?: string;\n}\n\nexport const SilencedAlertsTableRow: FC<Props> = ({ alert, className }) => {\n const [isCollapsed, setIsCollapsed] = useState(true);\n\n const duration = intervalToAbbreviatedDurationString({\n start: new Date(alert.startsAt),\n end: new Date(alert.endsAt),\n });\n const alertName = Object.entries(alert.labels).reduce((name, [labelKey, labelValue]) => {\n if (labelKey === 'alertname' || labelKey === '__alert_rule_title__') {\n name = labelValue;\n }\n return name;\n }, '');\n return (\n <>\n <tr className={className}>\n <td>\n <CollapseToggle isCollapsed={isCollapsed} onToggle={(collapsed) => setIsCollapsed(collapsed)} />\n </td>\n <td>\n <AmAlertStateTag state={alert.status.state} />\n </td>\n <td>for {duration} seconds</td>\n <td>{alertName}</td>\n </tr>\n {!isCollapsed && (\n <tr className={className}>\n <td></td>\n <td colSpan={5}>\n <AlertLabels labels={alert.labels} />\n </td>\n </tr>\n )}\n </>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { AlertmanagerAlert } from 'app/plugins/datasource/alertmanager/types';\n\nimport { getAlertTableStyles } from '../../styles/table';\n\nimport { SilencedAlertsTableRow } from './SilencedAlertsTableRow';\n\ninterface Props {\n silencedAlerts: AlertmanagerAlert[];\n}\n\nconst SilencedAlertsTable: FC<Props> = ({ silencedAlerts }) => {\n const tableStyles = useStyles2(getAlertTableStyles);\n const styles = useStyles2(getStyles);\n\n if (!!silencedAlerts.length) {\n return (\n <table className={cx(tableStyles.table, styles.tableMargin)}>\n <colgroup>\n <col className={tableStyles.colExpand} />\n <col className={styles.colState} />\n <col />\n <col className={styles.colName} />\n </colgroup>\n <thead>\n <tr>\n <th></th>\n <th>State</th>\n <th></th>\n <th>Alert name</th>\n </tr>\n </thead>\n <tbody>\n {silencedAlerts.map((alert, index) => {\n return (\n <SilencedAlertsTableRow\n key={alert.fingerprint}\n alert={alert}\n className={index % 2 === 0 ? tableStyles.evenRow : ''}\n />\n );\n })}\n </tbody>\n </table>\n );\n } else {\n return null;\n }\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n tableMargin: css`\n margin-bottom: ${theme.spacing(1)};\n `,\n colState: css`\n width: 110px;\n `,\n colName: css`\n width: 65%;\n `,\n});\n\nexport default SilencedAlertsTable;\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { dateMath, GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport SilencedAlertsTable from './SilencedAlertsTable';\nimport { SilenceTableItem } from './SilencesTable';\n\ninterface Props {\n silence: SilenceTableItem;\n}\n\nexport const SilenceDetails = ({ silence }: Props) => {\n const { startsAt, endsAt, comment, createdBy, silencedAlerts } = silence;\n const styles = useStyles2(getStyles);\n\n const dateDisplayFormat = 'YYYY-MM-DD HH:mm';\n const startsAtDate = dateMath.parse(startsAt);\n const endsAtDate = dateMath.parse(endsAt);\n const duration = intervalToAbbreviatedDurationString({ start: new Date(startsAt), end: new Date(endsAt) });\n return (\n <div className={styles.container}>\n <div className={styles.title}>Comment</div>\n <div>{comment}</div>\n <div className={styles.title}>Schedule</div>\n <div>{`${startsAtDate?.format(dateDisplayFormat)} - ${endsAtDate?.format(dateDisplayFormat)}`}</div>\n <div className={styles.title}>Duration</div>\n <div> {duration}</div>\n <div className={styles.title}>Created by</div>\n <div> {createdBy}</div>\n <div className={styles.title}>Affected alerts</div>\n <SilencedAlertsTable silencedAlerts={silencedAlerts} />\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css`\n display: grid;\n grid-template-columns: 1fr 9fr;\n grid-row-gap: 1rem;\n `,\n title: css`\n color: ${theme.colors.text.primary};\n `,\n row: css`\n margin: ${theme.spacing(1, 0)};\n `,\n});\n","import React, { FC } from 'react';\n\nimport { SilenceState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { State, StateTag } from '../StateTag';\n\nconst silenceStateToState: Record<SilenceState, State> = {\n [SilenceState.Active]: 'good',\n [SilenceState.Expired]: 'neutral',\n [SilenceState.Pending]: 'neutral',\n};\n\ninterface Props {\n state: SilenceState;\n}\n\nexport const SilenceStateTag: FC<Props> = ({ state }) => (\n <StateTag state={silenceStateToState[state]}>{state}</StateTag>\n);\n","import { css } from '@emotion/css';\nimport { debounce, uniqueId } from 'lodash';\nimport React, { FormEvent, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Label, Icon, Input, Tooltip, RadioButtonGroup, useStyles2, Button, Field } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { SilenceState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { parseMatchers } from '../../utils/alertmanager';\nimport { getSilenceFiltersFromUrlParams } from '../../utils/misc';\n\nconst stateOptions: SelectableValue[] = Object.entries(SilenceState).map(([key, value]) => ({\n label: key,\n value,\n}));\n\nconst getQueryStringKey = () => uniqueId('query-string-');\n\nexport const SilencesFilter = () => {\n const [queryStringKey, setQueryStringKey] = useState(getQueryStringKey());\n const [queryParams, setQueryParams] = useQueryParams();\n const { queryString, silenceState } = getSilenceFiltersFromUrlParams(queryParams);\n const styles = useStyles2(getStyles);\n\n const handleQueryStringChange = debounce((e: FormEvent<HTMLInputElement>) => {\n const target = e.target as HTMLInputElement;\n setQueryParams({ queryString: target.value || null });\n }, 400);\n\n const handleSilenceStateChange = (state: string) => {\n setQueryParams({ silenceState: state });\n };\n\n const clearFilters = () => {\n setQueryParams({\n queryString: null,\n silenceState: null,\n });\n setTimeout(() => setQueryStringKey(getQueryStringKey()));\n };\n\n const inputInvalid = queryString && queryString.length > 3 ? parseMatchers(queryString).length === 0 : false;\n\n return (\n <div className={styles.flexRow}>\n <Field\n className={styles.rowChild}\n label={\n <Label>\n <Stack gap={0.5}>\n <span>Search by matchers</span>\n <Tooltip\n content={\n <div>\n Filter silences by matchers using a comma separated list of matchers, ie:\n <pre>{`severity=critical, instance=~cluster-us-.+`}</pre>\n </div>\n }\n >\n <Icon name=\"info-circle\" size=\"sm\" />\n </Tooltip>\n </Stack>\n </Label>\n }\n invalid={inputInvalid}\n error={inputInvalid ? 'Query must use valid matcher syntax' : null}\n >\n <Input\n key={queryStringKey}\n className={styles.searchInput}\n prefix={<Icon name=\"search\" />}\n onChange={handleQueryStringChange}\n defaultValue={queryString ?? ''}\n placeholder=\"Search\"\n data-testid=\"search-query-input\"\n />\n </Field>\n <Field className={styles.rowChild} label=\"State\">\n <RadioButtonGroup options={stateOptions} value={silenceState} onChange={handleSilenceStateChange} />\n </Field>\n {(queryString || silenceState) && (\n <div className={styles.rowChild}>\n <Button variant=\"secondary\" icon=\"times\" onClick={clearFilters}>\n Clear filters\n </Button>\n </div>\n )}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n searchInput: css`\n width: 360px;\n `,\n flexRow: css`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n padding-bottom: ${theme.spacing(2)};\n border-bottom: 1px solid ${theme.colors.border.strong};\n `,\n rowChild: css`\n margin-right: ${theme.spacing(1)};\n margin-bottom: 0;\n max-height: 52px;\n `,\n fieldLabel: css`\n font-size: 12px;\n font-weight: 500;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { GrafanaTheme2, dateMath } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Icon, useStyles2, Link, Button } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AlertmanagerAlert, Silence, SilenceState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { expireSilenceAction } from '../../state/actions';\nimport { getInstancesPermissions } from '../../utils/access-control';\nimport { parseMatchers } from '../../utils/alertmanager';\nimport { getSilenceFiltersFromUrlParams, makeAMLink } from '../../utils/misc';\nimport { Authorize } from '../Authorize';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\nimport { ActionButton } from '../rules/ActionButton';\nimport { ActionIcon } from '../rules/ActionIcon';\n\nimport { Matchers } from './Matchers';\nimport { NoSilencesSplash } from './NoSilencesCTA';\nimport { SilenceDetails } from './SilenceDetails';\nimport { SilenceStateTag } from './SilenceStateTag';\nimport { SilencesFilter } from './SilencesFilter';\n\nexport interface SilenceTableItem extends Silence {\n silencedAlerts: AlertmanagerAlert[];\n}\n\ntype SilenceTableColumnProps = DynamicTableColumnProps<SilenceTableItem>;\ntype SilenceTableItemProps = DynamicTableItemProps<SilenceTableItem>;\ninterface Props {\n silences: Silence[];\n alertManagerAlerts: AlertmanagerAlert[];\n alertManagerSourceName: string;\n}\n\nconst SilencesTable: FC<Props> = ({ silences, alertManagerAlerts, alertManagerSourceName }) => {\n const styles = useStyles2(getStyles);\n const [queryParams] = useQueryParams();\n const filteredSilences = useFilteredSilences(silences);\n const permissions = getInstancesPermissions(alertManagerSourceName);\n\n const { silenceState } = getSilenceFiltersFromUrlParams(queryParams);\n\n const showExpiredSilencesBanner =\n !!filteredSilences.length && (silenceState === undefined || silenceState === SilenceState.Expired);\n\n const columns = useColumns(alertManagerSourceName);\n\n const items = useMemo((): SilenceTableItemProps[] => {\n const findSilencedAlerts = (id: string) => {\n return alertManagerAlerts.filter((alert) => alert.status.silencedBy.includes(id));\n };\n return filteredSilences.map((silence) => {\n const silencedAlerts = findSilencedAlerts(silence.id);\n return {\n id: silence.id,\n data: { ...silence, silencedAlerts },\n };\n });\n }, [filteredSilences, alertManagerAlerts]);\n\n return (\n <div data-testid=\"silences-table\">\n {!!silences.length && (\n <>\n <SilencesFilter />\n <Authorize actions={[permissions.create]} fallback={contextSrv.isEditor}>\n <div className={styles.topButtonContainer}>\n <Link href={makeAMLink('/alerting/silence/new', alertManagerSourceName)}>\n <Button className={styles.addNewSilence} icon=\"plus\">\n New Silence\n </Button>\n </Link>\n </div>\n </Authorize>\n {!!items.length ? (\n <>\n <DynamicTable\n items={items}\n cols={columns}\n isExpandable\n renderExpandedContent={({ data }) => <SilenceDetails silence={data} />}\n />\n {showExpiredSilencesBanner && (\n <div className={styles.callout}>\n <Icon className={styles.calloutIcon} name=\"info-circle\" />\n <span>Expired silences are automatically deleted after 5 days.</span>\n </div>\n )}\n </>\n ) : (\n 'No matching silences found'\n )}\n </>\n )}\n {!silences.length && <NoSilencesSplash alertManagerSourceName={alertManagerSourceName} />}\n </div>\n );\n};\n\nconst useFilteredSilences = (silences: Silence[]) => {\n const [queryParams] = useQueryParams();\n return useMemo(() => {\n const { queryString, silenceState } = getSilenceFiltersFromUrlParams(queryParams);\n const silenceIdsString = queryParams?.silenceIds;\n return silences.filter((silence) => {\n if (typeof silenceIdsString === 'string') {\n const idsIncluded = silenceIdsString.split(',').includes(silence.id);\n if (!idsIncluded) {\n return false;\n }\n }\n if (queryString) {\n const matchers = parseMatchers(queryString);\n const matchersMatch = matchers.every((matcher) =>\n silence.matchers?.some(\n ({ name, value, isEqual, isRegex }) =>\n matcher.name === name &&\n matcher.value === value &&\n matcher.isEqual === isEqual &&\n matcher.isRegex === isRegex\n )\n );\n if (!matchersMatch) {\n return false;\n }\n }\n if (silenceState) {\n const stateMatches = silence.status.state === silenceState;\n if (!stateMatches) {\n return false;\n }\n }\n return true;\n });\n }, [queryParams, silences]);\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n topButtonContainer: css`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n `,\n addNewSilence: css`\n margin: ${theme.spacing(2, 0)};\n `,\n callout: css`\n background-color: ${theme.colors.background.secondary};\n border-top: 3px solid ${theme.colors.info.border};\n border-radius: 2px;\n height: 62px;\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-top: ${theme.spacing(2)};\n\n & > * {\n margin-left: ${theme.spacing(1)};\n }\n `,\n calloutIcon: css`\n color: ${theme.colors.info.text};\n `,\n editButton: css`\n margin-left: ${theme.spacing(0.5)};\n `,\n});\n\nfunction useColumns(alertManagerSourceName: string) {\n const dispatch = useDispatch();\n const styles = useStyles2(getStyles);\n const permissions = getInstancesPermissions(alertManagerSourceName);\n return useMemo((): SilenceTableColumnProps[] => {\n const handleExpireSilenceClick = (id: string) => {\n dispatch(expireSilenceAction(alertManagerSourceName, id));\n };\n const showActions = contextSrv.hasAccess(permissions.update, contextSrv.isEditor);\n const columns: SilenceTableColumnProps[] = [\n {\n id: 'state',\n label: 'State',\n renderCell: function renderStateTag({ data: { status } }) {\n return <SilenceStateTag state={status.state} />;\n },\n size: '88px',\n },\n {\n id: 'matchers',\n label: 'Matching labels',\n renderCell: function renderMatchers({ data: { matchers } }) {\n return <Matchers matchers={matchers || []} />;\n },\n size: 9,\n },\n {\n id: 'alerts',\n label: 'Alerts',\n renderCell: function renderSilencedAlerts({ data: { silencedAlerts } }) {\n return <span data-testid=\"alerts\">{silencedAlerts.length}</span>;\n },\n size: 1,\n },\n {\n id: 'schedule',\n label: 'Schedule',\n renderCell: function renderSchedule({ data: { startsAt, endsAt } }) {\n const startsAtDate = dateMath.parse(startsAt);\n const endsAtDate = dateMath.parse(endsAt);\n const dateDisplayFormat = 'YYYY-MM-DD HH:mm';\n return (\n <>\n {' '}\n {startsAtDate?.format(dateDisplayFormat)} {'-'}\n <br />\n {endsAtDate?.format(dateDisplayFormat)}\n </>\n );\n },\n size: '150px',\n },\n ];\n if (showActions) {\n columns.push({\n id: 'actions',\n label: 'Actions',\n renderCell: function renderActions({ data: silence }) {\n return (\n <Stack gap={0.5}>\n {silence.status.state === 'expired' ? (\n <Link href={makeAMLink(`/alerting/silence/${silence.id}/edit`, alertManagerSourceName)}>\n <ActionButton icon=\"sync\">Recreate</ActionButton>\n </Link>\n ) : (\n <ActionButton icon=\"bell\" onClick={() => handleExpireSilenceClick(silence.id)}>\n Unsilence\n </ActionButton>\n )}\n {silence.status.state !== 'expired' && (\n <ActionIcon\n className={styles.editButton}\n to={makeAMLink(`/alerting/silence/${silence.id}/edit`, alertManagerSourceName)}\n icon=\"pen\"\n tooltip=\"edit\"\n />\n )}\n </Stack>\n );\n },\n size: '147px',\n });\n }\n return columns;\n }, [alertManagerSourceName, dispatch, styles, permissions]);\n}\n\nexport default SilencesTable;\n","import React, { FC, useCallback, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { Redirect, Route, RouteChildrenProps, Switch, useLocation } from 'react-router-dom';\n\nimport { Alert, LoadingPlaceholder, withErrorBoundary } from '@grafana/ui';\nimport { Silence } from 'app/plugins/datasource/alertmanager/types';\n\nimport { AlertManagerPicker } from './components/AlertManagerPicker';\nimport { AlertingPageWrapper } from './components/AlertingPageWrapper';\nimport { NoAlertManagerWarning } from './components/NoAlertManagerWarning';\nimport SilencesEditor from './components/silences/SilencesEditor';\nimport SilencesTable from './components/silences/SilencesTable';\nimport { useAlertManagerSourceName } from './hooks/useAlertManagerSourceName';\nimport { useAlertManagersByPermission } from './hooks/useAlertManagerSources';\nimport { useUnifiedAlertingSelector } from './hooks/useUnifiedAlertingSelector';\nimport { fetchAmAlertsAction, fetchSilencesAction } from './state/actions';\nimport { SILENCES_POLL_INTERVAL_MS } from './utils/constants';\nimport { AsyncRequestState, initialAsyncRequestState } from './utils/redux';\n\nconst Silences: FC = () => {\n const alertManagers = useAlertManagersByPermission('instance');\n const [alertManagerSourceName, setAlertManagerSourceName] = useAlertManagerSourceName(alertManagers);\n\n const dispatch = useDispatch();\n const silences = useUnifiedAlertingSelector((state) => state.silences);\n const alertsRequests = useUnifiedAlertingSelector((state) => state.amAlerts);\n const alertsRequest = alertManagerSourceName\n ? alertsRequests[alertManagerSourceName] || initialAsyncRequestState\n : undefined;\n\n const location = useLocation();\n const isRoot = location.pathname.endsWith('/alerting/silences');\n\n useEffect(() => {\n function fetchAll() {\n if (alertManagerSourceName) {\n dispatch(fetchSilencesAction(alertManagerSourceName));\n dispatch(fetchAmAlertsAction(alertManagerSourceName));\n }\n }\n fetchAll();\n const interval = setInterval(() => fetchAll, SILENCES_POLL_INTERVAL_MS);\n return () => {\n clearInterval(interval);\n };\n }, [alertManagerSourceName, dispatch]);\n\n const { result, loading, error }: AsyncRequestState<Silence[]> =\n (alertManagerSourceName && silences[alertManagerSourceName]) || initialAsyncRequestState;\n\n const getSilenceById = useCallback((id: string) => result && result.find((silence) => silence.id === id), [result]);\n\n if (!alertManagerSourceName) {\n return isRoot ? (\n <AlertingPageWrapper pageId=\"silences\">\n <NoAlertManagerWarning availableAlertManagers={alertManagers} />\n </AlertingPageWrapper>\n ) : (\n <Redirect to=\"/alerting/silences\" />\n );\n }\n\n return (\n <AlertingPageWrapper pageId=\"silences\">\n <AlertManagerPicker\n disabled={!isRoot}\n current={alertManagerSourceName}\n onChange={setAlertManagerSourceName}\n dataSources={alertManagers}\n />\n {error && !loading && (\n <Alert severity=\"error\" title=\"Error loading silences\">\n {error.message || 'Unknown error.'}\n </Alert>\n )}\n {alertsRequest?.error && !alertsRequest?.loading && (\n <Alert severity=\"error\" title=\"Error loading Alertmanager alerts\">\n {alertsRequest.error?.message || 'Unknown error.'}\n </Alert>\n )}\n {loading && <LoadingPlaceholder text=\"loading silences...\" />}\n {result && !error && (\n <Switch>\n <Route exact path=\"/alerting/silences\">\n <SilencesTable\n silences={result}\n alertManagerAlerts={alertsRequest?.result ?? []}\n alertManagerSourceName={alertManagerSourceName}\n />\n </Route>\n <Route exact path=\"/alerting/silence/new\">\n <SilencesEditor alertManagerSourceName={alertManagerSourceName} />\n </Route>\n <Route exact path=\"/alerting/silence/:id/edit\">\n {({ match }: RouteChildrenProps<{ id: string }>) => {\n return (\n match?.params.id && (\n <SilencesEditor\n silence={getSilenceById(match.params.id)}\n alertManagerSourceName={alertManagerSourceName}\n />\n )\n );\n }}\n </Route>\n </Switch>\n )}\n </AlertingPageWrapper>\n );\n};\n\nexport default withErrorBoundary(Silences, { style: 'page' });\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 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 React, { FC } from 'react';\n\nimport { IconName, Tooltip, LinkButton, Button } from '@grafana/ui';\nimport { PopoverContent, TooltipPlacement } from '@grafana/ui/src/components/Tooltip';\n\ninterface Props {\n tooltip: PopoverContent;\n icon: IconName;\n className?: string;\n tooltipPlacement?: TooltipPlacement;\n to?: string;\n target?: string;\n onClick?: () => void;\n 'data-testid'?: string;\n}\n\nexport const ActionIcon: FC<Props> = ({\n tooltip,\n icon,\n to,\n target,\n onClick,\n className,\n tooltipPlacement = 'top',\n ...rest\n}) => {\n const ariaLabel = typeof tooltip === 'string' ? tooltip : undefined;\n\n return (\n <Tooltip content={tooltip} placement={tooltipPlacement}>\n {to ? (\n <LinkButton\n variant=\"secondary\"\n fill=\"text\"\n icon={icon}\n href={to}\n size=\"sm\"\n target={target}\n {...rest}\n aria-label={ariaLabel}\n />\n ) : (\n <Button\n className={className}\n variant=\"secondary\"\n fill=\"text\"\n size=\"sm\"\n icon={icon}\n type=\"button\"\n onClick={onClick}\n {...rest}\n aria-label={ariaLabel}\n />\n )}\n </Tooltip>\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 { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { TagList, useStyles2 } from '@grafana/ui';\nimport { Matcher } from 'app/plugins/datasource/alertmanager/types';\n\nimport { matcherToOperator } from '../../utils/alertmanager';\n\ntype MatchersProps = { matchers: Matcher[] };\n\nexport const Matchers: FC<MatchersProps> = ({ matchers }) => {\n const styles = useStyles2(getStyles);\n return (\n <div>\n <TagList\n className={styles.tags}\n tags={matchers.map((matcher) => `${matcher.name}${matcherToOperator(matcher)}${matcher.value}`)}\n />\n </div>\n );\n};\n\nconst getStyles = () => ({\n tags: css`\n justify-content: flex-start;\n `,\n});\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","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<Record<string, CacheValue>>({});\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<string, CombinedRuleNamespace> = {};\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 { useCallback, useMemo } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { locationService } from '@grafana/runtime';\n\nexport function useURLSearchParams(): [\n URLSearchParams,\n (searchValues: Record<string, string | string[] | undefined>, replace?: boolean) => void\n] {\n const { search } = useLocation();\n const queryParams = useMemo(() => new URLSearchParams(search), [search]);\n\n const update = useCallback((searchValues: Record<string, string | string[] | undefined>, replace?: boolean) => {\n locationService.partial(searchValues, replace);\n }, []);\n\n return [queryParams, update];\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport const getAlertTableStyles = (theme: GrafanaTheme2) => ({\n table: css`\n width: 100%;\n border-radius: ${theme.shape.borderRadius()};\n border: solid 1px ${theme.colors.border.weak};\n background-color: ${theme.colors.background.secondary};\n\n th {\n padding: ${theme.spacing(1)};\n }\n\n td {\n padding: 0 ${theme.spacing(1)};\n }\n\n tr {\n height: 38px;\n }\n `,\n evenRow: css`\n background-color: ${theme.colors.background.primary};\n `,\n colExpand: css`\n width: 36px;\n `,\n actionsCell: css`\n text-align: right;\n width: 1%;\n white-space: nowrap;\n\n & > * + * {\n margin-left: ${theme.spacing(0.5)};\n }\n `,\n});\n"],"names":["useCleanup","stateSelector","dispatch","useDispatch","selectorRef","useRef","current","useEffect","cleanUpAction","MatchedSilencedRules","matchedAlertRules","setMatchedAlertRules","useState","formApi","useFormContext","watch","matchers","styles","useStyles2","getStyles","columns","id","label","renderCell","data","matchedInstance","AlertStateTag","state","size","AlertLabels","labels","activeAt","startsWith","dateTime","format","fetchAllPromAndRulerRulesAction","combinedNamespaces","useCombinedRuleNamespaces","useDebounce","matchedInstances","flatMap","namespace","groups","group","rules","map","combinedRule","promRule","filter","rule","isAlertingRule","findAlertInstancesWithMatchers","alerts","className","title","length","Badge","badge","color","text","table","every","matcher","value","name","DynamicTable","items","slice","isExpandable","cols","moreMatches","theme","css","breakpoints","values","lg","spacing","wrapper","row","colors","background","secondary","removeButton","matcherOptions","sm","control","register","formState","errors","fields","append","remove","useFieldArray","cx","Field","required","index","invalid","error","message","Input","defaultValue","placeholder","InputControl","render","field","onChange","Select","menuShouldPortal","options","matcherFieldOptions","operator","IconButton","tooltip","onClick","Button","type","icon","variant","newMatcher","MatcherOperator","SilencePeriod","getValues","useStyles","onChangeStartsAt","startsAt","fieldState","startsAtInvalid","useController","validate","endsAt","onChangeEndsAt","endsAtInvalid","onChangeTimeZone","timeZone","from","to","timeRange","TimeRangeInput","raw","newValue","hideTimeZone","hideQuickRanges","getDefaultFormValues","searchParams","silence","now","Date","interval","parse","start","end","addDurationToDate","hours","toISOString","comment","createdBy","duration","intervalToAbbreviatedDurationString","isRegex","matcherToMatcherField","matcherName","matcherValue","DefaultTimeZone","config","defaults","get","getAll","formMatchers","parseQueryParamMatchers","defaultsFromQuery","textArea","flexRow","silencePeriod","alertManagerSourceName","urlSearchParams","useURLSearchParams","defaultValues","useMemo","formAPI","useForm","loading","useUnifiedAlertingSelector","updateSilence","unifiedAlerting","handleSubmit","setValue","clearErrors","prevDuration","setPrevDuration","isValidDate","parseDuration","startValue","valueOf","nextDuration","onSubmit","matchersFields","matcherFieldToMatcher","payload","pickBy","createOrUpdateSilenceAction","exitOnSave","successMessage","FieldSet","Object","keys","undefined","TextArea","rows","disabled","LinkButton","href","makeAMLink","fill","ActionButton","restProps","getStyle","typography","NoSilencesSplash","permissions","getInstancesPermissions","contextSrv","create","EmptyListCTA","buttonIcon","buttonLink","buttonTitle","CallToActionCard","callToActionElement","SilencedAlertsTableRow","alert","isCollapsed","setIsCollapsed","alertName","entries","reduce","labelKey","labelValue","CollapseToggle","onToggle","collapsed","AmAlertStateTag","status","colSpan","tableMargin","colState","colName","silencedAlerts","tableStyles","getAlertTableStyles","colExpand","evenRow","fingerprint","SilenceDetails","dateDisplayFormat","startsAtDate","dateMath","endsAtDate","container","primary","silenceStateToState","SilenceState","SilenceStateTag","StateTag","stateOptions","key","getQueryStringKey","uniqueId","SilencesFilter","queryStringKey","setQueryStringKey","queryParams","setQueryParams","useQueryParams","queryString","silenceState","getSilenceFiltersFromUrlParams","handleQueryStringChange","debounce","e","target","inputInvalid","parseMatchers","rowChild","Label","Stack","gap","Tooltip","content","Icon","searchInput","prefix","RadioButtonGroup","setTimeout","border","strong","fieldLabel","useFilteredSilences","silences","silenceIdsString","silenceIds","split","includes","some","isEqual","topButtonContainer","addNewSilence","callout","info","calloutIcon","editButton","alertManagerAlerts","filteredSilences","showExpiredSilencesBanner","handleExpireSilenceClick","expireSilenceAction","Matchers","update","push","Link","ActionIcon","A","useColumns","silencedBy","Authorize","actions","fallback","renderExpandedContent","withErrorBoundary","alertManagers","useAlertManagersByPermission","setAlertManagerSourceName","useAlertManagerSourceName","alertsRequests","amAlerts","alertsRequest","initialAsyncRequestState","isRoot","useLocation","pathname","endsWith","fetchAll","fetchSilencesAction","fetchAmAlertsAction","setInterval","SILENCES_POLL_INTERVAL_MS","clearInterval","result","getSilenceById","useCallback","find","AlertingPageWrapper","pageId","AlertManagerPicker","dataSources","Alert","severity","LoadingPlaceholder","exact","path","match","params","NoAlertManagerWarning","availableAlertManagers","style","children","isLoading","navModel","getNavModel","useSelector","navIndex","action","NoAlertManagersAvailable","OtherAlertManagersAvailable","_","hasOtherAMs","tooltipPlacement","rest","ariaLabel","placement","alertStateToState","AlertState","TagList","tags","matcherToOperator","updateQueryParams","isAlertManagerAvailable","alertManagerName","am","useIsAlertManagerAvailable","GRAFANA_RULES_SOURCE_NAME","store","ALERTMANAGER_NAME_LOCAL_STORAGE_KEY","ALERTMANAGER_NAME_QUERY_KEY","querySource","storeSource","accessType","getAlertManagerDataSourcesByPermission","rulesSourceName","promRulesResponses","promRules","rulerRulesResponses","rulerRules","cache","rulesSources","rulesSource","getRulesSourceByName","Error","getAllRulesSources","isCloudRulesSource","cached","namespaces","forEach","namespaceName","combinedGroup","source_tenants","isAlertingRulerRule","query","expr","annotations","rulerRule","isRecordingRulerRule","record","grafana_alert","rulerRuleToCombinedRule","addRulerGroupsToCombinedNamespace","g","existingRule","isGrafanaRulesSource","isCombinedRuleEqualToPromRule","getExistingRuleInGroup","promRuleToCombinedRule","addPromGroupsToCombinedNamespace","flat","flattenGrafanaManagedRules","newNamespace","sort","a","b","localeCompare","checkQuery","JSON","stringify","hashQuery","replace","join","search","URLSearchParams","searchValues","locationService","shape","borderRadius","weak","actionsCell"],"sourceRoot":""}