import './SpanDetailsDrawer.styles.scss'; import { Button, Tabs, TabsProps, Tooltip, Typography } from 'antd'; import { RadioChangeEvent } from 'antd/lib'; import LogsIcon from 'assets/AlertHistory/LogsIcon'; import { getYAxisFormattedValue } from 'components/Graph/yAxisConfig'; import SignozRadioGroup from 'components/SignozRadioGroup/SignozRadioGroup'; import { themeColors } from 'constants/theme'; import { generateColor } from 'lib/uPlotLib/utils/generateColor'; import { Anvil, Bookmark, Link2, PanelRight, Search } from 'lucide-react'; import { Dispatch, SetStateAction, useCallback, useState } from 'react'; import { Span } from 'types/api/trace/getTraceV2'; import { formatEpochTimestamp } from 'utils/timeUtils'; import Attributes from './Attributes/Attributes'; import { RelatedSignalsViews } from './constants'; import Events from './Events/Events'; import LinkedSpans from './LinkedSpans/LinkedSpans'; import SpanRelatedSignals from './SpanRelatedSignals/SpanRelatedSignals'; interface ISpanDetailsDrawerProps { isSpanDetailsDocked: boolean; setIsSpanDetailsDocked: Dispatch>; selectedSpan: Span | undefined; traceStartTime: number; traceEndTime: number; } function SpanDetailsDrawer(props: ISpanDetailsDrawerProps): JSX.Element { const { isSpanDetailsDocked, setIsSpanDetailsDocked, selectedSpan, traceStartTime, traceEndTime, } = props; const [isSearchVisible, setIsSearchVisible] = useState(false); const [isRelatedSignalsOpen, setIsRelatedSignalsOpen] = useState( false, ); const [activeDrawerView, setActiveDrawerView] = useState( RelatedSignalsViews.LOGS, ); const color = generateColor( selectedSpan?.serviceName || '', themeColors.traceDetailColors, ); const handleRelatedSignalsChange = useCallback((e: RadioChangeEvent): void => { const selectedView = e.target.value as RelatedSignalsViews; setActiveDrawerView(selectedView); setIsRelatedSignalsOpen(true); }, []); const handleRelatedSignalsClose = useCallback((): void => { setIsRelatedSignalsOpen(false); }, []); function getItems(span: Span, startTime: number): TabsProps['items'] { return [ { label: ( ), key: 'attributes', children: , }, { label: ( ), key: 'events', children: ( ), }, { label: ( ), key: 'linked-spans', children: , }, ]; } return ( <>
{!isSpanDetailsDocked && (
Span Details
)} setIsSpanDetailsDocked((prev) => !prev)} />
{selectedSpan && !isSpanDetailsDocked && ( <>
span name
{selectedSpan.name}
span id
{selectedSpan.spanId}
start time
{formatEpochTimestamp(selectedSpan.timestamp)}
duration
{getYAxisFormattedValue(`${selectedSpan.durationNano}`, 'ns')}
service
{selectedSpan.serviceName}
span kind
{selectedSpan.spanKind}
status code string
{selectedSpan.statusCodeString}
{selectedSpan.statusMessage && (
status message
{selectedSpan.statusMessage}
)}
related signals
Logs
), value: RelatedSignalsViews.LOGS, }, ]} onChange={handleRelatedSignalsChange} className="related-signals-radio" />
setIsSearchVisible((prev) => !prev)} /> } />
)} {selectedSpan && ( )} ); } export default SpanDetailsDrawer;