import './Summary.styles.scss'; import * as Sentry from '@sentry/react'; import { initialQueriesMap, PANEL_TYPES } from 'constants/queryBuilder'; import { usePageSize } from 'container/InfraMonitoringK8s/utils'; import { useGetMetricsList } from 'hooks/metricsExplorer/useGetMetricsList'; import { useGetMetricsTreeMap } from 'hooks/metricsExplorer/useGetMetricsTreeMap'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { useQueryOperations } from 'hooks/queryBuilder/useQueryBuilderOperations'; import { useShareBuilderUrl } from 'hooks/queryBuilder/useShareBuilderUrl'; import ErrorBoundaryFallback from 'pages/ErrorBoundaryFallback/ErrorBoundaryFallback'; import { useCallback, useMemo, useState } from 'react'; import { useSelector } from 'react-redux'; import { AppState } from 'store/reducers'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { DataSource } from 'types/common/queryBuilder'; import { GlobalReducer } from 'types/reducer/globalTime'; import InspectModal from '../Inspect'; import MetricDetails from '../MetricDetails'; import MetricsSearch from './MetricsSearch'; import MetricsTable from './MetricsTable'; import MetricsTreemap from './MetricsTreemap'; import { OrderByPayload, TreemapViewType } from './types'; import { convertNanoToMilliseconds, formatDataForMetricsTable, getMetricsListQuery, } from './utils'; const DEFAULT_ORDER_BY: OrderByPayload = { columnName: 'samples', order: 'desc', }; function Summary(): JSX.Element { const { pageSize, setPageSize } = usePageSize('metricsExplorer'); const [currentPage, setCurrentPage] = useState(1); const [orderBy, setOrderBy] = useState(DEFAULT_ORDER_BY); const [heatmapView, setHeatmapView] = useState( TreemapViewType.TIMESERIES, ); const [isMetricDetailsOpen, setIsMetricDetailsOpen] = useState(false); const [isInspectModalOpen, setIsInspectModalOpen] = useState(false); const [selectedMetricName, setSelectedMetricName] = useState( null, ); const { maxTime, minTime } = useSelector( (state) => state.globalTime, ); const { currentQuery, updateAllQueriesOperators } = useQueryBuilder(); const defaultQuery = useMemo(() => { const query = updateAllQueriesOperators( initialQueriesMap.metrics, PANEL_TYPES.LIST, DataSource.METRICS, ); return { ...query, builder: { ...query.builder, queryData: [ { ...query.builder.queryData[0], orderBy: [DEFAULT_ORDER_BY], }, ], }, }; }, [updateAllQueriesOperators]); useShareBuilderUrl(defaultQuery); const queryFilters = useMemo( () => currentQuery?.builder?.queryData[0]?.filters || { items: [], op: 'and', }, [currentQuery], ); const { handleChangeQueryData } = useQueryOperations({ index: 0, query: currentQuery.builder.queryData[0], entityVersion: '', }); const metricsListQuery = useMemo(() => { const baseQuery = getMetricsListQuery(); return { ...baseQuery, limit: pageSize, offset: (currentPage - 1) * pageSize, filters: queryFilters, start: convertNanoToMilliseconds(minTime), end: convertNanoToMilliseconds(maxTime), orderBy, }; }, [queryFilters, minTime, maxTime, orderBy, pageSize, currentPage]); const metricsTreemapQuery = useMemo( () => ({ limit: 100, filters: queryFilters, treemap: heatmapView, start: convertNanoToMilliseconds(minTime), end: convertNanoToMilliseconds(maxTime), }), [queryFilters, heatmapView, minTime, maxTime], ); const { data: metricsData, isLoading: isMetricsLoading, isFetching: isMetricsFetching, isError: isMetricsError, } = useGetMetricsList(metricsListQuery, { enabled: !!metricsListQuery && !isInspectModalOpen, }); const { data: treeMapData, isLoading: isTreeMapLoading, isFetching: isTreeMapFetching, isError: isTreeMapError, } = useGetMetricsTreeMap(metricsTreemapQuery, { enabled: !!metricsTreemapQuery && !isInspectModalOpen, }); const handleFilterChange = useCallback( (value: TagFilter) => { handleChangeQueryData('filters', value); setCurrentPage(1); }, [handleChangeQueryData], ); const updatedCurrentQuery = useMemo( () => ({ ...currentQuery, builder: { ...currentQuery.builder, queryData: [ { ...currentQuery.builder.queryData[0], aggregateOperator: 'noop', aggregateAttribute: { ...currentQuery.builder.queryData[0].aggregateAttribute, }, }, ], }, }), [currentQuery], ); const searchQuery = updatedCurrentQuery?.builder?.queryData[0] || null; const onPaginationChange = (page: number, pageSize: number): void => { setCurrentPage(page); setPageSize(pageSize); }; const formattedMetricsData = useMemo( () => formatDataForMetricsTable(metricsData?.payload?.data?.metrics || []), [metricsData], ); const openMetricDetails = (metricName: string): void => { setSelectedMetricName(metricName); setIsMetricDetailsOpen(true); }; const closeMetricDetails = (): void => { setSelectedMetricName(null); setIsMetricDetailsOpen(false); }; const openInspectModal = (metricName: string): void => { setSelectedMetricName(metricName); setIsInspectModalOpen(true); setIsMetricDetailsOpen(false); }; const closeInspectModal = (): void => { handleChangeQueryData('filters', { items: [], op: 'AND', }); setIsInspectModalOpen(false); setSelectedMetricName(null); }; return ( }>
{isMetricDetailsOpen && ( )} {isInspectModalOpen && ( )}
); } export default Summary;