123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- 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<AlertGroupPanelOptions>) => {
- 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 (
- <CustomScrollbar autoHeightMax="100%" autoHeightMin="100%">
- {isAlertingEnabled && (
- <div>
- {hasResults &&
- filteredResults.map((group) => {
- return (
- <AlertGroup
- alertManagerSourceName={alertManagerSourceName}
- key={JSON.stringify(group.labels)}
- group={group}
- expandAll={expandAll}
- />
- );
- })}
- {!hasResults && 'No alerts'}
- </div>
- )}
- </CustomScrollbar>
- );
- };
|