diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/VirtualizedTraceView.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/VirtualizedTraceView.tsx index 1d04158084b..7c45e88f548 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/VirtualizedTraceView.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/VirtualizedTraceView.tsx @@ -211,9 +211,23 @@ function generateRowStatesFromTrace( : []; } +function childSpansMap(trace: Trace | TNil) { + const childSpansMap = new Map(); + if (!trace) { + return childSpansMap; + } + trace.spans.forEach((span) => { + if (span.childSpanIds.length) { + childSpansMap.set(span.spanID, span.childSpanIds); + } + }); + return childSpansMap; +} + const memoizedGenerateRowStates = memoizeOne(generateRowStatesFromTrace); const memoizedViewBoundsFunc = memoizeOne(createViewedBoundsFunc, isEqual); const memoizedGetClipping = memoizeOne(getClipping, isEqual); +const memoizedChildSpansMap = memoizeOne(childSpansMap); // export from tests export class UnthemedVirtualizedTraceView extends React.Component { @@ -290,6 +304,10 @@ export class UnthemedVirtualizedTraceView extends React.Component { currentChildSpanIds.forEach((eachId) => { - const currentChildSpan = trace.spans.find((a) => a.spanID === eachId)!; - if (currentChildSpan.hasChildren) { - allChildSpanIds.push(...currentChildSpan.childSpanIds); - findAllDescendants(currentChildSpan.childSpanIds); + const childrenOfCurrent = this.getChildSpansMap().get(eachId); + if (childrenOfCurrent?.length) { + allChildSpanIds.push(...childrenOfCurrent); + findAllDescendants(childrenOfCurrent); } }); };