2025-03-05 15:23:23 +05:30
|
|
|
import './Summary.styles.scss';
|
|
|
|
|
|
2025-02-05 18:27:12 +05:30
|
|
|
import * as Sentry from '@sentry/react';
|
2025-03-05 15:23:23 +05:30
|
|
|
import { usePageSize } from 'container/InfraMonitoringK8s/utils';
|
|
|
|
|
import { useGetMetricsList } from 'hooks/metricsExplorer/useGetMetricsList';
|
|
|
|
|
import { useGetMetricsTreeMap } from 'hooks/metricsExplorer/useGetMetricsTreeMap';
|
2025-03-21 00:28:15 +05:30
|
|
|
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
2025-03-05 15:23:23 +05:30
|
|
|
import { useQueryOperations } from 'hooks/queryBuilder/useQueryBuilderOperations';
|
2025-02-05 18:27:12 +05:30
|
|
|
import ErrorBoundaryFallback from 'pages/ErrorBoundaryFallback/ErrorBoundaryFallback';
|
2025-03-18 16:27:14 +05:30
|
|
|
import { useCallback, useMemo, useState } from 'react';
|
2025-03-05 15:23:23 +05:30
|
|
|
import { useSelector } from 'react-redux';
|
|
|
|
|
import { AppState } from 'store/reducers';
|
|
|
|
|
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
|
|
|
|
|
import { GlobalReducer } from 'types/reducer/globalTime';
|
|
|
|
|
|
2025-04-01 17:17:38 +05:30
|
|
|
import InspectModal from '../Inspect';
|
2025-03-11 12:02:08 +05:30
|
|
|
import MetricDetails from '../MetricDetails';
|
2025-03-05 15:23:23 +05:30
|
|
|
import MetricsSearch from './MetricsSearch';
|
|
|
|
|
import MetricsTable from './MetricsTable';
|
|
|
|
|
import MetricsTreemap from './MetricsTreemap';
|
|
|
|
|
import { OrderByPayload, TreemapViewType } from './types';
|
|
|
|
|
import {
|
|
|
|
|
convertNanoToMilliseconds,
|
|
|
|
|
formatDataForMetricsTable,
|
|
|
|
|
getMetricsListQuery,
|
|
|
|
|
} from './utils';
|
2025-02-05 18:27:12 +05:30
|
|
|
|
|
|
|
|
function Summary(): JSX.Element {
|
2025-03-05 15:23:23 +05:30
|
|
|
const { pageSize, setPageSize } = usePageSize('metricsExplorer');
|
|
|
|
|
const [currentPage, setCurrentPage] = useState(1);
|
|
|
|
|
const [orderBy, setOrderBy] = useState<OrderByPayload>({
|
2025-03-18 16:27:14 +05:30
|
|
|
columnName: 'samples',
|
|
|
|
|
order: 'desc',
|
2025-03-05 15:23:23 +05:30
|
|
|
});
|
|
|
|
|
const [heatmapView, setHeatmapView] = useState<TreemapViewType>(
|
2025-03-18 16:27:14 +05:30
|
|
|
TreemapViewType.TIMESERIES,
|
2025-03-05 15:23:23 +05:30
|
|
|
);
|
2025-03-11 12:02:08 +05:30
|
|
|
const [isMetricDetailsOpen, setIsMetricDetailsOpen] = useState(false);
|
2025-04-01 17:17:38 +05:30
|
|
|
const [isInspectModalOpen, setIsInspectModalOpen] = useState(false);
|
2025-03-11 12:02:08 +05:30
|
|
|
const [selectedMetricName, setSelectedMetricName] = useState<string | null>(
|
|
|
|
|
null,
|
|
|
|
|
);
|
2025-03-05 15:23:23 +05:30
|
|
|
|
|
|
|
|
const { maxTime, minTime } = useSelector<AppState, GlobalReducer>(
|
|
|
|
|
(state) => state.globalTime,
|
|
|
|
|
);
|
|
|
|
|
|
2025-03-21 00:28:15 +05:30
|
|
|
const { currentQuery } = useQueryBuilder();
|
2025-03-05 15:23:23 +05:30
|
|
|
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,
|
2025-03-19 17:31:36 +05:30
|
|
|
isError: isMetricsError,
|
2025-03-05 15:23:23 +05:30
|
|
|
} = useGetMetricsList(metricsListQuery, {
|
|
|
|
|
enabled: !!metricsListQuery,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
data: treeMapData,
|
|
|
|
|
isLoading: isTreeMapLoading,
|
|
|
|
|
isFetching: isTreeMapFetching,
|
2025-03-19 17:31:36 +05:30
|
|
|
isError: isTreeMapError,
|
2025-03-05 15:23:23 +05:30
|
|
|
} = useGetMetricsTreeMap(metricsTreemapQuery, {
|
|
|
|
|
enabled: !!metricsTreemapQuery,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
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],
|
|
|
|
|
);
|
|
|
|
|
|
2025-03-11 12:02:08 +05:30
|
|
|
const openMetricDetails = (metricName: string): void => {
|
|
|
|
|
setSelectedMetricName(metricName);
|
|
|
|
|
setIsMetricDetailsOpen(true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const closeMetricDetails = (): void => {
|
|
|
|
|
setSelectedMetricName(null);
|
|
|
|
|
setIsMetricDetailsOpen(false);
|
|
|
|
|
};
|
|
|
|
|
|
2025-04-01 17:17:38 +05:30
|
|
|
const openInspectModal = (metricName: string): void => {
|
|
|
|
|
setSelectedMetricName(metricName);
|
|
|
|
|
setIsInspectModalOpen(true);
|
|
|
|
|
setIsMetricDetailsOpen(false);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const closeInspectModal = (): void => {
|
|
|
|
|
setIsInspectModalOpen(false);
|
|
|
|
|
setSelectedMetricName(null);
|
|
|
|
|
};
|
|
|
|
|
|
2025-02-05 18:27:12 +05:30
|
|
|
return (
|
|
|
|
|
<Sentry.ErrorBoundary fallback={<ErrorBoundaryFallback />}>
|
2025-03-05 15:23:23 +05:30
|
|
|
<div className="metrics-explorer-summary-tab">
|
|
|
|
|
<MetricsSearch
|
|
|
|
|
query={searchQuery}
|
|
|
|
|
onChange={handleFilterChange}
|
|
|
|
|
heatmapView={heatmapView}
|
|
|
|
|
setHeatmapView={setHeatmapView}
|
|
|
|
|
/>
|
|
|
|
|
<MetricsTreemap
|
|
|
|
|
data={treeMapData?.payload}
|
|
|
|
|
isLoading={isTreeMapLoading || isTreeMapFetching}
|
2025-03-19 17:31:36 +05:30
|
|
|
isError={isTreeMapError}
|
2025-03-05 15:23:23 +05:30
|
|
|
viewType={heatmapView}
|
2025-03-11 12:02:08 +05:30
|
|
|
openMetricDetails={openMetricDetails}
|
2025-03-05 15:23:23 +05:30
|
|
|
/>
|
|
|
|
|
<MetricsTable
|
|
|
|
|
isLoading={isMetricsLoading || isMetricsFetching}
|
2025-03-19 17:31:36 +05:30
|
|
|
isError={isMetricsError}
|
2025-03-05 15:23:23 +05:30
|
|
|
data={formattedMetricsData}
|
|
|
|
|
pageSize={pageSize}
|
|
|
|
|
currentPage={currentPage}
|
|
|
|
|
onPaginationChange={onPaginationChange}
|
|
|
|
|
setOrderBy={setOrderBy}
|
2025-03-11 12:02:08 +05:30
|
|
|
totalCount={metricsData?.payload?.data?.total || 0}
|
|
|
|
|
openMetricDetails={openMetricDetails}
|
2025-03-05 15:23:23 +05:30
|
|
|
/>
|
|
|
|
|
</div>
|
2025-03-11 12:02:08 +05:30
|
|
|
{isMetricDetailsOpen && (
|
|
|
|
|
<MetricDetails
|
|
|
|
|
isOpen={isMetricDetailsOpen}
|
|
|
|
|
onClose={closeMetricDetails}
|
|
|
|
|
metricName={selectedMetricName}
|
|
|
|
|
isModalTimeSelection={false}
|
2025-04-01 17:17:38 +05:30
|
|
|
openInspectModal={openInspectModal}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
{isInspectModalOpen && (
|
|
|
|
|
<InspectModal
|
|
|
|
|
isOpen={isInspectModalOpen}
|
|
|
|
|
onClose={closeInspectModal}
|
|
|
|
|
metricName={selectedMetricName}
|
2025-03-11 12:02:08 +05:30
|
|
|
/>
|
|
|
|
|
)}
|
2025-02-05 18:27:12 +05:30
|
|
|
</Sentry.ErrorBoundary>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default Summary;
|