diff --git a/packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/index.tsx b/packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/index.tsx index f423349d98b..729b645e095 100644 --- a/packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/index.tsx +++ b/packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/index.tsx @@ -29,20 +29,21 @@ import { SpanLinkFunc, TNil } from '../../types'; import { TraceKeyValuePair, TraceLink, TraceLog, TraceSpan, TraceSpanReference } from '../../types/trace'; import AccordianReferences from './AccordianReferences'; import { autoColor } from '../../Theme'; +import { uAlignIcon, ubM0, ubMb1, ubMy1, ubTxRightAlign } from '../../uberUtilityStyles'; import { Divider } from '../../common/Divider'; -import { - uAlignIcon, - ubFlex, - ubFlexAuto, - ubItemsCenter, - ubM0, - ubMb1, - ubMy1, - ubTxRightAlign, -} from '../../uberUtilityStyles'; const getStyles = (theme: GrafanaTheme2) => { return { + header: css` + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 0 1rem; + margin-bottom: 0.25rem; + `, + listWrapper: css` + overflow: hidden; + `, debugInfo: css` label: debugInfo; display: block; @@ -173,6 +174,15 @@ export default function SpanDetail(props: SpanDetailProps) { label: 'Start Time:', value: formatDuration(relativeStartTime), }, + ...(span.childSpanCount > 0 + ? [ + { + key: 'child_count', + label: 'Child Count:', + value: span.childSpanCount, + }, + ] + : []), ]; const styles = useStyles2(getStyles); const link = createSpanLink?.(span); @@ -180,9 +190,11 @@ export default function SpanDetail(props: SpanDetailProps) { return (
-
-

{operationName}

- +
+

{operationName}

+
+ +
{link ? ( diff --git a/packages/jaeger-ui-components/src/TraceTimelineViewer/utils.test.js b/packages/jaeger-ui-components/src/TraceTimelineViewer/utils.test.js index c74238fcb16..a8ad75f111f 100644 --- a/packages/jaeger-ui-components/src/TraceTimelineViewer/utils.test.js +++ b/packages/jaeger-ui-components/src/TraceTimelineViewer/utils.test.js @@ -20,6 +20,7 @@ import { isServerSpan, spanContainsErredSpan, spanHasTag, + formatNumber, } from './utils'; import traceGenerator from '../demo/trace-generators'; diff --git a/packages/jaeger-ui-components/src/common/LabeledList.tsx b/packages/jaeger-ui-components/src/common/LabeledList.tsx index 2adb283d0f7..c03cb9482d3 100644 --- a/packages/jaeger-ui-components/src/common/LabeledList.tsx +++ b/packages/jaeger-ui-components/src/common/LabeledList.tsx @@ -17,20 +17,31 @@ import { css } from '@emotion/css'; import cx from 'classnames'; import { useStyles2 } from '@grafana/ui'; import { GrafanaTheme2 } from '@grafana/data'; +import { autoColor } from '../Theme'; -import { Divider } from './Divider'; - -const getStyles = (theme: GrafanaTheme2) => { +const getStyles = (divider: boolean) => (theme: GrafanaTheme2) => { return { LabeledList: css` label: LabeledList; list-style: none; margin: 0; padding: 0; + ${divider === true && + ` + margin-right: -8px; + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + `} `, LabeledListItem: css` label: LabeledListItem; display: inline-block; + ${divider === true && + ` + border-right: 1px solid ${autoColor(theme, '#ddd')}; + padding: 0 8px; + `} `, LabeledListLabel: css` label: LabeledListLabel; @@ -42,27 +53,23 @@ const getStyles = (theme: GrafanaTheme2) => { type LabeledListProps = { className?: string; + divider?: boolean; items: Array<{ key: string; label: React.ReactNode; value: React.ReactNode }>; }; export default function LabeledList(props: LabeledListProps) { - const { className, items } = props; - const styles = useStyles2(getStyles); + const { className, divider = false, items } = props; + const styles = useStyles2(getStyles(divider)); + return (
    - {items.map(({ key, label, value }, i) => { - const divider = i < items.length - 1 && ( -
  • - -
  • - ); - return [ -
  • + {items.map(({ key, label, value }) => { + return ( +
  • {label} {value} -
  • , - divider, - ]; + + ); })}
); diff --git a/packages/jaeger-ui-components/src/model/transform-trace-data.tsx b/packages/jaeger-ui-components/src/model/transform-trace-data.tsx index 6652239bba1..1174a2e260b 100644 --- a/packages/jaeger-ui-components/src/model/transform-trace-data.tsx +++ b/packages/jaeger-ui-components/src/model/transform-trace-data.tsx @@ -138,6 +138,7 @@ export default function transformTraceData(data: TraceResponse | undefined): Tra span.relativeStartTime = span.startTime - traceStartTime; span.depth = depth - 1; span.hasChildren = node.children.length > 0; + span.childSpanCount = node.children.length; span.warnings = span.warnings || []; span.tags = span.tags || []; span.references = span.references || []; diff --git a/packages/jaeger-ui-components/src/types/trace.ts b/packages/jaeger-ui-components/src/types/trace.ts index 62e0a899827..4e180189a4d 100644 --- a/packages/jaeger-ui-components/src/types/trace.ts +++ b/packages/jaeger-ui-components/src/types/trace.ts @@ -68,6 +68,7 @@ export type TraceSpanData = { export type TraceSpan = TraceSpanData & { depth: number; hasChildren: boolean; + childSpanCount: number; process: TraceProcess; relativeStartTime: number; tags: NonNullable; diff --git a/packages/jaeger-ui-components/src/uberUtilityStyles.ts b/packages/jaeger-ui-components/src/uberUtilityStyles.ts index f2c7457f2d5..d95db6e9c8c 100644 --- a/packages/jaeger-ui-components/src/uberUtilityStyles.ts +++ b/packages/jaeger-ui-components/src/uberUtilityStyles.ts @@ -34,6 +34,10 @@ export const ubItemsCenter = css` align-items: center; `; +export const ubItemsStart = css` + align-items: start; +`; + export const ubFlexAuto = css` flex: 1 1 auto; min-width: 0; /* 1 */