import React, { useEffect } from 'react'; import { useDispatch } from 'react-redux'; import { PanelProps } from '@grafana/data'; import { config } from '@grafana/runtime'; import { CustomScrollbar } from '@grafana/ui'; import { useUnifiedAlertingSelector } from 'app/features/alerting/unified/hooks/useUnifiedAlertingSelector'; import { fetchAlertGroupsAction } from 'app/features/alerting/unified/state/actions'; import { parseMatchers } from 'app/features/alerting/unified/utils/alertmanager'; import { NOTIFICATIONS_POLL_INTERVAL_MS } from 'app/features/alerting/unified/utils/constants'; import { initialAsyncRequestState } from 'app/features/alerting/unified/utils/redux'; import { AlertmanagerGroup, Matcher } from 'app/plugins/datasource/alertmanager/types'; import { AlertGroup } from './AlertGroup'; import { AlertGroupPanelOptions } from './types'; import { useFilteredGroups } from './useFilteredGroups'; export const AlertGroupsPanel = (props: PanelProps) => { const dispatch = useDispatch(); const isAlertingEnabled = config.unifiedAlertingEnabled; const expandAll = props.options.expandAll; const alertManagerSourceName = props.options.alertmanager; const alertGroups = useUnifiedAlertingSelector((state) => state.amAlertGroups) || initialAsyncRequestState; const results: AlertmanagerGroup[] = alertGroups[alertManagerSourceName || '']?.result || []; const matchers: Matcher[] = props.options.labels ? parseMatchers(props.options.labels) : []; const filteredResults = useFilteredGroups(results, matchers); useEffect(() => { function fetchNotifications() { if (alertManagerSourceName) { dispatch(fetchAlertGroupsAction(alertManagerSourceName)); } } fetchNotifications(); const interval = setInterval(fetchNotifications, NOTIFICATIONS_POLL_INTERVAL_MS); return () => { clearInterval(interval); }; }, [dispatch, alertManagerSourceName]); const hasResults = filteredResults.length > 0; return ( {isAlertingEnabled && (
{hasResults && filteredResults.map((group) => { return ( ); })} {!hasResults && 'No alerts'}
)}
); };