"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AlertsPage = AlertsPage; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _react = _interopRequireWildcard(require("react")); var _eui = require("@elastic/eui"); var _i18n = require("@kbn/i18n"); var _public = require("@kbn/triggers-actions-ui-plugin/public"); var _ruleDataUtils = require("@kbn/rule-data-utils"); var _public2 = require("@kbn/observability-shared-plugin/public"); var _alertsUiShared = require("@kbn/alerts-ui-shared"); var _kibana_react = require("../../utils/kibana_react"); var _use_has_data = require("../../hooks/use_has_data"); var _use_plugin_context = require("../../hooks/use_plugin_context"); var _use_time_buckets = require("../../hooks/use_time_buckets"); var _use_toast = require("../../hooks/use_toast"); var _loading_observability = require("../../components/loading_observability"); var _rule_stats = require("./components/rule_stats"); var _alert_search_bar = require("../../components/alert_search_bar/alert_search_bar"); var _containers = require("../../components/alert_search_bar/containers"); var _calculate_bucket_size = require("../overview/helpers/calculate_bucket_size"); var _alert_summary_widget = require("../../utils/alert_summary_widget"); var _constants = require("../../../common/constants"); var _header_menu = require("../overview/components/header_menu/header_menu"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ const ALERTS_SEARCH_BAR_ID = 'alerts-search-bar-o11y'; const ALERTS_PER_PAGE = 50; const ALERTS_TABLE_ID = 'xpack.observability.alerts.alert.table'; const DEFAULT_INTERVAL = '60s'; const DEFAULT_DATE_FORMAT = 'YYYY-MM-DD HH:mm'; function InternalAlertsPage() { const kibanaServices = (0, _kibana_react.useKibana)().services; const { charts, data: { query: { timefilter: { timefilter: timeFilterService } } }, http, notifications: { toasts }, triggersActionsUi: { alertsTableConfigurationRegistry, getAlertsSearchBar: AlertsSearchBar, getAlertsStateTable: AlertsStateTable, getAlertSummaryWidget: AlertSummaryWidget } } = kibanaServices; const { ObservabilityPageTemplate, observabilityRuleTypeRegistry } = (0, _use_plugin_context.usePluginContext)(); const alertSearchBarStateProps = (0, _containers.useAlertSearchBarStateContainer)(_constants.ALERTS_URL_STORAGE_KEY, { replace: false }); const onBrushEnd = brushEvent => { const { x } = brushEvent; if (x) { const [start, end] = x; alertSearchBarStateProps.onRangeFromChange(new Date(start).toISOString()); alertSearchBarStateProps.onRangeToChange(new Date(end).toISOString()); } }; const chartProps = { theme: charts.theme.useChartsTheme(), baseTheme: charts.theme.useChartsBaseTheme(), onBrushEnd }; const [ruleStatsLoading, setRuleStatsLoading] = (0, _react.useState)(false); const [ruleStats, setRuleStats] = (0, _react.useState)({ total: 0, disabled: 0, muted: 0, error: 0, snoozed: 0 }); const { hasAnyData, isAllRequestsComplete } = (0, _use_has_data.useHasData)(); const [esQuery, setEsQuery] = (0, _react.useState)(); const timeBuckets = (0, _use_time_buckets.useTimeBuckets)(); const bucketSize = (0, _react.useMemo)(() => (0, _calculate_bucket_size.calculateTimeRangeBucketSize)({ from: alertSearchBarStateProps.rangeFrom, to: alertSearchBarStateProps.rangeTo }, timeBuckets), [alertSearchBarStateProps.rangeFrom, alertSearchBarStateProps.rangeTo, timeBuckets]); const alertSummaryTimeRange = (0, _react.useMemo)(() => (0, _alert_summary_widget.getAlertSummaryTimeRange)({ from: alertSearchBarStateProps.rangeFrom, to: alertSearchBarStateProps.rangeTo }, (bucketSize === null || bucketSize === void 0 ? void 0 : bucketSize.intervalString) || DEFAULT_INTERVAL, (bucketSize === null || bucketSize === void 0 ? void 0 : bucketSize.dateFormat) || DEFAULT_DATE_FORMAT), // eslint-disable-next-line react-hooks/exhaustive-deps [alertSearchBarStateProps.rangeFrom, alertSearchBarStateProps.rangeTo, bucketSize, esQuery]); (0, _public2.useBreadcrumbs)([{ text: _i18n.i18n.translate('xpack.observability.breadcrumbs.alertsLinkText', { defaultMessage: 'Alerts' }) }]); async function loadRuleStats() { setRuleStatsLoading(true); try { const response = await (0, _public.loadRuleAggregations)({ http, typesFilter: observabilityRuleTypeRegistry.list() }); const { ruleExecutionStatus, ruleMutedStatus, ruleEnabledStatus, ruleSnoozedStatus } = response; if (ruleExecutionStatus && ruleMutedStatus && ruleEnabledStatus && ruleSnoozedStatus) { const total = Object.values(ruleExecutionStatus).reduce((acc, value) => acc + value, 0); const { disabled } = ruleEnabledStatus; const { muted } = ruleMutedStatus; const { error } = ruleExecutionStatus; const { snoozed } = ruleSnoozedStatus; setRuleStats({ ...ruleStats, total, disabled, muted, error, snoozed }); } setRuleStatsLoading(false); } catch (_e) { toasts.addDanger({ title: _i18n.i18n.translate('xpack.observability.alerts.ruleStats.loadError', { defaultMessage: 'Unable to load rule stats' }) }); setRuleStatsLoading(false); } } (0, _react.useEffect)(() => { loadRuleStats(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const manageRulesHref = http.basePath.prepend('/app/observability/alerts/rules'); if (!hasAnyData && !isAllRequestsComplete) { return /*#__PURE__*/_react.default.createElement(_loading_observability.LoadingObservability, null); } return /*#__PURE__*/_react.default.createElement(_containers.Provider, { value: _containers.alertSearchBarStateContainer }, /*#__PURE__*/_react.default.createElement(ObservabilityPageTemplate, { "data-test-subj": "alertsPageWithData", pageHeader: { pageTitle: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, _i18n.i18n.translate('xpack.observability.alertsTitle', { defaultMessage: 'Alerts' }), " "), rightSideItems: (0, _rule_stats.renderRuleStats)(ruleStats, manageRulesHref, ruleStatsLoading) } }, /*#__PURE__*/_react.default.createElement(_header_menu.HeaderMenu, null), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexGroup, { direction: "column", gutterSize: "m" }, /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, null, /*#__PURE__*/_react.default.createElement(_alertsUiShared.MaintenanceWindowCallout, { kibanaServices: kibanaServices })), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, null, /*#__PURE__*/_react.default.createElement(_alert_search_bar.ObservabilityAlertSearchBar, (0, _extends2.default)({}, alertSearchBarStateProps, { appName: ALERTS_SEARCH_BAR_ID, onEsQueryChange: setEsQuery, services: { timeFilterService, AlertsSearchBar, useToasts: _use_toast.useToasts } }))), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, null, /*#__PURE__*/_react.default.createElement(AlertSummaryWidget, { featureIds: _constants.observabilityAlertFeatureIds, filter: esQuery, fullSize: true, timeRange: alertSummaryTimeRange, chartProps: chartProps })), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, null, esQuery && /*#__PURE__*/_react.default.createElement(AlertsStateTable, { alertsTableConfigurationRegistry: alertsTableConfigurationRegistry, configurationId: _ruleDataUtils.AlertConsumers.OBSERVABILITY, id: ALERTS_TABLE_ID, flyoutSize: "s", featureIds: _constants.observabilityAlertFeatureIds, query: esQuery, showExpandToDetails: false, showAlertStatusWithFlapping: true, pageSize: ALERTS_PER_PAGE }))))); } function AlertsPage() { return /*#__PURE__*/_react.default.createElement(_containers.Provider, { value: _containers.alertSearchBarStateContainer }, /*#__PURE__*/_react.default.createElement(InternalAlertsPage, null)); }