@senpi/runtime 1.1.0-dev.runtime-phase-2.20260610214734 → 1.1.0-dev.runtime-phase-2.20260611115723
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/tracking/spans/fan-out-span-transport.d.ts +22 -0
- package/dist/tracking/spans/fan-out-span-transport.d.ts.map +1 -0
- package/dist/tracking/spans/fan-out-span-transport.js +49 -0
- package/dist/tracking/spans/fan-out-span-transport.js.map +1 -0
- package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts +16 -0
- package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts.map +1 -0
- package/dist/tracking/spans/otel/map-span-to-trace-row.js +137 -0
- package/dist/tracking/spans/otel/map-span-to-trace-row.js.map +1 -0
- package/dist/tracking/spans/otel/recording-span-transport.d.ts +43 -0
- package/dist/tracking/spans/otel/recording-span-transport.d.ts.map +1 -0
- package/dist/tracking/spans/otel/recording-span-transport.js +64 -0
- package/dist/tracking/spans/otel/recording-span-transport.js.map +1 -0
- package/dist/tracking/spans/otel/span-ids.d.ts +22 -0
- package/dist/tracking/spans/otel/span-ids.d.ts.map +1 -0
- package/dist/tracking/spans/otel/span-ids.js +32 -0
- package/dist/tracking/spans/otel/span-ids.js.map +1 -0
- package/dist/tracking/spans/plugin-span-tracker.d.ts +6 -0
- package/dist/tracking/spans/plugin-span-tracker.d.ts.map +1 -1
- package/dist/tracking/spans/plugin-span-tracker.js +44 -7
- package/dist/tracking/spans/plugin-span-tracker.js.map +1 -1
- package/dist/tracking/spans/span-transport.d.ts +6 -0
- package/dist/tracking/spans/span-transport.d.ts.map +1 -1
- package/dist/tracking/spans/span-transport.js +1 -1
- package/dist/tracking/spans/span-transport.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fan-out span transport — ships every span to N child transports.
|
|
3
|
+
*
|
|
4
|
+
* Used during the dual-write phase of the OTEL v2 cutover: the legacy
|
|
5
|
+
* `BatchingSpanTransport` (→ /api/v1/tracking/spans) and the new
|
|
6
|
+
* `RecordingSpanTransport` (→ /v1/traces) both receive every span.
|
|
7
|
+
*
|
|
8
|
+
* Isolation is load-bearing: a throw/rejection in one child must never starve
|
|
9
|
+
* the other, and `enqueue` must never throw back into the SpanTracker (which
|
|
10
|
+
* runs on the hook path). `flush`/`shutdown` await all children and never
|
|
11
|
+
* reject — a failing child is logged and swallowed.
|
|
12
|
+
*/
|
|
13
|
+
import type { SpanTransport, TrackingSpan } from "./types.js";
|
|
14
|
+
export declare class FanOutSpanTransport implements SpanTransport {
|
|
15
|
+
private readonly children;
|
|
16
|
+
constructor(children: SpanTransport[]);
|
|
17
|
+
enqueue(span: TrackingSpan): void;
|
|
18
|
+
flush(): Promise<void>;
|
|
19
|
+
shutdown(): Promise<void>;
|
|
20
|
+
private allSettled;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=fan-out-span-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fan-out-span-transport.d.ts","sourceRoot":"","sources":["../../../src/tracking/spans/fan-out-span-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK9D,qBAAa,mBAAoB,YAAW,aAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,aAAa,EAAE;IAEtD,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAY3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,UAAU;CAazB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fan-out span transport — ships every span to N child transports.
|
|
3
|
+
*
|
|
4
|
+
* Used during the dual-write phase of the OTEL v2 cutover: the legacy
|
|
5
|
+
* `BatchingSpanTransport` (→ /api/v1/tracking/spans) and the new
|
|
6
|
+
* `RecordingSpanTransport` (→ /v1/traces) both receive every span.
|
|
7
|
+
*
|
|
8
|
+
* Isolation is load-bearing: a throw/rejection in one child must never starve
|
|
9
|
+
* the other, and `enqueue` must never throw back into the SpanTracker (which
|
|
10
|
+
* runs on the hook path). `flush`/`shutdown` await all children and never
|
|
11
|
+
* reject — a failing child is logged and swallowed.
|
|
12
|
+
*/
|
|
13
|
+
import { createLogger } from "../../utils/logger.js";
|
|
14
|
+
const logger = createLogger("[senpi-core][fan-out-span-transport]");
|
|
15
|
+
export class FanOutSpanTransport {
|
|
16
|
+
children;
|
|
17
|
+
constructor(children) {
|
|
18
|
+
this.children = children;
|
|
19
|
+
}
|
|
20
|
+
enqueue(span) {
|
|
21
|
+
for (const child of this.children) {
|
|
22
|
+
try {
|
|
23
|
+
child.enqueue(span);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
logger.warn("child transport enqueue threw; swallowed", {
|
|
27
|
+
err: err instanceof Error ? err.message : String(err),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async flush() {
|
|
33
|
+
await this.allSettled((c) => c.flush(), "flush");
|
|
34
|
+
}
|
|
35
|
+
async shutdown() {
|
|
36
|
+
await this.allSettled((c) => c.shutdown(), "shutdown");
|
|
37
|
+
}
|
|
38
|
+
async allSettled(op, label) {
|
|
39
|
+
const results = await Promise.allSettled(this.children.map((c) => op(c)));
|
|
40
|
+
for (const r of results) {
|
|
41
|
+
if (r.status === "rejected") {
|
|
42
|
+
logger.warn(`child transport ${label} rejected; swallowed`, {
|
|
43
|
+
err: r.reason instanceof Error ? r.reason.message : String(r.reason),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=fan-out-span-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fan-out-span-transport.js","sourceRoot":"","sources":["../../../src/tracking/spans/fan-out-span-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,GAAG,YAAY,CAAC,sCAAsC,CAAC,CAAC;AAEpE,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAE1D,OAAO,CAAC,IAAkB;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;oBACtD,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACtD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,EAA2C,EAC3C,KAAa;QAEb,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,mBAAmB,KAAK,sBAAsB,EAAE;oBAC1D,GAAG,EAAE,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;iBACrE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure `TrackingSpan → TraceRow` mapper.
|
|
3
|
+
*
|
|
4
|
+
* Maps the agent-span envelope onto the OTEL v2 HyperDX-row shape so agent spans
|
|
5
|
+
* land in `otel_traces` alongside scanner/runtime traces. The caller is expected
|
|
6
|
+
* to have already redacted + truncated `span.data` (see RecordingSpanTransport);
|
|
7
|
+
* this function performs no redaction and no I/O.
|
|
8
|
+
*
|
|
9
|
+
* Bounding: per-field size is the caller's responsibility (truncateSpanData,
|
|
10
|
+
* 2 MB/field) and the batcher's 8 MB body cap — so this does NOT impose the
|
|
11
|
+
* small AttrBuilder caps (4 KB/value), which would gut large LLM payloads.
|
|
12
|
+
*/
|
|
13
|
+
import type { TraceRow } from "../../../recording/transport/rows.js";
|
|
14
|
+
import type { TrackingSpan } from "../types.js";
|
|
15
|
+
export declare function trackingSpanToTraceRow(span: TrackingSpan): TraceRow;
|
|
16
|
+
//# sourceMappingURL=map-span-to-trace-row.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-span-to-trace-row.d.ts","sourceRoot":"","sources":["../../../../src/tracking/spans/otel/map-span-to-trace-row.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAwB,MAAM,sCAAsC,CAAC;AAE3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA4EhD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,CA8DnE"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure `TrackingSpan → TraceRow` mapper.
|
|
3
|
+
*
|
|
4
|
+
* Maps the agent-span envelope onto the OTEL v2 HyperDX-row shape so agent spans
|
|
5
|
+
* land in `otel_traces` alongside scanner/runtime traces. The caller is expected
|
|
6
|
+
* to have already redacted + truncated `span.data` (see RecordingSpanTransport);
|
|
7
|
+
* this function performs no redaction and no I/O.
|
|
8
|
+
*
|
|
9
|
+
* Bounding: per-field size is the caller's responsibility (truncateSpanData,
|
|
10
|
+
* 2 MB/field) and the batcher's 8 MB body cap — so this does NOT impose the
|
|
11
|
+
* small AttrBuilder caps (4 KB/value), which would gut large LLM payloads.
|
|
12
|
+
*/
|
|
13
|
+
import { msToNs, durationNs } from "../../../recording/otel/attributes.js";
|
|
14
|
+
import { deriveTraceId, deriveSpanId, deriveParentSpanId } from "./span-ids.js";
|
|
15
|
+
const SERVICE_NAME = "senpi-trading-runtime";
|
|
16
|
+
const SCOPE_NAME = "senpi.otel";
|
|
17
|
+
const SCOPE_VERSION = "2.0.0";
|
|
18
|
+
function asRecord(v) {
|
|
19
|
+
return v && typeof v === "object" && !Array.isArray(v)
|
|
20
|
+
? v
|
|
21
|
+
: undefined;
|
|
22
|
+
}
|
|
23
|
+
function nonEmpty(v) {
|
|
24
|
+
return typeof v === "string" && v.length > 0 ? v : undefined;
|
|
25
|
+
}
|
|
26
|
+
/** Set a string attribute, omitting null/undefined/empty. `0` survives (meaningful). */
|
|
27
|
+
function putStr(map, key, value) {
|
|
28
|
+
if (value === null || value === undefined || value === "")
|
|
29
|
+
return;
|
|
30
|
+
map[key] = String(value);
|
|
31
|
+
}
|
|
32
|
+
/** Set one attribute per top-level `data` key: scalars as String, objects/arrays as JSON. */
|
|
33
|
+
function putDataValue(map, key, value) {
|
|
34
|
+
if (value === undefined)
|
|
35
|
+
return;
|
|
36
|
+
if (value === null)
|
|
37
|
+
return;
|
|
38
|
+
if (typeof value === "object") {
|
|
39
|
+
try {
|
|
40
|
+
const s = JSON.stringify(value);
|
|
41
|
+
if (s !== undefined)
|
|
42
|
+
map[key] = s;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* unserializable — drop the one key, not the row */
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
map[key] = String(value);
|
|
50
|
+
}
|
|
51
|
+
function spanName(span) {
|
|
52
|
+
const data = asRecord(span.data);
|
|
53
|
+
switch (span.spanType) {
|
|
54
|
+
case "llm":
|
|
55
|
+
return nonEmpty(span.model) ? `llm ${span.model}` : "llm";
|
|
56
|
+
case "tool": {
|
|
57
|
+
const name = nonEmpty(data?.tool_name) ?? nonEmpty(data?.toolName);
|
|
58
|
+
return name ? `tool ${name}` : "tool";
|
|
59
|
+
}
|
|
60
|
+
case "subagent": {
|
|
61
|
+
const agentId = nonEmpty(asRecord(data?.input)?.agentId) ?? nonEmpty(data?.agentId);
|
|
62
|
+
return agentId ? `subagent ${agentId}` : "subagent";
|
|
63
|
+
}
|
|
64
|
+
case "agent_end":
|
|
65
|
+
return "agent.end";
|
|
66
|
+
default:
|
|
67
|
+
return span.spanType;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function spanKind(spanType) {
|
|
71
|
+
return spanType === "llm" || spanType === "tool" ? "Client" : "Internal";
|
|
72
|
+
}
|
|
73
|
+
/** Child run id rides in the delivery patch (subagent_delivery_target) or the spawned patch. */
|
|
74
|
+
function childRunId(data) {
|
|
75
|
+
return (nonEmpty(asRecord(data?.delivery)?.childRunId) ??
|
|
76
|
+
nonEmpty(data?.childRunId) ??
|
|
77
|
+
nonEmpty(data?.runId));
|
|
78
|
+
}
|
|
79
|
+
export function trackingSpanToTraceRow(span) {
|
|
80
|
+
const data = asRecord(span.data);
|
|
81
|
+
const error = nonEmpty(data?.error);
|
|
82
|
+
const address = span.address.toLowerCase();
|
|
83
|
+
const status = error !== undefined ? "Error" : "Ok";
|
|
84
|
+
const resourceAttributes = { "service.name": SERVICE_NAME };
|
|
85
|
+
putStr(resourceAttributes, "strategy.address", address);
|
|
86
|
+
putStr(resourceAttributes, "recipe.name", span.recipeName);
|
|
87
|
+
putStr(resourceAttributes, "runtime.id", span.runtimeId);
|
|
88
|
+
putStr(resourceAttributes, "runtime.version", span.runtimeVersion);
|
|
89
|
+
// user.id is intentionally NOT set — the /v1/traces route server-stamps it.
|
|
90
|
+
const spanAttributes = {};
|
|
91
|
+
putStr(spanAttributes, "span.type", span.spanType);
|
|
92
|
+
putStr(spanAttributes, "emission.source", span.emissionSource);
|
|
93
|
+
putStr(spanAttributes, "session.key", span.sessionKey);
|
|
94
|
+
putStr(spanAttributes, "run.id", span.runId);
|
|
95
|
+
putStr(spanAttributes, "correlation.id", span.correlationId);
|
|
96
|
+
putStr(spanAttributes, "child.session.key", span.childSessionKey);
|
|
97
|
+
putStr(spanAttributes, "tool.call_id", span.toolCallId);
|
|
98
|
+
putStr(spanAttributes, "tool.name", nonEmpty(data?.tool_name) ?? nonEmpty(data?.toolName));
|
|
99
|
+
putStr(spanAttributes, "gen_ai.request.model", span.model);
|
|
100
|
+
putStr(spanAttributes, "gen_ai.usage.input_tokens", span.tokensIn);
|
|
101
|
+
putStr(spanAttributes, "gen_ai.usage.output_tokens", span.tokensOut);
|
|
102
|
+
putStr(spanAttributes, "cost.usd", span.costUsd);
|
|
103
|
+
// Mega-trace breadcrumb: lets a downstream view stitch the subagent's own
|
|
104
|
+
// (separate) trace back onto the host. child.session.key is always present;
|
|
105
|
+
// child.run_id depends on the spawned/delivery hooks having fired.
|
|
106
|
+
if (span.spanType === "subagent") {
|
|
107
|
+
putStr(spanAttributes, "subagent.child_session_key", span.childSessionKey);
|
|
108
|
+
putStr(spanAttributes, "subagent.child_run_id", childRunId(data));
|
|
109
|
+
}
|
|
110
|
+
// Flatten the payload bag one level: each top-level data key → one attribute.
|
|
111
|
+
if (data) {
|
|
112
|
+
for (const [k, v] of Object.entries(data)) {
|
|
113
|
+
putDataValue(spanAttributes, `data.${k}`, v);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
Timestamp: msToNs(span.startedAt),
|
|
118
|
+
TraceId: deriveTraceId(span.runId),
|
|
119
|
+
SpanId: deriveSpanId(span.id),
|
|
120
|
+
ParentSpanId: deriveParentSpanId(span.parentSpanId),
|
|
121
|
+
TraceState: "",
|
|
122
|
+
SpanName: spanName(span),
|
|
123
|
+
SpanKind: spanKind(span.spanType),
|
|
124
|
+
ServiceName: SERVICE_NAME,
|
|
125
|
+
Duration: durationNs(span.startedAt, span.endedAt),
|
|
126
|
+
StatusCode: status,
|
|
127
|
+
StatusMessage: error ?? "",
|
|
128
|
+
SpanAttributes: spanAttributes,
|
|
129
|
+
ResourceAttributes: resourceAttributes,
|
|
130
|
+
Events: [],
|
|
131
|
+
ScopeName: SCOPE_NAME,
|
|
132
|
+
ScopeVersion: SCOPE_VERSION,
|
|
133
|
+
TraceFlags: 1,
|
|
134
|
+
address,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=map-span-to-trace-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-span-to-trace-row.js","sourceRoot":"","sources":["../../../../src/tracking/spans/otel/map-span-to-trace-row.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecordingSpanTransport — ships agent spans to the OTEL v2 `/v1/traces` path.
|
|
3
|
+
*
|
|
4
|
+
* Implements the same `SpanTransport` seam as `BatchingSpanTransport`, but maps
|
|
5
|
+
* each `TrackingSpan` to a HyperDX `TraceRow` and enqueues it on a dedicated
|
|
6
|
+
* recording `TelemetryBatcher` (one per gateway — built at plugin register(),
|
|
7
|
+
* not borrowed from a per-runtime batcher).
|
|
8
|
+
*
|
|
9
|
+
* Pipeline per span (fire-and-forget, never throws into the SpanTracker):
|
|
10
|
+
* truncate oversized data fields → redact PII → map to TraceRow → enqueueTrace
|
|
11
|
+
*
|
|
12
|
+
* Truncation + redaction mirror BatchingSpanTransport so the new path never
|
|
13
|
+
* ships unredacted or oversized payloads. The recording batcher serializes at
|
|
14
|
+
* enqueue, so (unlike the legacy transport) both run BEFORE the row is built.
|
|
15
|
+
*
|
|
16
|
+
* `flush`/`shutdown` first await any in-flight per-span processing, then the
|
|
17
|
+
* batcher — so a flush is deterministic (no row stranded mid-pipeline).
|
|
18
|
+
*/
|
|
19
|
+
import type { SpanTransport, TrackingSpan } from "../types.js";
|
|
20
|
+
import type { TelemetryBatcher } from "../../../recording/transport/index.js";
|
|
21
|
+
import { type PiiRedactor } from "../redact-pii.js";
|
|
22
|
+
export interface RecordingSpanTransportOptions {
|
|
23
|
+
batcher: TelemetryBatcher;
|
|
24
|
+
/**
|
|
25
|
+
* PII redactor. Omit (`undefined`) to look up the process-wide default at use
|
|
26
|
+
* time (handles async redactor init); pass `null` to disable redaction
|
|
27
|
+
* explicitly (tests/local dev).
|
|
28
|
+
*/
|
|
29
|
+
redactor?: PiiRedactor | null;
|
|
30
|
+
}
|
|
31
|
+
export declare class RecordingSpanTransport implements SpanTransport {
|
|
32
|
+
private readonly batcher;
|
|
33
|
+
private readonly redactorOverride;
|
|
34
|
+
private readonly pending;
|
|
35
|
+
constructor(options: RecordingSpanTransportOptions);
|
|
36
|
+
enqueue(span: TrackingSpan): void;
|
|
37
|
+
flush(): Promise<void>;
|
|
38
|
+
shutdown(): Promise<void>;
|
|
39
|
+
/** Truncate → redact → map → enqueue. Self-contained; never throws. */
|
|
40
|
+
private process;
|
|
41
|
+
private drainPending;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=recording-span-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-span-transport.d.ts","sourceRoot":"","sources":["../../../../src/tracking/spans/otel/recording-span-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,kBAAkB,CAAC;AAM1B,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,gBAAgB,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/B;AAED,qBAAa,sBAAuB,YAAW,aAAa;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAExC,OAAO,EAAE,6BAA6B;IAKlD,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAK3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,uEAAuE;YACzD,OAAO;YAgBP,YAAY;CAG3B"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecordingSpanTransport — ships agent spans to the OTEL v2 `/v1/traces` path.
|
|
3
|
+
*
|
|
4
|
+
* Implements the same `SpanTransport` seam as `BatchingSpanTransport`, but maps
|
|
5
|
+
* each `TrackingSpan` to a HyperDX `TraceRow` and enqueues it on a dedicated
|
|
6
|
+
* recording `TelemetryBatcher` (one per gateway — built at plugin register(),
|
|
7
|
+
* not borrowed from a per-runtime batcher).
|
|
8
|
+
*
|
|
9
|
+
* Pipeline per span (fire-and-forget, never throws into the SpanTracker):
|
|
10
|
+
* truncate oversized data fields → redact PII → map to TraceRow → enqueueTrace
|
|
11
|
+
*
|
|
12
|
+
* Truncation + redaction mirror BatchingSpanTransport so the new path never
|
|
13
|
+
* ships unredacted or oversized payloads. The recording batcher serializes at
|
|
14
|
+
* enqueue, so (unlike the legacy transport) both run BEFORE the row is built.
|
|
15
|
+
*
|
|
16
|
+
* `flush`/`shutdown` first await any in-flight per-span processing, then the
|
|
17
|
+
* batcher — so a flush is deterministic (no row stranded mid-pipeline).
|
|
18
|
+
*/
|
|
19
|
+
import { truncateSpanData } from "../span-transport.js";
|
|
20
|
+
import { getDefaultPiiRedactor, redactSpanData, } from "../redact-pii.js";
|
|
21
|
+
import { trackingSpanToTraceRow } from "./map-span-to-trace-row.js";
|
|
22
|
+
import { createLogger } from "../../../utils/logger.js";
|
|
23
|
+
const logger = createLogger("[senpi-core][recording-span-transport]");
|
|
24
|
+
export class RecordingSpanTransport {
|
|
25
|
+
batcher;
|
|
26
|
+
redactorOverride;
|
|
27
|
+
pending = new Set();
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.batcher = options.batcher;
|
|
30
|
+
this.redactorOverride = options.redactor;
|
|
31
|
+
}
|
|
32
|
+
enqueue(span) {
|
|
33
|
+
const p = this.process(span).finally(() => this.pending.delete(p));
|
|
34
|
+
this.pending.add(p);
|
|
35
|
+
}
|
|
36
|
+
async flush() {
|
|
37
|
+
await this.drainPending();
|
|
38
|
+
await this.batcher.flush();
|
|
39
|
+
}
|
|
40
|
+
async shutdown() {
|
|
41
|
+
await this.drainPending();
|
|
42
|
+
await this.batcher.shutdown();
|
|
43
|
+
}
|
|
44
|
+
/** Truncate → redact → map → enqueue. Self-contained; never throws. */
|
|
45
|
+
async process(span) {
|
|
46
|
+
try {
|
|
47
|
+
const truncated = truncateSpanData(span);
|
|
48
|
+
const redactor = this.redactorOverride === undefined
|
|
49
|
+
? getDefaultPiiRedactor()
|
|
50
|
+
: this.redactorOverride;
|
|
51
|
+
const cleaned = redactor ? await redactSpanData(truncated, redactor) : truncated;
|
|
52
|
+
this.batcher.enqueueTrace(trackingSpanToTraceRow(cleaned));
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
logger.warn("span → trace-row pipeline failed; dropped", {
|
|
56
|
+
err: err instanceof Error ? err.message : String(err),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async drainPending() {
|
|
61
|
+
await Promise.allSettled([...this.pending]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=recording-span-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-span-transport.js","sourceRoot":"","sources":["../../../../src/tracking/spans/otel/recording-span-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAEL,qBAAqB,EACrB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,MAAM,GAAG,YAAY,CAAC,wCAAwC,CAAC,CAAC;AAYtE,MAAM,OAAO,sBAAsB;IAChB,OAAO,CAAmB;IAC1B,gBAAgB,CAAiC;IACjD,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IAEpD,YAAY,OAAsC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,IAAkB;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED,uEAAuE;IAC/D,KAAK,CAAC,OAAO,CAAC,IAAkB;QACtC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,QAAQ,GACZ,IAAI,CAAC,gBAAgB,KAAK,SAAS;gBACjC,CAAC,CAAC,qBAAqB,EAAE;gBACzB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE;gBACvD,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACtD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic OTEL id derivation for agent spans.
|
|
3
|
+
*
|
|
4
|
+
* Unlike scanner spans (each its own trace, random ids via `cryptoIdGenerator`),
|
|
5
|
+
* agent spans must group by run and preserve their parent/child tree. So ids are
|
|
6
|
+
* *derived* — a hash of the stable source key — rather than random:
|
|
7
|
+
*
|
|
8
|
+
* - `TraceId` = hash(runId) → every span in one agent run shares it
|
|
9
|
+
* - `SpanId` = hash(span.id)
|
|
10
|
+
* - `ParentSpanId` = hash(span.parentSpanId) ("" stays "" for roots)
|
|
11
|
+
*
|
|
12
|
+
* A child's `parentSpanId` holds the parent span's raw id, so
|
|
13
|
+
* `deriveParentSpanId(child.parentSpanId)` equals `deriveSpanId(parent.id)` —
|
|
14
|
+
* the link reconstructs in HyperDX.
|
|
15
|
+
*/
|
|
16
|
+
/** 32 lowercase-hex chars (16 bytes) derived from the agent run id. */
|
|
17
|
+
export declare function deriveTraceId(runId: string): string;
|
|
18
|
+
/** 16 lowercase-hex chars (8 bytes) derived from the span's raw id. */
|
|
19
|
+
export declare function deriveSpanId(id: string): string;
|
|
20
|
+
/** Derived parent SpanId; empty string (root) passes through unchanged. */
|
|
21
|
+
export declare function deriveParentSpanId(parentSpanId: string): string;
|
|
22
|
+
//# sourceMappingURL=span-ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-ids.d.ts","sourceRoot":"","sources":["../../../../src/tracking/spans/otel/span-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE/D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic OTEL id derivation for agent spans.
|
|
3
|
+
*
|
|
4
|
+
* Unlike scanner spans (each its own trace, random ids via `cryptoIdGenerator`),
|
|
5
|
+
* agent spans must group by run and preserve their parent/child tree. So ids are
|
|
6
|
+
* *derived* — a hash of the stable source key — rather than random:
|
|
7
|
+
*
|
|
8
|
+
* - `TraceId` = hash(runId) → every span in one agent run shares it
|
|
9
|
+
* - `SpanId` = hash(span.id)
|
|
10
|
+
* - `ParentSpanId` = hash(span.parentSpanId) ("" stays "" for roots)
|
|
11
|
+
*
|
|
12
|
+
* A child's `parentSpanId` holds the parent span's raw id, so
|
|
13
|
+
* `deriveParentSpanId(child.parentSpanId)` equals `deriveSpanId(parent.id)` —
|
|
14
|
+
* the link reconstructs in HyperDX.
|
|
15
|
+
*/
|
|
16
|
+
import { createHash } from "node:crypto";
|
|
17
|
+
function hashHex(input, bytes) {
|
|
18
|
+
return createHash("sha256").update(input).digest("hex").slice(0, bytes * 2);
|
|
19
|
+
}
|
|
20
|
+
/** 32 lowercase-hex chars (16 bytes) derived from the agent run id. */
|
|
21
|
+
export function deriveTraceId(runId) {
|
|
22
|
+
return hashHex(runId, 16);
|
|
23
|
+
}
|
|
24
|
+
/** 16 lowercase-hex chars (8 bytes) derived from the span's raw id. */
|
|
25
|
+
export function deriveSpanId(id) {
|
|
26
|
+
return hashHex(id, 8);
|
|
27
|
+
}
|
|
28
|
+
/** Derived parent SpanId; empty string (root) passes through unchanged. */
|
|
29
|
+
export function deriveParentSpanId(parentSpanId) {
|
|
30
|
+
return parentSpanId === "" ? "" : deriveSpanId(parentSpanId);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=span-ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-ids.js","sourceRoot":"","sources":["../../../../src/tracking/spans/otel/span-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,OAAO,CAAC,KAAa,EAAE,KAAa;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,YAAoB;IACrD,OAAO,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import { SpanTracker } from "./span-tracker.js";
|
|
2
|
+
import type { SpanTransport } from "./types.js";
|
|
3
|
+
export type SpanSinkMode = "legacy" | "dual" | "otel";
|
|
4
|
+
/** Parse `SENPI_SPANS_SINK`; unknown/unset → `dual` (the validation default). */
|
|
5
|
+
export declare function resolveSpanSinkMode(value: string | undefined): SpanSinkMode;
|
|
6
|
+
/** Compose the active transport from the two children per the sink mode. */
|
|
7
|
+
export declare function composeSpanTransport(mode: SpanSinkMode, legacy: SpanTransport, recording: SpanTransport): SpanTransport;
|
|
2
8
|
export declare function createPluginSpanTracker(apiKey: string | undefined): SpanTracker;
|
|
3
9
|
//# sourceMappingURL=plugin-span-tracker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-span-tracker.d.ts","sourceRoot":"","sources":["../../../src/tracking/spans/plugin-span-tracker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-span-tracker.d.ts","sourceRoot":"","sources":["../../../src/tracking/spans/plugin-span-tracker.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAShD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAI3E;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,aAAa,GACvB,aAAa,CASf;AAgCD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,WAAW,CA2Bb"}
|
|
@@ -5,13 +5,41 @@
|
|
|
5
5
|
* instances and OpenClaw hooks running inside this gateway. The transport is
|
|
6
6
|
* authenticated with the gateway's single SENPI_API_KEY (one-gateway-per-user
|
|
7
7
|
* deployment assumption).
|
|
8
|
+
*
|
|
9
|
+
* Span sink (OTEL v2 cutover): `SENPI_SPANS_SINK` selects where spans go —
|
|
10
|
+
* - `legacy` → POST /api/v1/tracking/spans (BatchingSpanTransport)
|
|
11
|
+
* - `dual` → both, via FanOutSpanTransport (default; validation phase)
|
|
12
|
+
* - `otel` → POST /v1/traces (RecordingSpanTransport → recording batcher)
|
|
13
|
+
* Every transition is config-only (set the env var + restart); see the design
|
|
14
|
+
* doc's cutover plan.
|
|
8
15
|
*/
|
|
9
16
|
import { createLogger } from "../../utils/logger.js";
|
|
10
17
|
import { TRACKING_API_BASE_URL } from "../constants.js";
|
|
18
|
+
import { createBatcher, resolveTransportConfig, } from "../../recording/transport/index.js";
|
|
11
19
|
import { BatchingSpanTransport, NoOpSpanTransport } from "./span-transport.js";
|
|
20
|
+
import { FanOutSpanTransport } from "./fan-out-span-transport.js";
|
|
21
|
+
import { RecordingSpanTransport } from "./otel/recording-span-transport.js";
|
|
12
22
|
import { SpanTracker } from "./span-tracker.js";
|
|
13
23
|
import { createOpenRedactionAdapter, isPiiRedactionEnabled, setDefaultPiiRedactor, } from "./redact-pii.js";
|
|
14
24
|
const logger = createLogger("[senpi-core][plugin-span-tracker]");
|
|
25
|
+
/** Parse `SENPI_SPANS_SINK`; unknown/unset → `dual` (the validation default). */
|
|
26
|
+
export function resolveSpanSinkMode(value) {
|
|
27
|
+
const v = value?.trim().toLowerCase();
|
|
28
|
+
if (v === "legacy" || v === "dual" || v === "otel")
|
|
29
|
+
return v;
|
|
30
|
+
return "dual";
|
|
31
|
+
}
|
|
32
|
+
/** Compose the active transport from the two children per the sink mode. */
|
|
33
|
+
export function composeSpanTransport(mode, legacy, recording) {
|
|
34
|
+
switch (mode) {
|
|
35
|
+
case "legacy":
|
|
36
|
+
return legacy;
|
|
37
|
+
case "otel":
|
|
38
|
+
return recording;
|
|
39
|
+
case "dual":
|
|
40
|
+
return new FanOutSpanTransport([legacy, recording]);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
15
43
|
/**
|
|
16
44
|
* Initialize the process-wide default PII redactor when the feature flag is on.
|
|
17
45
|
* Lazy — the OpenRedaction library is only imported when the flag is set, so
|
|
@@ -36,13 +64,22 @@ function initPiiRedactor() {
|
|
|
36
64
|
}
|
|
37
65
|
export function createPluginSpanTracker(apiKey) {
|
|
38
66
|
initPiiRedactor();
|
|
67
|
+
if (!apiKey) {
|
|
68
|
+
logger.warn("span telemetry disabled: set SENPI_API_KEY (or pass apiKey) so spans reach senpi-agent-telemetry; NoOpSpanTransport drops spans");
|
|
69
|
+
return new SpanTracker({ transport: new NoOpSpanTransport() });
|
|
70
|
+
}
|
|
71
|
+
const mode = resolveSpanSinkMode(process.env.SENPI_SPANS_SINK);
|
|
39
72
|
const trackingBaseUrl = process.env.SENPI_TRACKING_URL ?? TRACKING_API_BASE_URL;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
73
|
+
// Build only the children the mode needs; the unused side is a cheap NoOp.
|
|
74
|
+
const legacy = mode === "otel"
|
|
75
|
+
? new NoOpSpanTransport()
|
|
76
|
+
: new BatchingSpanTransport({ baseUrl: trackingBaseUrl, apiKey });
|
|
77
|
+
const recording = mode === "legacy"
|
|
78
|
+
? new NoOpSpanTransport()
|
|
79
|
+
: new RecordingSpanTransport({
|
|
80
|
+
batcher: createBatcher(resolveTransportConfig({ getToken: () => apiKey })),
|
|
81
|
+
});
|
|
82
|
+
logger.info("span sink mode", { mode });
|
|
83
|
+
return new SpanTracker({ transport: composeSpanTransport(mode, legacy, recording) });
|
|
47
84
|
}
|
|
48
85
|
//# sourceMappingURL=plugin-span-tracker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-span-tracker.js","sourceRoot":"","sources":["../../../src/tracking/spans/plugin-span-tracker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"plugin-span-tracker.js","sourceRoot":"","sources":["../../../src/tracking/spans/plugin-span-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { TrackingSpan, SpanTransport } from "./types.js";
|
|
7
7
|
import { type PiiRedactor } from "./redact-pii.js";
|
|
8
|
+
/**
|
|
9
|
+
* Replace any top-level `data` field whose serialized size exceeds
|
|
10
|
+
* MAX_SPAN_FIELD_BYTES with a marker that preserves a short preview and the
|
|
11
|
+
* original size. Avoids 413s at the ingest server from large tool outputs.
|
|
12
|
+
*/
|
|
13
|
+
export declare function truncateSpanData(span: TrackingSpan): TrackingSpan;
|
|
8
14
|
export interface BatchingSpanTransportOptions {
|
|
9
15
|
baseUrl: string;
|
|
10
16
|
apiKey: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span-transport.d.ts","sourceRoot":"","sources":["../../../src/tracking/spans/span-transport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAW9D,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"span-transport.d.ts","sourceRoot":"","sources":["../../../src/tracking/spans/span-transport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAW9D,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;AAIzB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAuCjE;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAClC;AAED,qBAAa,qBAAsB,YAAW,aAAa;IACzD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAiC;gBAEzD,OAAO,EAAE,4BAA4B;IAiBjD,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAW3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmEtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB/B,OAAO,CAAC,QAAQ;IAQhB;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;CAkBlB;AAcD,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IACtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAChC"}
|
|
@@ -12,7 +12,7 @@ const logger = createLogger("[senpi-core][span-transport]");
|
|
|
12
12
|
* MAX_SPAN_FIELD_BYTES with a marker that preserves a short preview and the
|
|
13
13
|
* original size. Avoids 413s at the ingest server from large tool outputs.
|
|
14
14
|
*/
|
|
15
|
-
function truncateSpanData(span) {
|
|
15
|
+
export function truncateSpanData(span) {
|
|
16
16
|
if (!span.data || typeof span.data !== "object")
|
|
17
17
|
return span;
|
|
18
18
|
let mutated = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span-transport.js","sourceRoot":"","sources":["../../../src/tracking/spans/span-transport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAEL,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAE5D;;;;GAIG;AACH,
|
|
1
|
+
{"version":3,"file":"span-transport.js","sourceRoot":"","sources":["../../../src/tracking/spans/span-transport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED