autotel-devtools 16.0.0 → 17.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +2 -3
- package/dist/cli.js +2 -3
- package/dist/{error-aggregator-BrgYNNoC.d.ts → error-aggregator-CGgWr2OH.d.cts} +2 -3
- package/dist/{error-aggregator-bZ-prq97.d.cts → error-aggregator-DufjI2IG.d.ts} +2 -3
- package/dist/{exporter-BLqTs00O.d.ts → exporter-BJwufQwg.d.ts} +10 -2
- package/dist/{exporter-BSIS3Qgy.d.cts → exporter-CEKKJTci.d.cts} +10 -2
- package/dist/genai/index.cjs +1 -2
- package/dist/genai/index.d.cts +1 -2
- package/dist/genai/index.d.ts +1 -2
- package/dist/genai/index.js +1 -2
- package/dist/{http-yIS667nX.js → http-BLmWVZP0.js} +12 -8
- package/dist/{http-BUHnkhrC.cjs → http-bOYC2_Z0.cjs} +12 -8
- package/dist/index.cjs +2 -3
- package/dist/index.d.cts +3 -4
- package/dist/index.d.ts +3 -4
- package/dist/index.js +2 -3
- package/dist/listen-DGzVi7DE.cjs +1 -2
- package/dist/listen-NVMbBWHw.js +1 -2
- package/dist/resource-utils-B4UVvfnH.js +1 -2
- package/dist/resource-utils-DjHJB6uc.cjs +1 -2
- package/dist/server/exporter.cjs +5 -4
- package/dist/server/exporter.d.cts +1 -1
- package/dist/server/exporter.d.ts +1 -1
- package/dist/server/exporter.js +6 -4
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.cts +3 -4
- package/dist/server/index.d.ts +3 -4
- package/dist/server/index.js +1 -1
- package/dist/server/log-exporter.cjs +1 -2
- package/dist/server/log-exporter.d.cts +1 -2
- package/dist/server/log-exporter.d.ts +1 -2
- package/dist/server/log-exporter.js +1 -2
- package/dist/server/remote-exporter.cjs +1 -2
- package/dist/server/remote-exporter.d.cts +1 -2
- package/dist/server/remote-exporter.d.ts +1 -2
- package/dist/server/remote-exporter.js +1 -2
- package/dist/trace-root-BMa667jK.cjs +36 -0
- package/dist/trace-root-EHnvuA7f.js +30 -0
- package/dist/widget.global.js +14 -13
- package/package.json +18 -18
- package/dist/cli.cjs.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/genai/index.cjs.map +0 -1
- package/dist/genai/index.js.map +0 -1
- package/dist/http-BUHnkhrC.cjs.map +0 -1
- package/dist/http-yIS667nX.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/listen-DGzVi7DE.cjs.map +0 -1
- package/dist/listen-NVMbBWHw.js.map +0 -1
- package/dist/resource-utils-B4UVvfnH.js.map +0 -1
- package/dist/resource-utils-DjHJB6uc.cjs.map +0 -1
- package/dist/server/exporter.cjs.map +0 -1
- package/dist/server/exporter.js.map +0 -1
- package/dist/server/log-exporter.cjs.map +0 -1
- package/dist/server/log-exporter.js.map +0 -1
- package/dist/server/remote-exporter.cjs.map +0 -1
- package/dist/server/remote-exporter.js.map +0 -1
package/dist/cli.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const require_http = require('./http-
|
|
2
|
+
const require_http = require('./http-bOYC2_Z0.cjs');
|
|
3
3
|
const require_listen = require('./listen-DGzVi7DE.cjs');
|
|
4
4
|
let node_http = require("node:http");
|
|
5
5
|
let node_fs = require("node:fs");
|
|
@@ -227,5 +227,4 @@ main().catch((error) => {
|
|
|
227
227
|
process.exit(1);
|
|
228
228
|
});
|
|
229
229
|
|
|
230
|
-
//#endregion
|
|
231
|
-
//# sourceMappingURL=cli.cjs.map
|
|
230
|
+
//#endregion
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { d as DevtoolsServer, i as probePortHolder, p as hostHeaderIsLoopback, t as attachDevtoolsRoutes } from "./http-
|
|
2
|
+
import { d as DevtoolsServer, i as probePortHolder, p as hostHeaderIsLoopback, t as attachDevtoolsRoutes } from "./http-BLmWVZP0.js";
|
|
3
3
|
import { t as listenLoopbackDualStack } from "./listen-NVMbBWHw.js";
|
|
4
4
|
import { createServer } from "node:http";
|
|
5
5
|
import { readFileSync } from "node:fs";
|
|
@@ -228,5 +228,4 @@ main().catch((error) => {
|
|
|
228
228
|
});
|
|
229
229
|
|
|
230
230
|
//#endregion
|
|
231
|
-
export { };
|
|
232
|
-
//# sourceMappingURL=cli.js.map
|
|
231
|
+
export { };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ErrorGroup, o as ErrorOccurrence, u as TraceData } from "./exporter-
|
|
1
|
+
import { a as ErrorGroup, o as ErrorOccurrence, u as TraceData } from "./exporter-CEKKJTci.cjs";
|
|
2
2
|
//#region src/server/error-aggregator.d.ts
|
|
3
3
|
interface ErrorAggregatorOptions {
|
|
4
4
|
/**
|
|
@@ -115,5 +115,4 @@ declare class ErrorAggregator {
|
|
|
115
115
|
clearOlderThan(maxAgeMs: number): number;
|
|
116
116
|
}
|
|
117
117
|
//#endregion
|
|
118
|
-
export { ErrorAggregator as t };
|
|
119
|
-
//# sourceMappingURL=error-aggregator-BrgYNNoC.d.ts.map
|
|
118
|
+
export { ErrorAggregator as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ErrorGroup, o as ErrorOccurrence, u as TraceData } from "./exporter-
|
|
1
|
+
import { a as ErrorGroup, o as ErrorOccurrence, u as TraceData } from "./exporter-BJwufQwg.js";
|
|
2
2
|
//#region src/server/error-aggregator.d.ts
|
|
3
3
|
interface ErrorAggregatorOptions {
|
|
4
4
|
/**
|
|
@@ -115,5 +115,4 @@ declare class ErrorAggregator {
|
|
|
115
115
|
clearOlderThan(maxAgeMs: number): number;
|
|
116
116
|
}
|
|
117
117
|
//#endregion
|
|
118
|
-
export { ErrorAggregator as t };
|
|
119
|
-
//# sourceMappingURL=error-aggregator-bZ-prq97.d.cts.map
|
|
118
|
+
export { ErrorAggregator as t };
|
|
@@ -42,6 +42,15 @@ interface TraceData {
|
|
|
42
42
|
duration: number;
|
|
43
43
|
status: 'OK' | 'ERROR' | 'UNSET';
|
|
44
44
|
service: string;
|
|
45
|
+
/**
|
|
46
|
+
* True when no span in this trace is a true root: every span received has a
|
|
47
|
+
* parent that did not arrive. The trace is a fragment, normally because
|
|
48
|
+
* sampling kept only part of it or because the rest is still in flight.
|
|
49
|
+
* `rootSpan` is then the earliest span whose parent is absent rather than the
|
|
50
|
+
* real root, and the duration covers only the part present. Recomputed as
|
|
51
|
+
* spans merge, so it clears once the real root arrives.
|
|
52
|
+
*/
|
|
53
|
+
partial?: boolean;
|
|
45
54
|
}
|
|
46
55
|
interface LogData {
|
|
47
56
|
id: string;
|
|
@@ -187,5 +196,4 @@ declare class DevtoolsSpanExporter implements SpanExporter {
|
|
|
187
196
|
private convertSpanKind;
|
|
188
197
|
}
|
|
189
198
|
//#endregion
|
|
190
|
-
export { ErrorGroup as a, MetricData as c, DevtoolsData as i, SpanData as l, DevtoolsServer as n, ErrorOccurrence as o, DevtoolsServerOptions as r, LogData as s, DevtoolsSpanExporter as t, TraceData as u };
|
|
191
|
-
//# sourceMappingURL=exporter-BLqTs00O.d.ts.map
|
|
199
|
+
export { ErrorGroup as a, MetricData as c, DevtoolsData as i, SpanData as l, DevtoolsServer as n, ErrorOccurrence as o, DevtoolsServerOptions as r, LogData as s, DevtoolsSpanExporter as t, TraceData as u };
|
|
@@ -42,6 +42,15 @@ interface TraceData {
|
|
|
42
42
|
duration: number;
|
|
43
43
|
status: 'OK' | 'ERROR' | 'UNSET';
|
|
44
44
|
service: string;
|
|
45
|
+
/**
|
|
46
|
+
* True when no span in this trace is a true root: every span received has a
|
|
47
|
+
* parent that did not arrive. The trace is a fragment, normally because
|
|
48
|
+
* sampling kept only part of it or because the rest is still in flight.
|
|
49
|
+
* `rootSpan` is then the earliest span whose parent is absent rather than the
|
|
50
|
+
* real root, and the duration covers only the part present. Recomputed as
|
|
51
|
+
* spans merge, so it clears once the real root arrives.
|
|
52
|
+
*/
|
|
53
|
+
partial?: boolean;
|
|
45
54
|
}
|
|
46
55
|
interface LogData {
|
|
47
56
|
id: string;
|
|
@@ -187,5 +196,4 @@ declare class DevtoolsSpanExporter implements SpanExporter {
|
|
|
187
196
|
private convertSpanKind;
|
|
188
197
|
}
|
|
189
198
|
//#endregion
|
|
190
|
-
export { ErrorGroup as a, MetricData as c, DevtoolsData as i, SpanData as l, DevtoolsServer as n, ErrorOccurrence as o, DevtoolsServerOptions as r, LogData as s, DevtoolsSpanExporter as t, TraceData as u };
|
|
191
|
-
//# sourceMappingURL=exporter-BSIS3Qgy.d.cts.map
|
|
199
|
+
export { ErrorGroup as a, MetricData as c, DevtoolsData as i, SpanData as l, DevtoolsServer as n, ErrorOccurrence as o, DevtoolsServerOptions as r, LogData as s, DevtoolsSpanExporter as t, TraceData as u };
|
package/dist/genai/index.cjs
CHANGED
|
@@ -874,5 +874,4 @@ exports.hydrateToolResults = hydrateToolResults;
|
|
|
874
874
|
exports.isGenAiSpan = isGenAiSpan;
|
|
875
875
|
exports.lookupPrice = lookupPrice;
|
|
876
876
|
exports.priceCall = priceCall;
|
|
877
|
-
exports.toGenAiSpan = toGenAiSpan;
|
|
878
|
-
//# sourceMappingURL=index.cjs.map
|
|
877
|
+
exports.toGenAiSpan = toGenAiSpan;
|
package/dist/genai/index.d.cts
CHANGED
|
@@ -243,5 +243,4 @@ interface PriceOutputs {
|
|
|
243
243
|
}
|
|
244
244
|
declare function priceCall(inputs: PriceInputs): PriceOutputs;
|
|
245
245
|
//#endregion
|
|
246
|
-
export { type GenAiCost, type GenAiGuard, type GenAiMessage, type GenAiMessagePart, type GenAiOperation, type GenAiRole, type GenAiSession, type GenAiSpan, type GenAiStreaming, type GenAiToolCall, type GenAiToolDef, type GenAiUsage, type GenAiWarning, buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
|
|
247
|
-
//# sourceMappingURL=index.d.cts.map
|
|
246
|
+
export { type GenAiCost, type GenAiGuard, type GenAiMessage, type GenAiMessagePart, type GenAiOperation, type GenAiRole, type GenAiSession, type GenAiSpan, type GenAiStreaming, type GenAiToolCall, type GenAiToolDef, type GenAiUsage, type GenAiWarning, buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
|
package/dist/genai/index.d.ts
CHANGED
|
@@ -243,5 +243,4 @@ interface PriceOutputs {
|
|
|
243
243
|
}
|
|
244
244
|
declare function priceCall(inputs: PriceInputs): PriceOutputs;
|
|
245
245
|
//#endregion
|
|
246
|
-
export { type GenAiCost, type GenAiGuard, type GenAiMessage, type GenAiMessagePart, type GenAiOperation, type GenAiRole, type GenAiSession, type GenAiSpan, type GenAiStreaming, type GenAiToolCall, type GenAiToolDef, type GenAiUsage, type GenAiWarning, buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
|
|
247
|
-
//# sourceMappingURL=index.d.ts.map
|
|
246
|
+
export { type GenAiCost, type GenAiGuard, type GenAiMessage, type GenAiMessagePart, type GenAiOperation, type GenAiRole, type GenAiSession, type GenAiSpan, type GenAiStreaming, type GenAiToolCall, type GenAiToolDef, type GenAiUsage, type GenAiWarning, buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
|
package/dist/genai/index.js
CHANGED
|
@@ -867,5 +867,4 @@ function hydrateToolResults(genAiSpan, index) {
|
|
|
867
867
|
}
|
|
868
868
|
|
|
869
869
|
//#endregion
|
|
870
|
-
export { buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
|
|
871
|
-
//# sourceMappingURL=index.js.map
|
|
870
|
+
export { buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t as pickRoot } from "./trace-root-EHnvuA7f.js";
|
|
1
2
|
import { t as getResourceName } from "./resource-utils-B4UVvfnH.js";
|
|
2
3
|
import { createServer } from "node:http";
|
|
3
4
|
import { WebSocket, WebSocketServer } from "ws";
|
|
@@ -426,10 +427,13 @@ var DevtoolsServer = class {
|
|
|
426
427
|
existing.endTime = Math.max(existing.endTime, trace.endTime);
|
|
427
428
|
existing.duration = existing.endTime - existing.startTime;
|
|
428
429
|
if (trace.status === "ERROR") existing.status = "ERROR";
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
430
|
+
existing.spans.sort((a, b) => a.startTime - b.startTime);
|
|
431
|
+
const { rootSpan, partial } = pickRoot(existing.spans);
|
|
432
|
+
existing.rootSpan = rootSpan;
|
|
433
|
+
if (partial) existing.partial = true;
|
|
434
|
+
else {
|
|
435
|
+
delete existing.partial;
|
|
436
|
+
const rootService = rootSpan.attributes?.["service.name"];
|
|
433
437
|
if (typeof rootService === "string" && rootService.length > 0) existing.service = rootService;
|
|
434
438
|
}
|
|
435
439
|
} else this.traces = appendWithLimit(this.traces, trace, this.limits.maxTraceCount);
|
|
@@ -635,7 +639,7 @@ function parseOtlpTraces(payload) {
|
|
|
635
639
|
const traces = [];
|
|
636
640
|
for (const [traceId, { spans, service }] of traceMap) {
|
|
637
641
|
const sorted = spans.sort((a, b) => a.startTime - b.startTime);
|
|
638
|
-
const rootSpan = sorted
|
|
642
|
+
const { rootSpan, partial } = pickRoot(sorted);
|
|
639
643
|
const startTime = Math.min(...sorted.map((s) => s.startTime));
|
|
640
644
|
const endTime = Math.max(...sorted.map((s) => s.endTime));
|
|
641
645
|
const hasError = sorted.some((s) => s.status.code === "ERROR");
|
|
@@ -648,7 +652,8 @@ function parseOtlpTraces(payload) {
|
|
|
648
652
|
endTime,
|
|
649
653
|
duration: endTime - startTime,
|
|
650
654
|
status: hasError ? "ERROR" : "OK",
|
|
651
|
-
service
|
|
655
|
+
service,
|
|
656
|
+
...partial ? { partial: true } : {}
|
|
652
657
|
});
|
|
653
658
|
}
|
|
654
659
|
return traces;
|
|
@@ -1281,5 +1286,4 @@ function createDevtoolsHttpServer(devtools, _options = {}) {
|
|
|
1281
1286
|
}
|
|
1282
1287
|
|
|
1283
1288
|
//#endregion
|
|
1284
|
-
export { appendWithLimit as _, decodeOtlpLogsRequest as a, ErrorAggregator as b, isProtobufContentType as c, DevtoolsServer as d, allowSensitiveRequest as f, appendManyWithLimit as g, originIsLoopback as h, probePortHolder as i, parseOtlpLogs as l, isLoopbackHostname as m, createDevtoolsHttpServer as n, decodeOtlpMetricsRequest as o, hostHeaderIsLoopback as p, DEVTOOLS_IDENTITY as r, decodeOtlpTraceRequest as s, attachDevtoolsRoutes as t, parseOtlpTraces as u, applyTelemetryLimits as v, resolveTelemetryLimits as y };
|
|
1285
|
-
//# sourceMappingURL=http-yIS667nX.js.map
|
|
1289
|
+
export { appendWithLimit as _, decodeOtlpLogsRequest as a, ErrorAggregator as b, isProtobufContentType as c, DevtoolsServer as d, allowSensitiveRequest as f, appendManyWithLimit as g, originIsLoopback as h, probePortHolder as i, parseOtlpLogs as l, isLoopbackHostname as m, createDevtoolsHttpServer as n, decodeOtlpMetricsRequest as o, hostHeaderIsLoopback as p, DEVTOOLS_IDENTITY as r, decodeOtlpTraceRequest as s, attachDevtoolsRoutes as t, parseOtlpTraces as u, applyTelemetryLimits as v, resolveTelemetryLimits as y };
|
|
@@ -25,6 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
25
25
|
}) : target, mod));
|
|
26
26
|
|
|
27
27
|
//#endregion
|
|
28
|
+
const require_trace_root = require('./trace-root-BMa667jK.cjs');
|
|
28
29
|
const require_resource_utils = require('./resource-utils-DjHJB6uc.cjs');
|
|
29
30
|
let node_http = require("node:http");
|
|
30
31
|
let ws = require("ws");
|
|
@@ -454,10 +455,13 @@ var DevtoolsServer = class {
|
|
|
454
455
|
existing.endTime = Math.max(existing.endTime, trace.endTime);
|
|
455
456
|
existing.duration = existing.endTime - existing.startTime;
|
|
456
457
|
if (trace.status === "ERROR") existing.status = "ERROR";
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
458
|
+
existing.spans.sort((a, b) => a.startTime - b.startTime);
|
|
459
|
+
const { rootSpan, partial } = require_trace_root.pickRoot(existing.spans);
|
|
460
|
+
existing.rootSpan = rootSpan;
|
|
461
|
+
if (partial) existing.partial = true;
|
|
462
|
+
else {
|
|
463
|
+
delete existing.partial;
|
|
464
|
+
const rootService = rootSpan.attributes?.["service.name"];
|
|
461
465
|
if (typeof rootService === "string" && rootService.length > 0) existing.service = rootService;
|
|
462
466
|
}
|
|
463
467
|
} else this.traces = appendWithLimit(this.traces, trace, this.limits.maxTraceCount);
|
|
@@ -663,7 +667,7 @@ function parseOtlpTraces(payload) {
|
|
|
663
667
|
const traces = [];
|
|
664
668
|
for (const [traceId, { spans, service }] of traceMap) {
|
|
665
669
|
const sorted = spans.sort((a, b) => a.startTime - b.startTime);
|
|
666
|
-
const rootSpan =
|
|
670
|
+
const { rootSpan, partial } = require_trace_root.pickRoot(sorted);
|
|
667
671
|
const startTime = Math.min(...sorted.map((s) => s.startTime));
|
|
668
672
|
const endTime = Math.max(...sorted.map((s) => s.endTime));
|
|
669
673
|
const hasError = sorted.some((s) => s.status.code === "ERROR");
|
|
@@ -676,7 +680,8 @@ function parseOtlpTraces(payload) {
|
|
|
676
680
|
endTime,
|
|
677
681
|
duration: endTime - startTime,
|
|
678
682
|
status: hasError ? "ERROR" : "OK",
|
|
679
|
-
service
|
|
683
|
+
service,
|
|
684
|
+
...partial ? { partial: true } : {}
|
|
680
685
|
});
|
|
681
686
|
}
|
|
682
687
|
return traces;
|
|
@@ -1428,5 +1433,4 @@ Object.defineProperty(exports, 'resolveTelemetryLimits', {
|
|
|
1428
1433
|
get: function () {
|
|
1429
1434
|
return resolveTelemetryLimits;
|
|
1430
1435
|
}
|
|
1431
|
-
});
|
|
1432
|
-
//# sourceMappingURL=http-BUHnkhrC.cjs.map
|
|
1436
|
+
});
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_http = require('./http-
|
|
2
|
+
const require_http = require('./http-bOYC2_Z0.cjs');
|
|
3
3
|
const require_listen = require('./listen-DGzVi7DE.cjs');
|
|
4
4
|
const require_server_exporter = require('./server/exporter.cjs');
|
|
5
5
|
const require_server_log_exporter = require('./server/log-exporter.cjs');
|
|
@@ -49,5 +49,4 @@ exports.DevtoolsRemoteExporter = require_server_remote_exporter.DevtoolsRemoteEx
|
|
|
49
49
|
exports.DevtoolsServer = require_http.DevtoolsServer;
|
|
50
50
|
exports.DevtoolsSpanExporter = require_server_exporter.DevtoolsSpanExporter;
|
|
51
51
|
exports.ErrorAggregator = require_http.ErrorAggregator;
|
|
52
|
-
exports.createDevtools = createDevtools;
|
|
53
|
-
//# sourceMappingURL=index.cjs.map
|
|
52
|
+
exports.createDevtools = createDevtools;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "./exporter-
|
|
1
|
+
import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "./exporter-CEKKJTci.cjs";
|
|
2
2
|
import { DevtoolsLogExporter } from "./server/log-exporter.cjs";
|
|
3
3
|
import { DevtoolsRemoteExporter } from "./server/remote-exporter.cjs";
|
|
4
|
-
import { t as ErrorAggregator } from "./error-aggregator-
|
|
4
|
+
import { t as ErrorAggregator } from "./error-aggregator-CGgWr2OH.cjs";
|
|
5
5
|
import { Server } from "node:http";
|
|
6
6
|
//#region src/index.d.ts
|
|
7
7
|
interface CreateDevtoolsOptions {
|
|
@@ -22,5 +22,4 @@ interface DevtoolsInstance {
|
|
|
22
22
|
}
|
|
23
23
|
declare function createDevtools(options?: CreateDevtoolsOptions): DevtoolsInstance;
|
|
24
24
|
//#endregion
|
|
25
|
-
export { CreateDevtoolsOptions, type DevtoolsData, DevtoolsInstance, DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type LogData, type MetricData, type SpanData, type TraceData, createDevtools };
|
|
26
|
-
//# sourceMappingURL=index.d.cts.map
|
|
25
|
+
export { CreateDevtoolsOptions, type DevtoolsData, DevtoolsInstance, DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type LogData, type MetricData, type SpanData, type TraceData, createDevtools };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "./exporter-
|
|
1
|
+
import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "./exporter-BJwufQwg.js";
|
|
2
2
|
import { DevtoolsLogExporter } from "./server/log-exporter.js";
|
|
3
3
|
import { DevtoolsRemoteExporter } from "./server/remote-exporter.js";
|
|
4
|
-
import { t as ErrorAggregator } from "./error-aggregator-
|
|
4
|
+
import { t as ErrorAggregator } from "./error-aggregator-DufjI2IG.js";
|
|
5
5
|
import { Server } from "node:http";
|
|
6
6
|
//#region src/index.d.ts
|
|
7
7
|
interface CreateDevtoolsOptions {
|
|
@@ -22,5 +22,4 @@ interface DevtoolsInstance {
|
|
|
22
22
|
}
|
|
23
23
|
declare function createDevtools(options?: CreateDevtoolsOptions): DevtoolsInstance;
|
|
24
24
|
//#endregion
|
|
25
|
-
export { CreateDevtoolsOptions, type DevtoolsData, DevtoolsInstance, DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type LogData, type MetricData, type SpanData, type TraceData, createDevtools };
|
|
26
|
-
//# sourceMappingURL=index.d.ts.map
|
|
25
|
+
export { CreateDevtoolsOptions, type DevtoolsData, DevtoolsInstance, DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type LogData, type MetricData, type SpanData, type TraceData, createDevtools };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as ErrorAggregator, d as DevtoolsServer, p as hostHeaderIsLoopback, t as attachDevtoolsRoutes } from "./http-
|
|
1
|
+
import { b as ErrorAggregator, d as DevtoolsServer, p as hostHeaderIsLoopback, t as attachDevtoolsRoutes } from "./http-BLmWVZP0.js";
|
|
2
2
|
import { t as listenLoopbackDualStack } from "./listen-NVMbBWHw.js";
|
|
3
3
|
import { DevtoolsSpanExporter } from "./server/exporter.js";
|
|
4
4
|
import { DevtoolsLogExporter } from "./server/log-exporter.js";
|
|
@@ -43,5 +43,4 @@ function createDevtools(options = {}) {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
//#endregion
|
|
46
|
-
export { DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, createDevtools };
|
|
47
|
-
//# sourceMappingURL=index.js.map
|
|
46
|
+
export { DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, createDevtools };
|
package/dist/listen-DGzVi7DE.cjs
CHANGED
package/dist/listen-NVMbBWHw.js
CHANGED
package/dist/server/exporter.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_trace_root = require('../trace-root-BMa667jK.cjs');
|
|
2
3
|
|
|
3
4
|
//#region src/server/exporter.ts
|
|
4
5
|
var DevtoolsSpanExporter = class {
|
|
@@ -45,8 +46,8 @@ var DevtoolsSpanExporter = class {
|
|
|
45
46
|
*/
|
|
46
47
|
convertToTraceData(traceId, spans) {
|
|
47
48
|
const spanData = spans.map((span) => this.convertSpan(span));
|
|
48
|
-
const rootSpan = spanData.find((s) => !s.parentSpanId) || spanData[0];
|
|
49
49
|
spanData.sort((a, b) => a.startTime - b.startTime);
|
|
50
|
+
const { rootSpan, partial } = require_trace_root.pickRoot(spanData);
|
|
50
51
|
const startTime = Math.min(...spanData.map((s) => s.startTime));
|
|
51
52
|
const endTime = Math.max(...spanData.map((s) => s.endTime));
|
|
52
53
|
const status = spanData.some((s) => s.status.code === "ERROR") ? "ERROR" : "OK";
|
|
@@ -59,7 +60,8 @@ var DevtoolsSpanExporter = class {
|
|
|
59
60
|
endTime,
|
|
60
61
|
duration: endTime - startTime,
|
|
61
62
|
status,
|
|
62
|
-
service: this.serviceName
|
|
63
|
+
service: this.serviceName,
|
|
64
|
+
...partial ? { partial: true } : {}
|
|
63
65
|
};
|
|
64
66
|
}
|
|
65
67
|
/**
|
|
@@ -137,5 +139,4 @@ var DevtoolsSpanExporter = class {
|
|
|
137
139
|
};
|
|
138
140
|
|
|
139
141
|
//#endregion
|
|
140
|
-
exports.DevtoolsSpanExporter = DevtoolsSpanExporter;
|
|
141
|
-
//# sourceMappingURL=exporter.cjs.map
|
|
142
|
+
exports.DevtoolsSpanExporter = DevtoolsSpanExporter;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as DevtoolsSpanExporter } from "../exporter-
|
|
1
|
+
import { t as DevtoolsSpanExporter } from "../exporter-CEKKJTci.cjs";
|
|
2
2
|
export { DevtoolsSpanExporter };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as DevtoolsSpanExporter } from "../exporter-
|
|
1
|
+
import { t as DevtoolsSpanExporter } from "../exporter-BJwufQwg.js";
|
|
2
2
|
export { DevtoolsSpanExporter };
|
package/dist/server/exporter.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { t as pickRoot } from "../trace-root-EHnvuA7f.js";
|
|
2
|
+
|
|
1
3
|
//#region src/server/exporter.ts
|
|
2
4
|
var DevtoolsSpanExporter = class {
|
|
3
5
|
server;
|
|
@@ -43,8 +45,8 @@ var DevtoolsSpanExporter = class {
|
|
|
43
45
|
*/
|
|
44
46
|
convertToTraceData(traceId, spans) {
|
|
45
47
|
const spanData = spans.map((span) => this.convertSpan(span));
|
|
46
|
-
const rootSpan = spanData.find((s) => !s.parentSpanId) || spanData[0];
|
|
47
48
|
spanData.sort((a, b) => a.startTime - b.startTime);
|
|
49
|
+
const { rootSpan, partial } = pickRoot(spanData);
|
|
48
50
|
const startTime = Math.min(...spanData.map((s) => s.startTime));
|
|
49
51
|
const endTime = Math.max(...spanData.map((s) => s.endTime));
|
|
50
52
|
const status = spanData.some((s) => s.status.code === "ERROR") ? "ERROR" : "OK";
|
|
@@ -57,7 +59,8 @@ var DevtoolsSpanExporter = class {
|
|
|
57
59
|
endTime,
|
|
58
60
|
duration: endTime - startTime,
|
|
59
61
|
status,
|
|
60
|
-
service: this.serviceName
|
|
62
|
+
service: this.serviceName,
|
|
63
|
+
...partial ? { partial: true } : {}
|
|
61
64
|
};
|
|
62
65
|
}
|
|
63
66
|
/**
|
|
@@ -135,5 +138,4 @@ var DevtoolsSpanExporter = class {
|
|
|
135
138
|
};
|
|
136
139
|
|
|
137
140
|
//#endregion
|
|
138
|
-
export { DevtoolsSpanExporter };
|
|
139
|
-
//# sourceMappingURL=exporter.js.map
|
|
141
|
+
export { DevtoolsSpanExporter };
|
package/dist/server/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_http = require('../http-
|
|
2
|
+
const require_http = require('../http-bOYC2_Z0.cjs');
|
|
3
3
|
const require_server_exporter = require('./exporter.cjs');
|
|
4
4
|
const require_server_log_exporter = require('./log-exporter.cjs');
|
|
5
5
|
const require_server_remote_exporter = require('./remote-exporter.cjs');
|
package/dist/server/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, o as ErrorOccurrence, r as DevtoolsServerOptions, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "../exporter-
|
|
1
|
+
import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, o as ErrorOccurrence, r as DevtoolsServerOptions, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "../exporter-CEKKJTci.cjs";
|
|
2
2
|
import { DevtoolsLogExporter } from "./log-exporter.cjs";
|
|
3
3
|
import { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions } from "./remote-exporter.cjs";
|
|
4
|
-
import { t as ErrorAggregator } from "../error-aggregator-
|
|
4
|
+
import { t as ErrorAggregator } from "../error-aggregator-CGgWr2OH.cjs";
|
|
5
5
|
import { Server } from "node:http";
|
|
6
6
|
import { AgentRawEvent, OtelMetricRecord } from "autotel-agents";
|
|
7
7
|
//#region src/server/http.d.ts
|
|
@@ -91,5 +91,4 @@ declare function appendWithLimit<T>(items: T[], item: T, limit: number): T[];
|
|
|
91
91
|
declare function appendManyWithLimit<T>(items: T[], incoming: T[], limit: number): T[];
|
|
92
92
|
declare function applyTelemetryLimits(data: DevtoolsData, limits: TelemetryLimits): DevtoolsData;
|
|
93
93
|
//#endregion
|
|
94
|
-
export { DEVTOOLS_IDENTITY, type DevtoolsData, DevtoolsLogExporter, DevtoolsRemoteExporter, type DevtoolsRemoteExporterOptions, type DevtoolsRoutesOptions, DevtoolsServer, type DevtoolsServerOptions, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type ErrorOccurrence, type HttpServerOptions, type LogData, type MetricData, type PortHolder, type SpanData, type TelemetryLimits, type TraceData, allowSensitiveRequest, appendManyWithLimit, appendWithLimit, applyTelemetryLimits, attachDevtoolsRoutes, createDevtoolsHttpServer, decodeOtlpLogsRequest, decodeOtlpMetricsRequest, decodeOtlpTraceRequest, hostHeaderIsLoopback, isLoopbackHostname, isProtobufContentType, originIsLoopback, parseOtlpLogs, parseOtlpTraces, probePortHolder, resolveTelemetryLimits };
|
|
95
|
-
//# sourceMappingURL=index.d.cts.map
|
|
94
|
+
export { DEVTOOLS_IDENTITY, type DevtoolsData, DevtoolsLogExporter, DevtoolsRemoteExporter, type DevtoolsRemoteExporterOptions, type DevtoolsRoutesOptions, DevtoolsServer, type DevtoolsServerOptions, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type ErrorOccurrence, type HttpServerOptions, type LogData, type MetricData, type PortHolder, type SpanData, type TelemetryLimits, type TraceData, allowSensitiveRequest, appendManyWithLimit, appendWithLimit, applyTelemetryLimits, attachDevtoolsRoutes, createDevtoolsHttpServer, decodeOtlpLogsRequest, decodeOtlpMetricsRequest, decodeOtlpTraceRequest, hostHeaderIsLoopback, isLoopbackHostname, isProtobufContentType, originIsLoopback, parseOtlpLogs, parseOtlpTraces, probePortHolder, resolveTelemetryLimits };
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, o as ErrorOccurrence, r as DevtoolsServerOptions, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "../exporter-
|
|
1
|
+
import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, o as ErrorOccurrence, r as DevtoolsServerOptions, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "../exporter-BJwufQwg.js";
|
|
2
2
|
import { DevtoolsLogExporter } from "./log-exporter.js";
|
|
3
3
|
import { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions } from "./remote-exporter.js";
|
|
4
|
-
import { t as ErrorAggregator } from "../error-aggregator-
|
|
4
|
+
import { t as ErrorAggregator } from "../error-aggregator-DufjI2IG.js";
|
|
5
5
|
import { Server } from "node:http";
|
|
6
6
|
import { AgentRawEvent, OtelMetricRecord } from "autotel-agents";
|
|
7
7
|
//#region src/server/http.d.ts
|
|
@@ -91,5 +91,4 @@ declare function appendWithLimit<T>(items: T[], item: T, limit: number): T[];
|
|
|
91
91
|
declare function appendManyWithLimit<T>(items: T[], incoming: T[], limit: number): T[];
|
|
92
92
|
declare function applyTelemetryLimits(data: DevtoolsData, limits: TelemetryLimits): DevtoolsData;
|
|
93
93
|
//#endregion
|
|
94
|
-
export { DEVTOOLS_IDENTITY, type DevtoolsData, DevtoolsLogExporter, DevtoolsRemoteExporter, type DevtoolsRemoteExporterOptions, type DevtoolsRoutesOptions, DevtoolsServer, type DevtoolsServerOptions, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type ErrorOccurrence, type HttpServerOptions, type LogData, type MetricData, type PortHolder, type SpanData, type TelemetryLimits, type TraceData, allowSensitiveRequest, appendManyWithLimit, appendWithLimit, applyTelemetryLimits, attachDevtoolsRoutes, createDevtoolsHttpServer, decodeOtlpLogsRequest, decodeOtlpMetricsRequest, decodeOtlpTraceRequest, hostHeaderIsLoopback, isLoopbackHostname, isProtobufContentType, originIsLoopback, parseOtlpLogs, parseOtlpTraces, probePortHolder, resolveTelemetryLimits };
|
|
95
|
-
//# sourceMappingURL=index.d.ts.map
|
|
94
|
+
export { DEVTOOLS_IDENTITY, type DevtoolsData, DevtoolsLogExporter, DevtoolsRemoteExporter, type DevtoolsRemoteExporterOptions, type DevtoolsRoutesOptions, DevtoolsServer, type DevtoolsServerOptions, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type ErrorOccurrence, type HttpServerOptions, type LogData, type MetricData, type PortHolder, type SpanData, type TelemetryLimits, type TraceData, allowSensitiveRequest, appendManyWithLimit, appendWithLimit, applyTelemetryLimits, attachDevtoolsRoutes, createDevtoolsHttpServer, decodeOtlpLogsRequest, decodeOtlpMetricsRequest, decodeOtlpTraceRequest, hostHeaderIsLoopback, isLoopbackHostname, isProtobufContentType, originIsLoopback, parseOtlpLogs, parseOtlpTraces, probePortHolder, resolveTelemetryLimits };
|
package/dist/server/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as appendWithLimit, a as decodeOtlpLogsRequest, b as ErrorAggregator, c as isProtobufContentType, d as DevtoolsServer, f as allowSensitiveRequest, g as appendManyWithLimit, h as originIsLoopback, i as probePortHolder, l as parseOtlpLogs, m as isLoopbackHostname, n as createDevtoolsHttpServer, o as decodeOtlpMetricsRequest, p as hostHeaderIsLoopback, r as DEVTOOLS_IDENTITY, s as decodeOtlpTraceRequest, t as attachDevtoolsRoutes, u as parseOtlpTraces, v as applyTelemetryLimits, y as resolveTelemetryLimits } from "../http-
|
|
1
|
+
import { _ as appendWithLimit, a as decodeOtlpLogsRequest, b as ErrorAggregator, c as isProtobufContentType, d as DevtoolsServer, f as allowSensitiveRequest, g as appendManyWithLimit, h as originIsLoopback, i as probePortHolder, l as parseOtlpLogs, m as isLoopbackHostname, n as createDevtoolsHttpServer, o as decodeOtlpMetricsRequest, p as hostHeaderIsLoopback, r as DEVTOOLS_IDENTITY, s as decodeOtlpTraceRequest, t as attachDevtoolsRoutes, u as parseOtlpTraces, v as applyTelemetryLimits, y as resolveTelemetryLimits } from "../http-BLmWVZP0.js";
|
|
2
2
|
import { DevtoolsSpanExporter } from "./exporter.js";
|
|
3
3
|
import { DevtoolsLogExporter } from "./log-exporter.js";
|
|
4
4
|
import { DevtoolsRemoteExporter } from "./remote-exporter.js";
|
|
@@ -27,5 +27,4 @@ declare class DevtoolsLogExporter implements LogRecordExporter {
|
|
|
27
27
|
forceFlush(): Promise<void>;
|
|
28
28
|
}
|
|
29
29
|
//#endregion
|
|
30
|
-
export { DevtoolsLogExporter, DevtoolsLogExporterOptions };
|
|
31
|
-
//# sourceMappingURL=log-exporter.d.cts.map
|
|
30
|
+
export { DevtoolsLogExporter, DevtoolsLogExporterOptions };
|
|
@@ -27,5 +27,4 @@ declare class DevtoolsLogExporter implements LogRecordExporter {
|
|
|
27
27
|
forceFlush(): Promise<void>;
|
|
28
28
|
}
|
|
29
29
|
//#endregion
|
|
30
|
-
export { DevtoolsLogExporter, DevtoolsLogExporterOptions };
|
|
31
|
-
//# sourceMappingURL=log-exporter.d.ts.map
|
|
30
|
+
export { DevtoolsLogExporter, DevtoolsLogExporterOptions };
|
|
@@ -62,5 +62,4 @@ declare class DevtoolsRemoteExporter implements SpanExporter {
|
|
|
62
62
|
private log;
|
|
63
63
|
}
|
|
64
64
|
//#endregion
|
|
65
|
-
export { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions };
|
|
66
|
-
//# sourceMappingURL=remote-exporter.d.cts.map
|
|
65
|
+
export { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions };
|
|
@@ -62,5 +62,4 @@ declare class DevtoolsRemoteExporter implements SpanExporter {
|
|
|
62
62
|
private log;
|
|
63
63
|
}
|
|
64
64
|
//#endregion
|
|
65
|
-
export { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions };
|
|
66
|
-
//# sourceMappingURL=remote-exporter.d.ts.map
|
|
65
|
+
export { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/server/trace-root.ts
|
|
3
|
+
/**
|
|
4
|
+
* Pick the span to present as the top of a trace, and report whether the real
|
|
5
|
+
* root is missing from `spans`.
|
|
6
|
+
*
|
|
7
|
+
* A true root has no parent at all. Failing that the trace is a fragment, so
|
|
8
|
+
* fall back to the earliest span whose parent did not arrive rather than
|
|
9
|
+
* presenting an arbitrary child as though it were the root. Sampling makes this
|
|
10
|
+
* ordinary: a sender may keep a failed span and drop the routine parent above
|
|
11
|
+
* it, and a receiver that hides the difference makes a half-trace look complete.
|
|
12
|
+
*
|
|
13
|
+
* `partial` is a fact about the span set passed in, not about a batch — spans of
|
|
14
|
+
* one trace arrive across several exports, so recompute this wherever the set
|
|
15
|
+
* grows instead of caching the first answer.
|
|
16
|
+
*
|
|
17
|
+
* Pass spans sorted by start time; the fallbacks then pick the earliest
|
|
18
|
+
* candidate rather than whichever one the caller happened to receive first.
|
|
19
|
+
*/
|
|
20
|
+
function pickRoot(spans) {
|
|
21
|
+
const present = new Set(spans.map((s) => s.spanId));
|
|
22
|
+
const trueRoot = spans.find((s) => !s.parentSpanId);
|
|
23
|
+
const orphan = spans.find((s) => s.parentSpanId && !present.has(s.parentSpanId));
|
|
24
|
+
return {
|
|
25
|
+
rootSpan: trueRoot ?? orphan ?? spans[0],
|
|
26
|
+
partial: !trueRoot
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
Object.defineProperty(exports, 'pickRoot', {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () {
|
|
34
|
+
return pickRoot;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/server/trace-root.ts
|
|
2
|
+
/**
|
|
3
|
+
* Pick the span to present as the top of a trace, and report whether the real
|
|
4
|
+
* root is missing from `spans`.
|
|
5
|
+
*
|
|
6
|
+
* A true root has no parent at all. Failing that the trace is a fragment, so
|
|
7
|
+
* fall back to the earliest span whose parent did not arrive rather than
|
|
8
|
+
* presenting an arbitrary child as though it were the root. Sampling makes this
|
|
9
|
+
* ordinary: a sender may keep a failed span and drop the routine parent above
|
|
10
|
+
* it, and a receiver that hides the difference makes a half-trace look complete.
|
|
11
|
+
*
|
|
12
|
+
* `partial` is a fact about the span set passed in, not about a batch — spans of
|
|
13
|
+
* one trace arrive across several exports, so recompute this wherever the set
|
|
14
|
+
* grows instead of caching the first answer.
|
|
15
|
+
*
|
|
16
|
+
* Pass spans sorted by start time; the fallbacks then pick the earliest
|
|
17
|
+
* candidate rather than whichever one the caller happened to receive first.
|
|
18
|
+
*/
|
|
19
|
+
function pickRoot(spans) {
|
|
20
|
+
const present = new Set(spans.map((s) => s.spanId));
|
|
21
|
+
const trueRoot = spans.find((s) => !s.parentSpanId);
|
|
22
|
+
const orphan = spans.find((s) => s.parentSpanId && !present.has(s.parentSpanId));
|
|
23
|
+
return {
|
|
24
|
+
rootSpan: trueRoot ?? orphan ?? spans[0],
|
|
25
|
+
partial: !trueRoot
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
export { pickRoot as t };
|