import './entityTraces.styles.scss'; import logEvent from 'api/common/logEvent'; import { getListColumns } from 'components/HostMetricsDetail/HostMetricTraces/utils'; import { ResizeTable } from 'components/ResizeTable'; import { DEFAULT_ENTITY_VERSION } from 'constants/app'; import { InfraMonitoringEvents } from 'constants/events'; import { QueryParams } from 'constants/query'; import EmptyLogsSearch from 'container/EmptyLogsSearch/EmptyLogsSearch'; import NoLogs from 'container/NoLogs/NoLogs'; import QueryBuilderSearch from 'container/QueryBuilder/filters/QueryBuilderSearch'; import { ErrorText } from 'container/TimeSeriesView/styles'; import DateTimeSelectionV2 from 'container/TopNav/DateTimeSelectionV2'; import { CustomTimeType, Time, } from 'container/TopNav/DateTimeSelectionV2/config'; import TraceExplorerControls from 'container/TracesExplorer/Controls'; import { PER_PAGE_OPTIONS } from 'container/TracesExplorer/ListView/configs'; import { TracesLoading } from 'container/TracesExplorer/TraceLoading/TraceLoading'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { Pagination } from 'hooks/queryPagination'; import useUrlQueryData from 'hooks/useUrlQueryData'; import { GetMetricQueryRange } from 'lib/dashboard/getQueryResults'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useQuery } from 'react-query'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { DataSource } from 'types/common/queryBuilder'; import { filterOutPrimaryFilters, getEntityTracesQueryPayload, selectedEntityTracesColumns, } from '../utils'; interface Props { timeRange: { startTime: number; endTime: number; }; isModalTimeSelection: boolean; handleTimeChange: ( interval: Time | CustomTimeType, dateTimeRange?: [number, number], ) => void; handleChangeTracesFilters: (value: IBuilderQuery['filters']) => void; tracesFilters: IBuilderQuery['filters']; selectedInterval: Time; queryKey: string; category: string; queryKeyFilters: string[]; } function EntityTraces({ timeRange, isModalTimeSelection, handleTimeChange, handleChangeTracesFilters, tracesFilters, selectedInterval, queryKey, category, queryKeyFilters, }: Props): JSX.Element { const [traces, setTraces] = useState([]); const [offset] = useState(0); const { currentQuery } = useQueryBuilder(); const updatedCurrentQuery = useMemo( () => ({ ...currentQuery, builder: { ...currentQuery.builder, queryData: [ { ...currentQuery.builder.queryData[0], dataSource: DataSource.TRACES, aggregateOperator: 'noop', aggregateAttribute: { ...currentQuery.builder.queryData[0].aggregateAttribute, }, filters: { items: filterOutPrimaryFilters(tracesFilters.items, queryKeyFilters), op: 'AND', }, }, ], }, }), [currentQuery, queryKeyFilters, tracesFilters.items], ); const query = updatedCurrentQuery?.builder?.queryData[0] || null; const { queryData: paginationQueryData } = useUrlQueryData( QueryParams.pagination, ); const queryPayload = useMemo( () => getEntityTracesQueryPayload( timeRange.startTime, timeRange.endTime, paginationQueryData?.offset || offset, tracesFilters, ), [ timeRange.startTime, timeRange.endTime, offset, tracesFilters, paginationQueryData, ], ); const { data, isLoading, isFetching, isError } = useQuery({ queryKey: [ queryKey, timeRange.startTime, timeRange.endTime, offset, tracesFilters, DEFAULT_ENTITY_VERSION, paginationQueryData, ], queryFn: () => GetMetricQueryRange(queryPayload, DEFAULT_ENTITY_VERSION), enabled: !!queryPayload, }); const traceListColumns = getListColumns(selectedEntityTracesColumns); useEffect(() => { if (data?.payload?.data?.newResult?.data?.result) { const currentData = data.payload.data.newResult.data.result; if (currentData.length > 0 && currentData[0].list) { if (offset === 0) { setTraces(currentData[0].list ?? []); } else { setTraces((prev) => [...prev, ...(currentData[0].list ?? [])]); } } } }, [data, offset]); const isDataEmpty = !isLoading && !isFetching && !isError && traces.length === 0; const hasAdditionalFilters = tracesFilters.items.length > 1; const totalCount = data?.payload?.data?.newResult?.data?.result?.[0]?.list?.length || 0; const handleRowClick = useCallback(() => { logEvent(InfraMonitoringEvents.ItemClicked, { entity: InfraMonitoringEvents.K8sEntity, category, view: InfraMonitoringEvents.TracesView, }); }, [category]); return (
{query && ( )}
{isError && {data?.error || 'Something went wrong'}} {isLoading && traces.length === 0 && } {isDataEmpty && !hasAdditionalFilters && ( )} {isDataEmpty && hasAdditionalFilters && ( )} {!isError && traces.length > 0 && (
=> ({ onClick: (): void => handleRowClick(), })} />
)}
); } export default EntityTraces;