import { css } from '@emotion/css'; import React from 'react'; import { dateTime, GrafanaTheme2 } from '@grafana/data'; import { Alert, Badge, LoadingPlaceholder, useStyles2 } from '@grafana/ui'; import { AlertmanagerAlert, Matcher } from 'app/plugins/datasource/alertmanager/types'; import { alertmanagerApi } from '../../api/alertmanagerApi'; import { isNullDate } from '../../utils/time'; import { AlertLabels } from '../AlertLabels'; import { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable'; import { AmAlertStateTag } from './AmAlertStateTag'; interface Props { amSourceName: string; matchers: Matcher[]; } export const SilencedInstancesPreview = ({ amSourceName, matchers }: Props) => { const { useGetAlertmanagerAlertsQuery } = alertmanagerApi; const styles = useStyles2(getStyles); const columns = useColumns(); // By default the form contains an empty matcher - with empty name and value and = operator // We don't want to fetch previews for empty matchers as it results in all alerts returned const hasValidMatchers = matchers.some((matcher) => matcher.value && matcher.name); const { currentData: alerts = [], isFetching, isError, } = useGetAlertmanagerAlertsQuery( { amSourceName, filter: { matchers } }, { skip: !hasValidMatchers, refetchOnMountOrArgChange: true } ); const tableItemAlerts = alerts.map>((alert) => ({ id: alert.fingerprint, data: alert, })); return (

Affected alert instances {tableItemAlerts.length > 0 ? ( ) : null}

{!hasValidMatchers && Add a valid matcher to see affected alerts} {isError && ( Error occured when generating affected alerts preview. Are you matchers valid? )} {isFetching && } {!isFetching && !isError && hasValidMatchers && (
{tableItemAlerts.length > 0 ? ( ) : ( No matching alert instances found )}
)}
); }; function useColumns(): Array> { const styles = useStyles2(getStyles); return [ { id: 'state', label: 'State', renderCell: function renderStateTag({ data }) { return ; }, size: '120px', className: styles.stateColumn, }, { id: 'labels', label: 'Labels', renderCell: function renderName({ data }) { return ; }, size: 'auto', }, { id: 'created', label: 'Created', renderCell: function renderSummary({ data }) { return <>{isNullDate(data.startsAt) ? '-' : dateTime(data.startsAt).format('YYYY-MM-DD HH:mm:ss')}; }, size: '180px', }, ]; } const getStyles = (theme: GrafanaTheme2) => ({ table: css` max-width: ${theme.breakpoints.values.lg}px; `, moreMatches: css` margin-top: ${theme.spacing(1)}; `, title: css` display: flex; align-items: center; `, badge: css` margin-left: ${theme.spacing(1)}; `, stateColumn: css` display: flex; align-items: center; `, alertLabels: css` justify-content: flex-start; `, });