AlertingAdmin.d65d1ef6fffd70fb824f.js.map 37 KB

1
  1. {"version":3,"file":"AlertingAdmin.d65d1ef6fffd70fb824f.js","mappings":"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","sources":["webpack://grafana/./public/app/features/alerting/unified/components/admin/AlertmanagerConfig.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useExternalAmSelector.ts","webpack://grafana/./public/app/features/alerting/unified/components/admin/AddAlertManagerModal.tsx","webpack://grafana/./public/app/features/alerting/unified/components/admin/ExternalAlertmanagers.tsx","webpack://grafana/./public/app/features/alerting/unified/Admin.tsx","webpack://grafana/./public/app/features/alerting/unified/components/AlertingPageWrapper.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useAlertManagerSourceName.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useAlertManagerSources.ts"],"sourcesContent":["import { css } from '@emotion/css';\nimport React, { useEffect, useState, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Alert, Button, ConfirmModal, TextArea, HorizontalGroup, Field, Form, useStyles2 } from '@grafana/ui';\n\nimport { useAlertManagerSourceName } from '../../hooks/useAlertManagerSourceName';\nimport { useAlertManagersByPermission } from '../../hooks/useAlertManagerSources';\nimport { useUnifiedAlertingSelector } from '../../hooks/useUnifiedAlertingSelector';\nimport {\n deleteAlertManagerConfigAction,\n fetchAlertManagerConfigAction,\n updateAlertManagerConfigAction,\n} from '../../state/actions';\nimport { GRAFANA_RULES_SOURCE_NAME, isVanillaPrometheusAlertManagerDataSource } from '../../utils/datasource';\nimport { initialAsyncRequestState } from '../../utils/redux';\nimport { AlertManagerPicker } from '../AlertManagerPicker';\n\ninterface FormValues {\n configJSON: string;\n}\n\nexport default function AlertmanagerConfig(): JSX.Element {\n const dispatch = useDispatch();\n const alertManagers = useAlertManagersByPermission('notification');\n const [alertManagerSourceName, setAlertManagerSourceName] = useAlertManagerSourceName(alertManagers);\n\n const [showConfirmDeleteAMConfig, setShowConfirmDeleteAMConfig] = useState(false);\n const { loading: isDeleting } = useUnifiedAlertingSelector((state) => state.deleteAMConfig);\n const { loading: isSaving } = useUnifiedAlertingSelector((state) => state.saveAMConfig);\n const readOnly = alertManagerSourceName ? isVanillaPrometheusAlertManagerDataSource(alertManagerSourceName) : false;\n const styles = useStyles2(getStyles);\n\n const configRequests = useUnifiedAlertingSelector((state) => state.amConfigs);\n\n const {\n result: config,\n loading: isLoadingConfig,\n error: loadingError,\n } = (alertManagerSourceName && configRequests[alertManagerSourceName]) || initialAsyncRequestState;\n\n useEffect(() => {\n if (alertManagerSourceName) {\n dispatch(fetchAlertManagerConfigAction(alertManagerSourceName));\n }\n }, [alertManagerSourceName, dispatch]);\n\n const resetConfig = () => {\n if (alertManagerSourceName) {\n dispatch(deleteAlertManagerConfigAction(alertManagerSourceName));\n }\n setShowConfirmDeleteAMConfig(false);\n };\n\n const defaultValues = useMemo(\n (): FormValues => ({\n configJSON: config ? JSON.stringify(config, null, 2) : '',\n }),\n [config]\n );\n\n const loading = isDeleting || isLoadingConfig || isSaving;\n\n const onSubmit = (values: FormValues) => {\n if (alertManagerSourceName && config) {\n dispatch(\n updateAlertManagerConfigAction({\n newConfig: JSON.parse(values.configJSON),\n oldConfig: config,\n alertManagerSourceName,\n successMessage: 'Alertmanager configuration updated.',\n refetch: true,\n })\n );\n }\n };\n\n return (\n <div className={styles.container}>\n <AlertManagerPicker\n current={alertManagerSourceName}\n onChange={setAlertManagerSourceName}\n dataSources={alertManagers}\n />\n {loadingError && !loading && (\n <Alert severity=\"error\" title=\"Error loading Alertmanager configuration\">\n {loadingError.message || 'Unknown error.'}\n </Alert>\n )}\n {isDeleting && alertManagerSourceName !== GRAFANA_RULES_SOURCE_NAME && (\n <Alert severity=\"info\" title=\"Resetting Alertmanager configuration\">\n It might take a while...\n </Alert>\n )}\n {alertManagerSourceName && config && (\n <Form defaultValues={defaultValues} onSubmit={onSubmit} key={defaultValues.configJSON}>\n {({ register, errors }) => (\n <>\n {!readOnly && (\n <Field\n disabled={loading}\n label=\"Configuration\"\n invalid={!!errors.configJSON}\n error={errors.configJSON?.message}\n >\n <TextArea\n {...register('configJSON', {\n required: { value: true, message: 'Required.' },\n validate: (v) => {\n try {\n JSON.parse(v);\n return true;\n } catch (e) {\n return e.message;\n }\n },\n })}\n id=\"configuration\"\n rows={25}\n />\n </Field>\n )}\n {readOnly && (\n <Field label=\"Configuration\">\n <pre data-testid=\"readonly-config\">{defaultValues.configJSON}</pre>\n </Field>\n )}\n {!readOnly && (\n <HorizontalGroup>\n <Button type=\"submit\" variant=\"primary\" disabled={loading}>\n Save\n </Button>\n <Button\n type=\"button\"\n disabled={loading}\n variant=\"destructive\"\n onClick={() => setShowConfirmDeleteAMConfig(true)}\n >\n Reset configuration\n </Button>\n </HorizontalGroup>\n )}\n {!!showConfirmDeleteAMConfig && (\n <ConfirmModal\n isOpen={true}\n title=\"Reset Alertmanager configuration\"\n body={`Are you sure you want to reset configuration ${\n alertManagerSourceName === GRAFANA_RULES_SOURCE_NAME\n ? 'for the Grafana Alertmanager'\n : `for \"${alertManagerSourceName}\"`\n }? Contact points and notification policies will be reset to their defaults.`}\n confirmText=\"Yes, reset configuration\"\n onConfirm={resetConfig}\n onDismiss={() => setShowConfirmDeleteAMConfig(false)}\n />\n )}\n </>\n )}\n </Form>\n )}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css`\n margin-bottom: ${theme.spacing(4)};\n `,\n});\n","import { useSelector } from 'react-redux';\n\nimport { StoreState } from '../../../../types';\n\nconst SUFFIX_REGEX = /\\/api\\/v[1|2]\\/alerts/i;\ntype AlertmanagerConfig = { url: string; status: string; actualUrl: string };\n\nexport function useExternalAmSelector(): AlertmanagerConfig[] | [] {\n const discoveredAlertmanagers = useSelector(\n (state: StoreState) => state.unifiedAlerting.externalAlertmanagers.discoveredAlertmanagers.result?.data\n );\n const alertmanagerConfig = useSelector(\n (state: StoreState) => state.unifiedAlerting.externalAlertmanagers.alertmanagerConfig.result?.alertmanagers\n );\n\n if (!discoveredAlertmanagers || !alertmanagerConfig) {\n return [];\n }\n\n const enabledAlertmanagers: AlertmanagerConfig[] = [];\n const droppedAlertmanagers: AlertmanagerConfig[] = discoveredAlertmanagers.droppedAlertManagers.map((am) => ({\n url: am.url.replace(SUFFIX_REGEX, ''),\n status: 'dropped',\n actualUrl: am.url,\n }));\n\n for (const url of alertmanagerConfig) {\n if (discoveredAlertmanagers.activeAlertManagers.length === 0) {\n enabledAlertmanagers.push({\n url: url,\n status: 'pending',\n actualUrl: '',\n });\n } else {\n const matchingActiveAM = discoveredAlertmanagers.activeAlertManagers.find(\n (am) => am.url === `${url}/api/v2/alerts`\n );\n matchingActiveAM\n ? enabledAlertmanagers.push({\n url: matchingActiveAM.url.replace(SUFFIX_REGEX, ''),\n status: 'active',\n actualUrl: matchingActiveAM.url,\n })\n : enabledAlertmanagers.push({\n url: url,\n status: 'pending',\n actualUrl: '',\n });\n }\n }\n\n return [...enabledAlertmanagers, ...droppedAlertmanagers];\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, Field, FieldArray, Form, Icon, Input, Modal, useStyles2 } from '@grafana/ui';\nimport { AlertmanagerUrl } from 'app/plugins/datasource/alertmanager/types';\n\ninterface Props {\n onClose: () => void;\n alertmanagers: AlertmanagerUrl[];\n onChangeAlertmanagerConfig: (alertmanagers: string[]) => void;\n}\n\nexport const AddAlertManagerModal: FC<Props> = ({ alertmanagers, onChangeAlertmanagerConfig, onClose }) => {\n const styles = useStyles2(getStyles);\n const defaultValues: Record<string, AlertmanagerUrl[]> = useMemo(\n () => ({\n alertmanagers: alertmanagers,\n }),\n [alertmanagers]\n );\n\n const modalTitle = (\n <div className={styles.modalTitle}>\n <Icon name=\"bell\" className={styles.modalIcon} />\n <h3>Add Alertmanager</h3>\n </div>\n );\n\n const onSubmit = (values: Record<string, AlertmanagerUrl[]>) => {\n onChangeAlertmanagerConfig(values.alertmanagers.map((am) => cleanAlertmanagerUrl(am.url)));\n onClose();\n };\n\n return (\n <Modal title={modalTitle} isOpen={true} onDismiss={onClose} className={styles.modal}>\n <div className={styles.description}>\n We use a service discovery method to find existing Alertmanagers for a given URL.\n </div>\n <Form onSubmit={onSubmit} defaultValues={defaultValues}>\n {({ register, control, errors }) => (\n <div>\n <FieldArray control={control} name=\"alertmanagers\">\n {({ fields, append, remove }) => (\n <div className={styles.fieldArray}>\n <div className={styles.bold}>Source url</div>\n <div className={styles.muted}>\n Authentication can be done via URL (e.g. user:password@myalertmanager.com) and only the Alertmanager\n v2 API is supported. The suffix is added internally, there is no need to specify it.\n </div>\n {fields.map((field, index) => {\n return (\n <Field\n invalid={!!errors?.alertmanagers?.[index]}\n error=\"Field is required\"\n key={`${field.id}-${index}`}\n >\n <Input\n className={styles.input}\n defaultValue={field.url}\n {...register(`alertmanagers.${index}.url`, { required: true })}\n placeholder=\"http://localhost:9093\"\n addonAfter={\n <Button\n aria-label=\"Remove alertmanager\"\n type=\"button\"\n onClick={() => remove(index)}\n variant=\"destructive\"\n className={styles.destroyInputRow}\n >\n <Icon name=\"trash-alt\" />\n </Button>\n }\n />\n </Field>\n );\n })}\n <Button type=\"button\" variant=\"secondary\" onClick={() => append({ url: '' })}>\n Add URL\n </Button>\n </div>\n )}\n </FieldArray>\n <div>\n <Button type=\"submit\" onSubmit={() => onSubmit}>\n Add Alertmanagers\n </Button>\n </div>\n </div>\n )}\n </Form>\n </Modal>\n );\n};\n\nfunction cleanAlertmanagerUrl(url: string): string {\n return url.replace(/\\/$/, '').replace(/\\/api\\/v[1|2]\\/alerts/i, '');\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const muted = css`\n color: ${theme.colors.text.secondary};\n `;\n return {\n description: cx(\n css`\n margin-bottom: ${theme.spacing(2)};\n `,\n muted\n ),\n muted: muted,\n bold: css`\n font-weight: ${theme.typography.fontWeightBold};\n `,\n modal: css``,\n modalIcon: cx(\n muted,\n css`\n margin-right: ${theme.spacing(1)};\n `\n ),\n modalTitle: css`\n display: flex;\n `,\n input: css`\n margin-bottom: ${theme.spacing(1)};\n margin-right: ${theme.spacing(1)};\n `,\n inputRow: css`\n display: flex;\n `,\n destroyInputRow: css`\n padding: ${theme.spacing(1)};\n `,\n fieldArray: css`\n margin-bottom: ${theme.spacing(4)};\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport {\n Button,\n ConfirmModal,\n Field,\n HorizontalGroup,\n Icon,\n RadioButtonGroup,\n Tooltip,\n useStyles2,\n useTheme2,\n} from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { StoreState } from 'app/types/store';\n\nimport { useExternalAmSelector } from '../../hooks/useExternalAmSelector';\nimport {\n addExternalAlertmanagersAction,\n fetchExternalAlertmanagersAction,\n fetchExternalAlertmanagersConfigAction,\n} from '../../state/actions';\n\nimport { AddAlertManagerModal } from './AddAlertManagerModal';\n\nconst alertmanagerChoices = [\n { value: 'internal', label: 'Only Internal' },\n { value: 'external', label: 'Only External' },\n { value: 'all', label: 'Both internal and external' },\n];\n\nexport const ExternalAlertmanagers = () => {\n const styles = useStyles2(getStyles);\n const dispatch = useDispatch();\n const [modalState, setModalState] = useState({ open: false, payload: [{ url: '' }] });\n const [deleteModalState, setDeleteModalState] = useState({ open: false, index: 0 });\n\n const externalAlertManagers = useExternalAmSelector();\n const alertmanagersChoice = useSelector(\n (state: StoreState) => state.unifiedAlerting.externalAlertmanagers.alertmanagerConfig.result?.alertmanagersChoice\n );\n const theme = useTheme2();\n\n useEffect(() => {\n dispatch(fetchExternalAlertmanagersAction());\n dispatch(fetchExternalAlertmanagersConfigAction());\n const interval = setInterval(() => dispatch(fetchExternalAlertmanagersAction()), 5000);\n\n return () => {\n clearInterval(interval);\n };\n }, [dispatch]);\n\n const onDelete = useCallback(\n (index: number) => {\n // to delete we need to filter the alertmanager from the list and repost\n const newList = (externalAlertManagers ?? [])\n .filter((am, i) => i !== index)\n .map((am) => {\n return am.url;\n });\n dispatch(\n addExternalAlertmanagersAction({ alertmanagers: newList, alertmanagersChoice: alertmanagersChoice ?? 'all' })\n );\n setDeleteModalState({ open: false, index: 0 });\n },\n [externalAlertManagers, dispatch, alertmanagersChoice]\n );\n\n const onEdit = useCallback(() => {\n const ams = externalAlertManagers ? [...externalAlertManagers] : [{ url: '' }];\n setModalState((state) => ({\n ...state,\n open: true,\n payload: ams,\n }));\n }, [setModalState, externalAlertManagers]);\n\n const onOpenModal = useCallback(() => {\n setModalState((state) => {\n const ams = externalAlertManagers ? [...externalAlertManagers, { url: '' }] : [{ url: '' }];\n return {\n ...state,\n open: true,\n payload: ams,\n };\n });\n }, [externalAlertManagers]);\n\n const onCloseModal = useCallback(() => {\n setModalState((state) => ({\n ...state,\n open: false,\n }));\n }, [setModalState]);\n\n const onChangeAlertmanagerChoice = (alertmanagersChoice: string) => {\n dispatch(\n addExternalAlertmanagersAction({ alertmanagers: externalAlertManagers.map((am) => am.url), alertmanagersChoice })\n );\n };\n\n const onChangeAlertmanagers = (alertmanagers: string[]) => {\n dispatch(addExternalAlertmanagersAction({ alertmanagers, alertmanagersChoice: alertmanagersChoice ?? 'all' }));\n };\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case 'active':\n return theme.colors.success.main;\n\n case 'pending':\n return theme.colors.warning.main;\n\n default:\n return theme.colors.error.main;\n }\n };\n\n const noAlertmanagers = externalAlertManagers?.length === 0;\n\n return (\n <div>\n <h4>External Alertmanagers</h4>\n <div className={styles.muted}>\n You can have your Grafana managed alerts be delivered to one or many external Alertmanager(s) in addition to the\n internal Alertmanager by specifying their URLs below.\n </div>\n <div className={styles.actions}>\n {!noAlertmanagers && (\n <Button type=\"button\" onClick={onOpenModal}>\n Add Alertmanager\n </Button>\n )}\n </div>\n {noAlertmanagers ? (\n <EmptyListCTA\n title=\"You have not added any external alertmanagers\"\n onClick={onOpenModal}\n buttonTitle=\"Add Alertmanager\"\n buttonIcon=\"bell-slash\"\n />\n ) : (\n <>\n <table className={cx('filter-table form-inline filter-table--hover', styles.table)}>\n <thead>\n <tr>\n <th>Url</th>\n <th>Status</th>\n <th style={{ width: '2%' }}>Action</th>\n </tr>\n </thead>\n <tbody>\n {externalAlertManagers?.map((am, index) => {\n return (\n <tr key={index}>\n <td>\n <span className={styles.url}>{am.url}</span>\n {am.actualUrl ? (\n <Tooltip content={`Discovered ${am.actualUrl} from ${am.url}`} theme=\"info\">\n <Icon name=\"info-circle\" />\n </Tooltip>\n ) : null}\n </td>\n <td>\n <Icon name=\"heart\" style={{ color: getStatusColor(am.status) }} title={am.status} />\n </td>\n <td>\n <HorizontalGroup>\n <Button variant=\"secondary\" type=\"button\" onClick={onEdit} aria-label=\"Edit alertmanager\">\n <Icon name=\"pen\" />\n </Button>\n <Button\n variant=\"destructive\"\n aria-label=\"Remove alertmanager\"\n type=\"button\"\n onClick={() => setDeleteModalState({ open: true, index })}\n >\n <Icon name=\"trash-alt\" />\n </Button>\n </HorizontalGroup>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n <div>\n <Field\n label=\"Send alerts to\"\n description=\"Sets which Alertmanager will handle your alerts. Internal (Grafana built in Alertmanager), External (All Alertmanagers configured above), or both.\"\n >\n <RadioButtonGroup\n options={alertmanagerChoices}\n value={alertmanagersChoice}\n onChange={(value) => onChangeAlertmanagerChoice(value!)}\n />\n </Field>\n </div>\n </>\n )}\n <ConfirmModal\n isOpen={deleteModalState.open}\n title=\"Remove Alertmanager\"\n body=\"Are you sure you want to remove this Alertmanager\"\n confirmText=\"Remove\"\n onConfirm={() => onDelete(deleteModalState.index)}\n onDismiss={() => setDeleteModalState({ open: false, index: 0 })}\n />\n {modalState.open && (\n <AddAlertManagerModal\n onClose={onCloseModal}\n alertmanagers={modalState.payload}\n onChangeAlertmanagerConfig={onChangeAlertmanagers}\n />\n )}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n url: css`\n margin-right: ${theme.spacing(1)};\n `,\n muted: css`\n color: ${theme.colors.text.secondary};\n `,\n actions: css`\n margin-top: ${theme.spacing(2)};\n display: flex;\n justify-content: flex-end;\n `,\n table: css`\n margin-bottom: ${theme.spacing(2)};\n `,\n});\n","import React from 'react';\n\nimport { AlertingPageWrapper } from './components/AlertingPageWrapper';\nimport AlertmanagerConfig from './components/admin/AlertmanagerConfig';\nimport { ExternalAlertmanagers } from './components/admin/ExternalAlertmanagers';\n\nexport default function Admin(): JSX.Element {\n return (\n <AlertingPageWrapper pageId=\"alerting-admin\">\n <AlertmanagerConfig test-id=\"admin-alertmanagerconfig\" />\n <ExternalAlertmanagers test-id=\"admin-externalalertmanagers\" />\n </AlertingPageWrapper>\n );\n}\n","import React, { FC } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport Page from 'app/core/components/Page/Page';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { StoreState } from 'app/types/store';\n\ninterface Props {\n pageId: string;\n isLoading?: boolean;\n}\n\nexport const AlertingPageWrapper: FC<Props> = ({ children, pageId, isLoading }) => {\n const navModel = getNavModel(\n useSelector((state: StoreState) => state.navIndex),\n pageId\n );\n\n return (\n <Page navModel={navModel}>\n <Page.Contents isLoading={isLoading}>{children}</Page.Contents>\n </Page>\n );\n};\n","import { useCallback } from 'react';\n\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport store from 'app/core/store';\n\nimport { ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, ALERTMANAGER_NAME_QUERY_KEY } from '../utils/constants';\nimport { AlertManagerDataSource, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\nfunction useIsAlertManagerAvailable(availableAlertManagers: AlertManagerDataSource[]) {\n return useCallback(\n (alertManagerName: string) => {\n const availableAlertManagersNames = availableAlertManagers.map((am) => am.name);\n return availableAlertManagersNames.includes(alertManagerName);\n },\n [availableAlertManagers]\n );\n}\n\n/* This will return am name either from query params or from local storage or a default (grafana).\n * Due to RBAC permissions Grafana Managed Alert manager or external alert managers may not be available\n * In the worst case neihter GMA nor external alert manager is available\n */\nexport function useAlertManagerSourceName(\n availableAlertManagers: AlertManagerDataSource[]\n): [string | undefined, (alertManagerSourceName: string) => void] {\n const [queryParams, updateQueryParams] = useQueryParams();\n const isAlertManagerAvailable = useIsAlertManagerAvailable(availableAlertManagers);\n\n const update = useCallback(\n (alertManagerSourceName: string) => {\n if (!isAlertManagerAvailable(alertManagerSourceName)) {\n return;\n }\n if (alertManagerSourceName === GRAFANA_RULES_SOURCE_NAME) {\n store.delete(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);\n updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: null });\n } else {\n store.set(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, alertManagerSourceName);\n updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: alertManagerSourceName });\n }\n },\n [updateQueryParams, isAlertManagerAvailable]\n );\n\n const querySource = queryParams[ALERTMANAGER_NAME_QUERY_KEY];\n\n if (querySource && typeof querySource === 'string') {\n if (isAlertManagerAvailable(querySource)) {\n return [querySource, update];\n } else {\n // non existing alertmanager\n return [undefined, update];\n }\n }\n\n const storeSource = store.get(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);\n if (storeSource && typeof storeSource === 'string' && isAlertManagerAvailable(storeSource)) {\n update(storeSource);\n return [storeSource, update];\n }\n\n if (isAlertManagerAvailable(GRAFANA_RULES_SOURCE_NAME)) {\n return [GRAFANA_RULES_SOURCE_NAME, update];\n }\n\n return [undefined, update];\n}\n","import { useMemo } from 'react';\n\nimport { getAlertManagerDataSourcesByPermission } from '../utils/datasource';\n\nexport function useAlertManagersByPermission(accessType: 'instance' | 'notification') {\n return useMemo(() => getAlertManagerDataSourcesByPermission(accessType), [accessType]);\n}\n"],"names":["AlertmanagerConfig","dispatch","useDispatch","alertManagers","useAlertManagersByPermission","alertManagerSourceName","setAlertManagerSourceName","useAlertManagerSourceName","showConfirmDeleteAMConfig","setShowConfirmDeleteAMConfig","useState","loading","isDeleting","useUnifiedAlertingSelector","state","deleteAMConfig","isSaving","saveAMConfig","readOnly","isVanillaPrometheusAlertManagerDataSource","styles","useStyles2","getStyles","configRequests","amConfigs","result","config","isLoadingConfig","error","loadingError","initialAsyncRequestState","useEffect","fetchAlertManagerConfigAction","resetConfig","deleteAlertManagerConfigAction","defaultValues","useMemo","configJSON","JSON","stringify","className","container","AlertManagerPicker","current","onChange","dataSources","Alert","severity","title","message","GRAFANA_RULES_SOURCE_NAME","Form","onSubmit","values","updateAlertManagerConfigAction","newConfig","parse","oldConfig","successMessage","refetch","register","errors","Field","disabled","label","invalid","TextArea","required","value","validate","v","e","id","rows","HorizontalGroup","Button","type","variant","onClick","ConfirmModal","isOpen","body","confirmText","onConfirm","onDismiss","theme","css","spacing","SUFFIX_REGEX","AddAlertManagerModal","alertmanagers","onChangeAlertmanagerConfig","onClose","modalTitle","Icon","name","modalIcon","map","am","url","replace","Modal","modal","description","control","FieldArray","fields","append","remove","fieldArray","bold","muted","field","index","Input","input","defaultValue","placeholder","addonAfter","destroyInputRow","colors","text","secondary","cx","typography","fontWeightBold","inputRow","alertmanagerChoices","ExternalAlertmanagers","modalState","setModalState","open","payload","deleteModalState","setDeleteModalState","externalAlertManagers","discoveredAlertmanagers","useSelector","unifiedAlerting","externalAlertmanagers","data","alertmanagerConfig","enabledAlertmanagers","droppedAlertmanagers","droppedAlertManagers","status","actualUrl","activeAlertManagers","length","push","matchingActiveAM","find","useExternalAmSelector","alertmanagersChoice","useTheme2","fetchExternalAlertmanagersAction","fetchExternalAlertmanagersConfigAction","interval","setInterval","clearInterval","onDelete","useCallback","newList","filter","i","addExternalAlertmanagersAction","onEdit","ams","onOpenModal","onCloseModal","getStatusColor","success","main","warning","noAlertmanagers","actions","EmptyListCTA","buttonTitle","buttonIcon","table","style","width","Tooltip","content","color","RadioButtonGroup","options","onChangeAlertmanagerChoice","Admin","AlertingPageWrapper","pageId","children","isLoading","navModel","getNavModel","navIndex","availableAlertManagers","queryParams","updateQueryParams","useQueryParams","isAlertManagerAvailable","alertManagerName","includes","useIsAlertManagerAvailable","update","store","ALERTMANAGER_NAME_LOCAL_STORAGE_KEY","ALERTMANAGER_NAME_QUERY_KEY","querySource","undefined","storeSource","accessType","getAlertManagerDataSourcesByPermission"],"sourceRoot":""}