@xeonr/upload-pool-sdk 1.3.0 → 1.4.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/job-context.d.ts +19 -1
- package/dist/job-context.d.ts.map +1 -1
- package/dist/job-context.js +231 -140
- package/dist/job-context.js.map +1 -1
- package/dist/pool.d.ts +1 -0
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +107 -39
- package/dist/pool.js.map +1 -1
- package/dist/rpc-clients.d.ts.map +1 -1
- package/dist/rpc-clients.js +139 -28
- package/dist/rpc-clients.js.map +1 -1
- package/dist/tracing.d.ts +107 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +270 -0
- package/dist/tracing.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -1
- package/src/job-context.ts +330 -150
- package/src/pool.ts +143 -48
- package/src/rpc-clients.ts +168 -28
- package/src/tracing.ts +333 -0
- package/src/types.ts +8 -0
package/dist/tracing.js
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry tracing setup for the worker SDK.
|
|
3
|
+
*
|
|
4
|
+
* Spans are exported via OTLP/HTTP-JSON to pipeline-api's `/v1/traces`
|
|
5
|
+
* receiver, authenticated with the pool's queue token. The pipeline-api
|
|
6
|
+
* receiver decodes the OTLP envelope and writes spans to its MySQL trace
|
|
7
|
+
* store, which backs the `/admin/workflow-run` admin UI — so worker
|
|
8
|
+
* callbacks nest naturally under the dispatching parseUpload trace.
|
|
9
|
+
*
|
|
10
|
+
* Design notes (see also: discussion in epic plan):
|
|
11
|
+
* - The TracerProvider is private to the SDK. It does *not* register
|
|
12
|
+
* globally — calling `trace.getTracer(...)` outside the SDK won't pick
|
|
13
|
+
* it up. This avoids interfering with any OTel setup the host
|
|
14
|
+
* application already has (e.g. its own collector → Grafana
|
|
15
|
+
* pipeline). The exporter ships SDK-emitted spans only.
|
|
16
|
+
* - `wf.run_id` is stamped on every emitted span as an attribute,
|
|
17
|
+
* mirrored from the job envelope's `wf_run_id` field. The pipeline-api
|
|
18
|
+
* receiver uses this attribute to associate the span with the right
|
|
19
|
+
* workflow run in `workflow_run_spans`.
|
|
20
|
+
* - The W3C traceparent propagator runs on outbound RPC calls *only when
|
|
21
|
+
* targeting the pipeline endpoint*. The uploads-api side has its own
|
|
22
|
+
* OTel pipeline and we don't want to inject our trace_id into its
|
|
23
|
+
* trees. See the interceptor in rpc-clients.ts.
|
|
24
|
+
*
|
|
25
|
+
* Body sanitization for `rpc.request` / `rpc.response` span events lives
|
|
26
|
+
* in the interceptor — keys matching /(token|secret|password|authorization
|
|
27
|
+
* |api[_-]?key|signature|sig|cookie)/i are redacted; payloads truncated
|
|
28
|
+
* to MAX_BODY_EVENT_BYTES.
|
|
29
|
+
*/
|
|
30
|
+
import { context, trace, SpanKind, SpanStatusCode, } from "@opentelemetry/api";
|
|
31
|
+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
|
|
32
|
+
import { Resource } from "@opentelemetry/resources";
|
|
33
|
+
import { BatchSpanProcessor, BasicTracerProvider, } from "@opentelemetry/sdk-trace-base";
|
|
34
|
+
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION, } from "@opentelemetry/semantic-conventions";
|
|
35
|
+
const TRACER_NAME = "@xeonr/upload-pool-sdk";
|
|
36
|
+
export const SPAN_ATTR = {
|
|
37
|
+
JOB_ID: "iq.job_id",
|
|
38
|
+
UPLOAD_ID: "iq.upload_id",
|
|
39
|
+
URN: "iq.content_type_urn",
|
|
40
|
+
WORKER_ID: "iq.worker_id",
|
|
41
|
+
POOL_TOKEN_PREFIX: "iq.pool_token_prefix",
|
|
42
|
+
// Matches pipeline-api's TRACE_ATTRIBUTE.RUN_ID. The trace-store
|
|
43
|
+
// exporter reads this attribute to associate each span with the
|
|
44
|
+
// right workflow_run in MySQL (workflow_run_spans.run_id). Worker
|
|
45
|
+
// spans MUST carry it or they're dropped on the floor by the
|
|
46
|
+
// pipeline-api receiver.
|
|
47
|
+
RUN_ID: "pipeline.run_id",
|
|
48
|
+
RPC_METHOD: "rpc.method",
|
|
49
|
+
RPC_SERVICE: "rpc.service",
|
|
50
|
+
RPC_TARGET: "rpc.target",
|
|
51
|
+
RPC_CODE: "rpc.code",
|
|
52
|
+
RPC_DURATION_MS: "rpc.duration_ms",
|
|
53
|
+
S3_BYTES: "s3.bytes",
|
|
54
|
+
S3_URL_ORIGIN: "s3.url_origin",
|
|
55
|
+
S3_OUTCOME: "s3.outcome",
|
|
56
|
+
};
|
|
57
|
+
let activeHandle = null;
|
|
58
|
+
export function initTracing(cfg) {
|
|
59
|
+
if (activeHandle) {
|
|
60
|
+
return activeHandle;
|
|
61
|
+
}
|
|
62
|
+
const enabled = cfg.enabled !== false;
|
|
63
|
+
if (!enabled) {
|
|
64
|
+
const tracer = trace.getTracer(TRACER_NAME, cfg.sdkVersion);
|
|
65
|
+
activeHandle = {
|
|
66
|
+
tracer,
|
|
67
|
+
shutdown: async () => { },
|
|
68
|
+
contextFromEnvelope: () => context.active(),
|
|
69
|
+
};
|
|
70
|
+
return activeHandle;
|
|
71
|
+
}
|
|
72
|
+
const resource = new Resource({
|
|
73
|
+
[ATTR_SERVICE_NAME]: TRACER_NAME,
|
|
74
|
+
[ATTR_SERVICE_VERSION]: cfg.sdkVersion,
|
|
75
|
+
[SPAN_ATTR.WORKER_ID]: cfg.workerId,
|
|
76
|
+
});
|
|
77
|
+
// OTLP/HTTP-JSON to pipeline-api's receiver. JSON over protobuf because
|
|
78
|
+
// it lets the receiver decode without pulling in @opentelemetry/
|
|
79
|
+
// otlp-transformer's protobuf runtime — the wire size penalty is fine
|
|
80
|
+
// for the volume the SDK emits (≈10 spans per job, ≈40 KB per job).
|
|
81
|
+
const exporter = new OTLPTraceExporter({
|
|
82
|
+
url: `${cfg.pipelineEndpoint.replace(/\/+$/, "")}/v1/traces`,
|
|
83
|
+
headers: {
|
|
84
|
+
authorization: `Bearer ${cfg.poolToken}`,
|
|
85
|
+
},
|
|
86
|
+
// Generous timeout — pipeline-api's receiver writes through to MySQL
|
|
87
|
+
// synchronously and we'd rather hold the export than drop a span on
|
|
88
|
+
// a slow ack.
|
|
89
|
+
timeoutMillis: 10_000,
|
|
90
|
+
});
|
|
91
|
+
const processor = new BatchSpanProcessor(exporter, {
|
|
92
|
+
// Default batch settings keep us flushing every 5s or 512 spans.
|
|
93
|
+
// We prefer faster flushes for the per-job RPC use case so the
|
|
94
|
+
// admin UI sees the latest activity within a couple seconds.
|
|
95
|
+
scheduledDelayMillis: 1_000,
|
|
96
|
+
maxQueueSize: 1024,
|
|
97
|
+
maxExportBatchSize: 128,
|
|
98
|
+
});
|
|
99
|
+
const provider = new BasicTracerProvider({
|
|
100
|
+
resource,
|
|
101
|
+
spanProcessors: [processor],
|
|
102
|
+
});
|
|
103
|
+
const tracer = provider.getTracer(TRACER_NAME, cfg.sdkVersion);
|
|
104
|
+
const handle = {
|
|
105
|
+
tracer,
|
|
106
|
+
shutdown: async () => {
|
|
107
|
+
try {
|
|
108
|
+
await provider.shutdown();
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Worker exit is best-effort — never block on export.
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
contextFromEnvelope: (traceparent, runId) => {
|
|
115
|
+
let ctx = context.active();
|
|
116
|
+
// Ensure every span produced under this context carries the
|
|
117
|
+
// runId attribute via baggage-like behaviour. We stamp it on
|
|
118
|
+
// each span at creation site instead of relying on baggage
|
|
119
|
+
// because the trace store reads it from span attributes.
|
|
120
|
+
if (!traceparent) {
|
|
121
|
+
return ctx;
|
|
122
|
+
}
|
|
123
|
+
const parsed = parseTraceparent(traceparent);
|
|
124
|
+
if (!parsed) {
|
|
125
|
+
return ctx;
|
|
126
|
+
}
|
|
127
|
+
ctx = trace.setSpanContext(ctx, parsed);
|
|
128
|
+
// runId is consumed by the caller and stamped explicitly on
|
|
129
|
+
// each span via stampJobAttributes(); we don't store it in
|
|
130
|
+
// the OTel context because there's no cross-span attribute
|
|
131
|
+
// mechanism in OTel without using a custom propagator.
|
|
132
|
+
void runId;
|
|
133
|
+
return ctx;
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
activeHandle = handle;
|
|
137
|
+
return handle;
|
|
138
|
+
}
|
|
139
|
+
export function getTracingHandle() {
|
|
140
|
+
return activeHandle;
|
|
141
|
+
}
|
|
142
|
+
export async function shutdownTracing() {
|
|
143
|
+
if (activeHandle) {
|
|
144
|
+
await activeHandle.shutdown();
|
|
145
|
+
activeHandle = null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// --- traceparent helpers --------------------------------------------------
|
|
149
|
+
/**
|
|
150
|
+
* Parse a W3C `traceparent` header into an OTel SpanContext.
|
|
151
|
+
*
|
|
152
|
+
* Format: `00-<32 hex trace id>-<16 hex span id>-<2 hex flags>`. Returns
|
|
153
|
+
* null on malformed input. Used by the SDK to root iq.job spans under
|
|
154
|
+
* whatever pipeline activity dispatched the job.
|
|
155
|
+
*/
|
|
156
|
+
export function parseTraceparent(value) {
|
|
157
|
+
if (!value)
|
|
158
|
+
return null;
|
|
159
|
+
const parts = value.trim().split("-");
|
|
160
|
+
if (parts.length !== 4)
|
|
161
|
+
return null;
|
|
162
|
+
const [version, traceId, spanId, flagsHex] = parts;
|
|
163
|
+
if (version !== "00")
|
|
164
|
+
return null;
|
|
165
|
+
if (!/^[0-9a-f]{32}$/.test(traceId))
|
|
166
|
+
return null;
|
|
167
|
+
if (!/^[0-9a-f]{16}$/.test(spanId))
|
|
168
|
+
return null;
|
|
169
|
+
if (!/^[0-9a-f]{2}$/.test(flagsHex))
|
|
170
|
+
return null;
|
|
171
|
+
const flags = Number.parseInt(flagsHex, 16);
|
|
172
|
+
return {
|
|
173
|
+
traceId,
|
|
174
|
+
spanId,
|
|
175
|
+
traceFlags: flags,
|
|
176
|
+
isRemote: true,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Serialise a SpanContext as a W3C traceparent header value.
|
|
181
|
+
*/
|
|
182
|
+
export function spanContextToTraceparent(sc) {
|
|
183
|
+
const flags = sc.traceFlags.toString(16).padStart(2, "0");
|
|
184
|
+
return `00-${sc.traceId}-${sc.spanId}-${flags}`;
|
|
185
|
+
}
|
|
186
|
+
// --- body sanitization (req/resp on RPC span events) ----------------------
|
|
187
|
+
const MAX_BODY_EVENT_BYTES = 4 * 1024;
|
|
188
|
+
const REDACTED_KEY_PATTERN = /(token|secret|password|authorization|api[_-]?key|signature|^sig$|cookie)/i;
|
|
189
|
+
const REDACTED_VALUE = "<redacted>";
|
|
190
|
+
/**
|
|
191
|
+
* Sanitize an arbitrary RPC request/response object for inclusion as a
|
|
192
|
+
* span event attribute. Same shape as the pipeline-api's tracing/sanitize
|
|
193
|
+
* (4 KB cap, key-pattern redaction) so the two ends produce consistent
|
|
194
|
+
* payloads in the admin UI.
|
|
195
|
+
*/
|
|
196
|
+
export function sanitizeRpcBody(value) {
|
|
197
|
+
try {
|
|
198
|
+
const cloned = redactDeep(value, 0);
|
|
199
|
+
const serialised = JSON.stringify(cloned);
|
|
200
|
+
if (serialised.length <= MAX_BODY_EVENT_BYTES) {
|
|
201
|
+
return serialised;
|
|
202
|
+
}
|
|
203
|
+
return `${serialised.slice(0, MAX_BODY_EVENT_BYTES)}...<truncated>`;
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return "<unserialisable>";
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function redactDeep(value, depth) {
|
|
210
|
+
if (depth > 6)
|
|
211
|
+
return "<max-depth>";
|
|
212
|
+
if (value === null || value === undefined)
|
|
213
|
+
return value;
|
|
214
|
+
if (value instanceof Uint8Array) {
|
|
215
|
+
return `<bytes:${value.byteLength}>`;
|
|
216
|
+
}
|
|
217
|
+
if (Array.isArray(value)) {
|
|
218
|
+
return value.slice(0, 50).map((v) => redactDeep(v, depth + 1));
|
|
219
|
+
}
|
|
220
|
+
if (typeof value === "object") {
|
|
221
|
+
const out = {};
|
|
222
|
+
const obj = value;
|
|
223
|
+
const keys = Object.keys(obj).slice(0, 50);
|
|
224
|
+
for (const k of keys) {
|
|
225
|
+
if (REDACTED_KEY_PATTERN.test(k)) {
|
|
226
|
+
out[k] = REDACTED_VALUE;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
out[k] = redactDeep(obj[k], depth + 1);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return out;
|
|
233
|
+
}
|
|
234
|
+
if (typeof value === "string") {
|
|
235
|
+
// Heuristic: very long strings are likely embedded payloads; clamp.
|
|
236
|
+
return value.length > 1024 ? `${value.slice(0, 1024)}...` : value;
|
|
237
|
+
}
|
|
238
|
+
return value;
|
|
239
|
+
}
|
|
240
|
+
// --- span helpers --------------------------------------------------------
|
|
241
|
+
/**
|
|
242
|
+
* Set common job-scoped attributes on a span. Called by every site that
|
|
243
|
+
* creates a per-job span so RUN_ID / JOB_ID / UPLOAD_ID / URN are
|
|
244
|
+
* consistently present (the exporter requires `wf.run_id` to route the
|
|
245
|
+
* span into the right workflow run).
|
|
246
|
+
*/
|
|
247
|
+
export function stampJobAttributes(span, attrs) {
|
|
248
|
+
span.setAttribute(SPAN_ATTR.RUN_ID, attrs.runId);
|
|
249
|
+
span.setAttribute(SPAN_ATTR.JOB_ID, attrs.jobId);
|
|
250
|
+
if (attrs.uploadId) {
|
|
251
|
+
span.setAttribute(SPAN_ATTR.UPLOAD_ID, attrs.uploadId);
|
|
252
|
+
}
|
|
253
|
+
if (attrs.urn) {
|
|
254
|
+
span.setAttribute(SPAN_ATTR.URN, attrs.urn);
|
|
255
|
+
}
|
|
256
|
+
if (attrs.workerId) {
|
|
257
|
+
span.setAttribute(SPAN_ATTR.WORKER_ID, attrs.workerId);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
export function recordSpanError(span, err) {
|
|
261
|
+
if (err instanceof Error) {
|
|
262
|
+
span.recordException(err);
|
|
263
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
export { SpanKind, SpanStatusCode };
|
|
270
|
+
//# sourceMappingURL=tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -59,6 +59,14 @@ export interface PoolConfig {
|
|
|
59
59
|
logger?: import("./logger.js").Logger;
|
|
60
60
|
/** Max concurrent in-flight jobs. Defaults to 1. */
|
|
61
61
|
concurrency?: number;
|
|
62
|
+
/**
|
|
63
|
+
* Tracing config. The SDK ships spans to pipeline-api's /v1/traces
|
|
64
|
+
* receiver for the admin UI. Disable with `{ enabled: false }` to
|
|
65
|
+
* skip the OTel SDK setup entirely (e.g. in tests).
|
|
66
|
+
*/
|
|
67
|
+
tracing?: {
|
|
68
|
+
enabled?: boolean;
|
|
69
|
+
};
|
|
62
70
|
}
|
|
63
71
|
export type JobHandler = (ctx: JobContext) => Promise<void>;
|
|
64
72
|
export interface JobContext {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,UAAU;IAC1B,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,6EAA6E;IAC7E,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACjD;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,aAAa,EAAE,MAAM,CAAC;IACtC,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xeonr/upload-pool-sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Self-hosted worker SDK for the upl.im content type pipeline. Implement a handler per content type URN; the SDK handles SSE connection, job acceptance, presigned thumbnail upload, and metadata callbacks.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -20,6 +20,13 @@
|
|
|
20
20
|
"@bufbuild/protobuf": "^2.10.1",
|
|
21
21
|
"@connectrpc/connect": "^2.0.0",
|
|
22
22
|
"@connectrpc/connect-node": "^2.0.0",
|
|
23
|
+
"@opentelemetry/api": "^1.9.0",
|
|
24
|
+
"@opentelemetry/core": "^1.30.0",
|
|
25
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.57.0",
|
|
26
|
+
"@opentelemetry/resources": "^1.30.0",
|
|
27
|
+
"@opentelemetry/sdk-trace-base": "^1.30.0",
|
|
28
|
+
"@opentelemetry/sdk-trace-node": "^1.30.0",
|
|
29
|
+
"@opentelemetry/semantic-conventions": "^1.28.0",
|
|
23
30
|
"eventsource": "^3.0.0"
|
|
24
31
|
},
|
|
25
32
|
"devDependencies": {
|