1 |
- {"version":3,"file":"AlertSilences.5c41dd28003455689d75.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 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","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":""}
|