import React, { useEffect, useMemo, useState } from 'react'; import { Col, Divider, Row, Typography, Space, Button } from 'antd'; import { FilterOutlined } from '@ant-design/icons'; import GanttChart from 'container/GantChart'; import { getNodeById } from 'container/GantChart/utils'; import Timeline from 'container/Timeline'; import TraceFlameGraph from 'container/TraceFlameGraph'; import dayjs from 'dayjs'; import { spanServiceNameToColorMapping } from 'lib/getRandomColor'; import { getSortedData } from './utils'; import { ITraceTree, PayloadProps } from 'types/api/trace/getTraceItem'; import { getSpanTreeMetadata } from 'utils/getSpanTreeMetadata'; import { spanToTreeUtil } from 'utils/spanToTree'; import SelectedSpanDetails from './SelectedSpanDetails'; import useUrlQuery from 'hooks/useUrlQuery'; import styles from './TraceGraph.module.css'; import history from 'lib/history'; import { SPAN_DETAILS_LEFT_COL_WIDTH } from 'pages/TraceDetail/constants'; import { INTERVAL_UNITS } from './utils'; const TraceDetail = ({ response }: TraceDetailProps): JSX.Element => { const spanServiceColors = useMemo( () => spanServiceNameToColorMapping(response[0].events), [response], ); const urlQuery = useUrlQuery(); const [spanId, _setSpanId] = useState(urlQuery.get('spanId')); const [intervalUnit, setIntervalUnit] = useState(INTERVAL_UNITS[0]); const [searchSpanString, setSearchSpanString] = useState(''); const [activeHoverId, setActiveHoverId] = useState(''); const [activeSelectedId, setActiveSelectedId] = useState(spanId || ''); const [treeData, setTreeData] = useState( spanToTreeUtil(response[0].events), ); const { treeData: tree, ...traceMetaData } = useMemo(() => { return getSpanTreeMetadata(getSortedData(treeData), spanServiceColors); }, [treeData]); const [globalTraceMetadata, _setGlobalTraceMetadata] = useState({ ...traceMetaData, }); useEffect(() => { if (activeSelectedId) { history.replace({ pathname: history.location.pathname, search: `?spanId=${activeSelectedId}`, }); } }, [activeSelectedId]); const getSelectedNode = useMemo(() => { return getNodeById(activeSelectedId, treeData); }, [activeSelectedId, treeData]); const onSearchHandler = (value: string) => { setSearchSpanString(value); setTreeData(spanToTreeUtil(response[0].events)); }; const onFocusSelectedSpanHandler = () => { const treeNode = getNodeById(activeSelectedId, tree); if (treeNode) { setTreeData(treeNode); } }; const onResetHandler = () => { setTreeData(spanToTreeUtil(response[0].events)); }; return ( Trace Details {traceMetaData.totalSpans} Span {dayjs(traceMetaData.globalStart / 1e6).format('hh:mm:ssa MM/DD')} {/* */}
); }; interface TraceDetailProps { response: PayloadProps; } export default TraceDetail;