Skip to content

Commit 19bdf46

Browse files
committed
Fix logical mode
1 parent 4dba16b commit 19bdf46

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

src/bin/SpanTree.tsx

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,47 @@ const sortSpans = (spans: Span[], mode: string): Span[] => {
1515
if (mode === "logical") {
1616
const spanMap = new Map<string, Span>();
1717

18-
// Convert objects to Span instances
18+
// Step 1: Convert raw objects into Span instances
1919
spans.forEach(span => {
20-
const newSpan = Object.assign(new Span(span.name, span.parentSpanId), span);
21-
newSpan.children = [];
22-
spanMap.set(span.spanId, newSpan);
20+
if (!spanMap.has(span.spanId)) {
21+
const newSpan = Object.assign(new Span(span.name, span.parentSpanId), span);
22+
newSpan.children = [];
23+
spanMap.set(span.spanId, newSpan);
24+
}
2325
});
2426

2527
const rootSpans: Span[] = [];
28+
29+
// Step 2: Link children correctly and prevent duplicates
2630
spans.forEach(span => {
2731
if (span.parentSpanId && spanMap.has(span.parentSpanId)) {
28-
spanMap.get(span.parentSpanId)!.children.push(spanMap.get(span.spanId)!);
29-
} else {
30-
rootSpans.push(spanMap.get(span.spanId)!);
32+
const parent = spanMap.get(span.parentSpanId);
33+
const child = spanMap.get(span.spanId);
34+
if (parent && child && !parent.children.includes(child)) {
35+
parent.children.push(child); // ✅ Only push unique children
36+
}
37+
}
38+
});
39+
40+
// Step 3: Collect only true root spans
41+
spans.forEach(span => {
42+
if (!span.parentSpanId) {
43+
const rootSpan = spanMap.get(span.spanId);
44+
if (rootSpan && !rootSpans.includes(rootSpan)) {
45+
rootSpans.push(rootSpan);
46+
}
3147
}
3248
});
3349

34-
return rootSpans;
50+
return rootSpans; // ✅ Only root spans are returned, no duplicates
3551
} else {
52+
// ✅ Sort spans by time for time-based mode
3653
return spans.sort((a, b) => a.startTime - b.startTime);
3754
}
3855
};
3956

57+
58+
4059
/**
4160
* **Recursive Renderer**
4261
* - Uses box-drawing characters (│ ├ └) for structured layout.

src/bin/cli.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,18 @@ import { Span } from '../lib/span.js';
66

77
const SPAN_FILE = 'spans.json';
88

9-
// Read CLI argument for sampling mode
10-
const sampleMode = process.argv.includes("--sample logical") ? "logical" : "time";
9+
10+
const sampleArgIndex = process.argv.indexOf("--sample");
11+
const sampleMode =
12+
sampleArgIndex !== -1 && process.argv.length > sampleArgIndex + 1
13+
? process.argv[sampleArgIndex + 1].trim() === "logical"
14+
? "logical"
15+
: "time"
16+
: "time";
17+
18+
console.log(`Received CLI arguments: ${process.argv.join(" ")}`);
19+
console.log(`Running in ${sampleMode} mode`);
20+
1121

1222
function loadSpans(): Span[] {
1323
if (!fs.existsSync(SPAN_FILE)) return [];
@@ -22,7 +32,6 @@ const App = () => {
2232
setSpans(loadSpans());
2333
}, 1000);
2434

25-
// ✅ Handle process termination to clean up interval
2635
const handleExit = () => {
2736
console.log("Stopping CLI...");
2837
clearInterval(id);

0 commit comments

Comments
 (0)