@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.
@@ -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 {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
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.0",
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": {