@aws/durable-execution-sdk-js-otel 0.0.1 → 0.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/index.mjs ADDED
@@ -0,0 +1,517 @@
1
+ import { trace, context, SpanStatusCode } from '@opentelemetry/api';
2
+ import { AwsInstrumentation } from '@opentelemetry/instrumentation-aws-sdk';
3
+ import { registerInstrumentations } from '@opentelemetry/instrumentation';
4
+ import { createHash } from 'node:crypto';
5
+
6
+ /**
7
+ * A custom OpenTelemetry IdGenerator that produces deterministic trace and span IDs
8
+ * derived from execution metadata (X-Ray headers, execution ARNs, operation IDs)
9
+ * rather than random values.
10
+ *
11
+ * This ensures that spans from different Lambda invocations of the same durable
12
+ * execution are stitched into a single coherent trace.
13
+ */
14
+ class DeterministicIdGenerator {
15
+ traceId;
16
+ nextSpanId;
17
+ /**
18
+ * Set the trace ID for all subsequent generateTraceId() calls.
19
+ * This is persistent until setTraceId is called again.
20
+ */
21
+ setTraceId(traceId) {
22
+ this.traceId = traceId;
23
+ }
24
+ /**
25
+ * Set the span ID to return on the next single generateSpanId() call.
26
+ * This is a one-shot override: it is consumed on the next call and then
27
+ * reverts to default behavior.
28
+ */
29
+ setNextSpanId(spanId) {
30
+ this.nextSpanId = spanId;
31
+ }
32
+ /**
33
+ * Generate a 32-char lowercase hex trace ID.
34
+ *
35
+ * If setTraceId has been called, returns that value persistently.
36
+ * Otherwise returns a random 32-char hex string as fallback.
37
+ */
38
+ generateTraceId() {
39
+ if (this.traceId) {
40
+ return this.traceId;
41
+ }
42
+ // Fallback: generate a random trace ID
43
+ return createHash("sha256")
44
+ .update(Math.random().toString())
45
+ .digest("hex")
46
+ .slice(0, 32);
47
+ }
48
+ /**
49
+ * Generate a 16-char lowercase hex span ID.
50
+ *
51
+ * If setNextSpanId has been called, returns that value once (one-shot)
52
+ * and then clears it. Otherwise returns a random 16-char hex string.
53
+ */
54
+ generateSpanId() {
55
+ if (this.nextSpanId) {
56
+ const spanId = this.nextSpanId;
57
+ this.nextSpanId = undefined;
58
+ return spanId;
59
+ }
60
+ // Fallback: generate a random span ID
61
+ return createHash("sha256")
62
+ .update(Math.random().toString())
63
+ .digest("hex")
64
+ .slice(0, 16);
65
+ }
66
+ }
67
+ /**
68
+ * Derive a deterministic trace ID from an X-Ray Root field.
69
+ * Strips the `Root=1-` prefix and all `-` separators to produce
70
+ * a valid 32-character lowercase hex OpenTelemetry trace ID.
71
+ *
72
+ * @param xRayRoot - The Root field value, e.g. "1-5759e988-bd862e3fe1be46a994272793"
73
+ * @returns A 32-char lowercase hex string, or undefined if the input is invalid
74
+ */
75
+ function deriveTraceIdFromXRayRoot(xRayRoot) {
76
+ // Strip "Root=" prefix if present
77
+ let root = xRayRoot;
78
+ if (root.startsWith("Root=")) {
79
+ root = root.slice(5);
80
+ }
81
+ // Strip the version prefix "1-"
82
+ if (root.startsWith("1-")) {
83
+ root = root.slice(2);
84
+ }
85
+ else {
86
+ return undefined;
87
+ }
88
+ // Remove all dashes
89
+ const hex = root.replace(/-/g, "");
90
+ // Validate: must be exactly 32 lowercase hex characters
91
+ if (hex.length !== 32 || !/^[0-9a-f]{32}$/.test(hex)) {
92
+ return undefined;
93
+ }
94
+ return hex;
95
+ }
96
+ /**
97
+ * Derive a deterministic trace ID from an execution ARN by hashing it
98
+ * with SHA-256 and truncating to the first 32 lowercase hex characters.
99
+ *
100
+ * @param executionArn - The execution ARN string
101
+ * @returns A 32-char lowercase hex string
102
+ */
103
+ function deriveTraceIdFromArn(executionArn) {
104
+ return createHash("sha256").update(executionArn).digest("hex").slice(0, 32);
105
+ }
106
+ /**
107
+ * Derive a deterministic span ID from an operation ID by hashing it
108
+ * with SHA-256 and truncating to the first 16 lowercase hex characters.
109
+ *
110
+ * @param operationId - The operation ID string
111
+ * @returns A 16-char lowercase hex string
112
+ */
113
+ function deriveSpanIdFromOperationId(operationId) {
114
+ return createHash("sha256").update(operationId).digest("hex").slice(0, 16);
115
+ }
116
+
117
+ /**
118
+ * Reads the X-Ray trace header from the `_X_AMZN_TRACE_ID` environment variable.
119
+ *
120
+ * The durable execution backend propagates the same Root trace ID to every
121
+ * invocation, so all invocations of the same execution share one traceId.
122
+ *
123
+ * X-Ray Header format:
124
+ * Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1
125
+ *
126
+ * - Extract Root value, strip "1-" prefix and all "-" to get 32-char hex traceId
127
+ * - Extract Parent value for parentSpanId (16-char hex)
128
+ *
129
+ * Returns undefined when _X_AMZN_TRACE_ID is missing or malformed.
130
+ */
131
+ function xRayContextExtractor(_info) {
132
+ const header = process.env._X_AMZN_TRACE_ID;
133
+ if (!header) {
134
+ return undefined;
135
+ }
136
+ // Parse the header into key-value pairs separated by semicolons
137
+ const fields = new Map();
138
+ for (const part of header.split(";")) {
139
+ const eqIdx = part.indexOf("=");
140
+ if (eqIdx > 0) {
141
+ const key = part.slice(0, eqIdx).trim();
142
+ const value = part.slice(eqIdx + 1).trim();
143
+ fields.set(key, value);
144
+ }
145
+ }
146
+ const root = fields.get("Root");
147
+ if (!root) {
148
+ return undefined;
149
+ }
150
+ // Root format: 1-5759e988-bd862e3fe1be46a994272793
151
+ // Strip the "1-" prefix and remove all dashes to get 32-char hex
152
+ const rootValue = root.startsWith("1-") ? root.slice(2) : root;
153
+ const traceId = rootValue.replace(/-/g, "").toLowerCase();
154
+ // Validate: must be exactly 32 hex characters
155
+ if (!/^[0-9a-f]{32}$/.test(traceId)) {
156
+ return undefined;
157
+ }
158
+ const parent = fields.get("Parent");
159
+ let parentSpanId;
160
+ if (parent && /^[0-9a-f]{16}$/.test(parent.toLowerCase())) {
161
+ parentSpanId = parent.toLowerCase();
162
+ }
163
+ return { traceId, parentSpanId };
164
+ }
165
+ /**
166
+ * Reads W3C traceparent from `context.clientContext.custom.traceparent`.
167
+ *
168
+ * W3C traceparent format:
169
+ * 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
170
+ * Format: version-traceId-parentId-traceFlags
171
+ *
172
+ * - traceId is 32 hex chars
173
+ * - parentId is 16 hex chars
174
+ * - flags is 2 hex chars (parsed to number)
175
+ *
176
+ * Returns undefined when clientContext or traceparent is missing or malformed.
177
+ */
178
+ function w3cClientContextExtractor(info) {
179
+ const extendedInfo = info;
180
+ const traceparent = extendedInfo.context?.clientContext?.custom?.traceparent;
181
+ if (!traceparent) {
182
+ return undefined;
183
+ }
184
+ return parseW3CTraceparent(traceparent);
185
+ }
186
+ /**
187
+ * Parses a W3C traceparent header value.
188
+ *
189
+ * Format: version-traceId-parentId-flags
190
+ * Example: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
191
+ */
192
+ function parseW3CTraceparent(traceparent) {
193
+ const parts = traceparent.split("-");
194
+ // Must have exactly 4 parts: version, traceId, parentId, flags
195
+ if (parts.length !== 4) {
196
+ return undefined;
197
+ }
198
+ const [version, traceId, parentId, flags] = parts;
199
+ // Version must be 2 hex chars
200
+ if (!/^[0-9a-f]{2}$/.test(version)) {
201
+ return undefined;
202
+ }
203
+ // TraceId must be 32 hex chars
204
+ if (!/^[0-9a-f]{32}$/.test(traceId)) {
205
+ return undefined;
206
+ }
207
+ // ParentId must be 16 hex chars
208
+ if (!/^[0-9a-f]{16}$/.test(parentId)) {
209
+ return undefined;
210
+ }
211
+ // Flags must be 2 hex chars
212
+ if (!/^[0-9a-f]{2}$/.test(flags)) {
213
+ return undefined;
214
+ }
215
+ const traceFlags = parseInt(flags, 16);
216
+ return {
217
+ traceId,
218
+ parentSpanId: parentId,
219
+ traceFlags,
220
+ };
221
+ }
222
+
223
+ const DEFAULT_INSTRUMENTATION_NAME = "aws-durable-execution-sdk-js";
224
+ /**
225
+ * OpenTelemetry instrumentation plugin for durable executions.
226
+ *
227
+ * Implements the DurableInstrumentationPlugin interface to emit distributed
228
+ * traces that correlate across multiple Lambda invocations of a single
229
+ * durable execution.
230
+ */
231
+ class DurableExecutionOtelPlugin {
232
+ tracerProvider;
233
+ tracer;
234
+ idGenerator;
235
+ contextExtractor;
236
+ // Per-invocation state
237
+ spanMap = new Map();
238
+ spanStack = [];
239
+ invocationSpan;
240
+ executionArn = "";
241
+ attemptSpan;
242
+ constructor(config) {
243
+ const instrumentationName = config?.instrumentationName ?? DEFAULT_INSTRUMENTATION_NAME;
244
+ this.idGenerator = new DeterministicIdGenerator();
245
+ this.contextExtractor = config?.contextExtractor ?? xRayContextExtractor;
246
+ if (config?.tracerProvider) {
247
+ this.tracerProvider = config.tracerProvider;
248
+ }
249
+ else {
250
+ this.tracerProvider = trace.getTracerProvider();
251
+ registerInstrumentations({
252
+ tracerProvider: this.tracerProvider,
253
+ instrumentations: [
254
+ new AwsInstrumentation({
255
+ suppressInternalInstrumentation: true,
256
+ sqsExtractContextPropagationFromPayload: true,
257
+ }),
258
+ ],
259
+ });
260
+ }
261
+ this.tracer = this.tracerProvider.getTracer(instrumentationName);
262
+ // Monkey-patch the tracer's ID generator so spans use deterministic IDs.
263
+ // The _idGenerator field is internal to @opentelemetry/sdk-trace-base's Tracer class.
264
+ this.tracer._idGenerator = this.idGenerator;
265
+ }
266
+ async onInvocationStart(info) {
267
+ // 1. Store the execution ARN
268
+ this.executionArn = info.executionArn;
269
+ // 2. Invoke the context extractor
270
+ const extractedContext = this.contextExtractor(info);
271
+ // 3. Set the trace ID on the ID generator
272
+ if (extractedContext?.traceId) {
273
+ this.idGenerator.setTraceId(extractedContext.traceId);
274
+ }
275
+ else {
276
+ // Fallback: derive trace ID from ARN
277
+ const derivedId = deriveTraceIdFromArn(info.executionArn);
278
+ this.idGenerator.setTraceId(derivedId);
279
+ }
280
+ // 4. Create the invocation span
281
+ this.invocationSpan = this.tracer.startSpan("invocation", {
282
+ attributes: {
283
+ "durable.execution.arn": info.executionArn,
284
+ },
285
+ });
286
+ }
287
+ wrapInvocation(_info, fn) {
288
+ if (!this.invocationSpan) {
289
+ return fn();
290
+ }
291
+ return context.with(trace.setSpan(context.active(), this.invocationSpan), fn);
292
+ }
293
+ async onInvocationEnd(_info) {
294
+ // 1. End all spans in the stack in reverse order
295
+ while (this.spanStack.length > 0) {
296
+ const span = this.spanStack.pop();
297
+ span.end();
298
+ }
299
+ // 2. End the invocation span if it exists
300
+ if (this.invocationSpan) {
301
+ this.invocationSpan.end();
302
+ }
303
+ // 3. Force flush the tracer provider
304
+ if ("forceFlush" in this.tracerProvider) {
305
+ try {
306
+ await this.tracerProvider.forceFlush();
307
+ }
308
+ catch {
309
+ // Gracefully handle flush errors
310
+ }
311
+ }
312
+ // 4. Clear all per-invocation state
313
+ this.spanMap.clear();
314
+ this.spanStack = [];
315
+ this.invocationSpan = undefined;
316
+ this.executionArn = "";
317
+ this.attemptSpan = undefined;
318
+ }
319
+ async onOperationStart(info) {
320
+ const deterministicSpanId = deriveSpanIdFromOperationId(info.id);
321
+ const spanName = info.name ?? info.type;
322
+ // Resolve parent span: use parentId from map, or fall back to invocation span
323
+ let parentSpan;
324
+ if (info.parentId && this.spanMap.has(info.parentId)) {
325
+ parentSpan = this.spanMap.get(info.parentId);
326
+ }
327
+ else {
328
+ parentSpan = this.invocationSpan;
329
+ }
330
+ const parentContext = parentSpan
331
+ ? trace.setSpan(context.active(), parentSpan)
332
+ : context.active();
333
+ const attributes = {
334
+ "durable.execution.arn": this.executionArn,
335
+ "durable.operation.id": info.id,
336
+ "durable.operation.type": info.type,
337
+ };
338
+ if (info.name) {
339
+ attributes["durable.operation.name"] = info.name;
340
+ }
341
+ let span;
342
+ if (!info.isReplay) {
343
+ // Non-replay: use deterministic span ID
344
+ this.idGenerator.setNextSpanId(deterministicSpanId);
345
+ span = this.tracer.startSpan(spanName, {
346
+ attributes,
347
+ startTime: info.startTimestamp,
348
+ }, parentContext);
349
+ }
350
+ else if (info.type === "CONTEXT" || info.type === "STEP") {
351
+ // Replay: use random span ID, add Link to deterministic span
352
+ const traceId = this.invocationSpan?.spanContext().traceId ??
353
+ this.idGenerator.generateTraceId();
354
+ span = this.tracer.startSpan(spanName, {
355
+ attributes,
356
+ startTime: info.startTimestamp,
357
+ links: [
358
+ {
359
+ context: { traceId, spanId: deterministicSpanId, traceFlags: 1 },
360
+ },
361
+ ],
362
+ }, parentContext);
363
+ }
364
+ // Push to map and stack
365
+ if (span != undefined) {
366
+ this.spanMap.set(info.id, span);
367
+ this.spanStack.push(span);
368
+ }
369
+ }
370
+ wrapChildContextFn(info, fn) {
371
+ const span = this.spanMap.get(info.id);
372
+ if (!span) {
373
+ return fn();
374
+ }
375
+ return context.with(trace.setSpan(context.active(), span), fn);
376
+ }
377
+ async onOperationEnd(info) {
378
+ // Skip span creation for WAIT, INVOKE, CHAINED_INVOKE, and CALLBACK operations on replay
379
+ if (info.isReplay &&
380
+ (info.type === "WAIT" ||
381
+ info.type === "INVOKE" ||
382
+ info.type === "CHAINED_INVOKE" ||
383
+ info.type === "CALLBACK")) {
384
+ return;
385
+ }
386
+ const deterministicSpanId = deriveSpanIdFromOperationId(info.id);
387
+ if (this.spanMap.has(info.id)) {
388
+ // Operation was started in this invocation
389
+ const span = this.spanMap.get(info.id);
390
+ // Record error if present
391
+ if (info.error) {
392
+ span.setStatus({
393
+ code: SpanStatusCode.ERROR,
394
+ message: info.error.message,
395
+ });
396
+ span.recordException(info.error);
397
+ }
398
+ // End the span
399
+ span.end(info.endTimestamp);
400
+ // Remove from map
401
+ this.spanMap.delete(info.id);
402
+ // Remove from stack (find by reference)
403
+ const stackIndex = this.spanStack.indexOf(span);
404
+ if (stackIndex !== -1) {
405
+ this.spanStack.splice(stackIndex, 1);
406
+ }
407
+ }
408
+ else if (!info.isReplay) {
409
+ // Operation was started in a prior invocation — create Continuation_Span
410
+ const spanName = info.name ?? info.type;
411
+ const traceId = this.invocationSpan?.spanContext().traceId ??
412
+ this.idGenerator.generateTraceId();
413
+ const parentContext = this.invocationSpan
414
+ ? trace.setSpan(context.active(), this.invocationSpan)
415
+ : context.active();
416
+ const attributes = {
417
+ "durable.execution.arn": this.executionArn,
418
+ "durable.operation.id": info.id,
419
+ "durable.operation.type": info.type,
420
+ };
421
+ if (info.name) {
422
+ attributes["durable.operation.name"] = info.name;
423
+ }
424
+ const continuationSpan = this.tracer.startSpan(spanName, {
425
+ attributes,
426
+ startTime: info.startTimestamp,
427
+ links: [
428
+ {
429
+ context: { traceId, spanId: deterministicSpanId, traceFlags: 1 },
430
+ },
431
+ ],
432
+ }, parentContext);
433
+ // Record error if present
434
+ if (info.error) {
435
+ continuationSpan.setStatus({
436
+ code: SpanStatusCode.ERROR,
437
+ message: info.error.message,
438
+ });
439
+ continuationSpan.recordException(info.error);
440
+ }
441
+ // Immediately end
442
+ continuationSpan.end(info.endTimestamp);
443
+ }
444
+ }
445
+ async onOperationAttemptStart(info) {
446
+ const deterministicSpanId = deriveSpanIdFromOperationId(info.id);
447
+ const spanName = info.name ?? info.type;
448
+ // Find the parent Operation_Span for this operation
449
+ const parentSpan = this.spanMap.get(info.id);
450
+ const parentContext = parentSpan
451
+ ? trace.setSpan(context.active(), parentSpan)
452
+ : context.active();
453
+ // Get current trace ID for the link
454
+ const currentTraceId = this.invocationSpan?.spanContext().traceId ??
455
+ this.idGenerator.generateTraceId();
456
+ const attributes = {
457
+ "durable.execution.arn": this.executionArn,
458
+ "durable.operation.id": info.id,
459
+ "durable.operation.type": info.type,
460
+ "durable.operation.attempt": info.attempt,
461
+ };
462
+ if (info.name) {
463
+ attributes["durable.operation.name"] = info.name;
464
+ }
465
+ // Create Attempt_Span as child of Operation_Span with Link to deterministic span
466
+ const attemptSpan = this.tracer.startSpan(spanName, {
467
+ attributes,
468
+ startTime: info.startTimestamp,
469
+ links: [
470
+ {
471
+ context: {
472
+ traceId: currentTraceId,
473
+ spanId: deterministicSpanId,
474
+ traceFlags: 1,
475
+ },
476
+ },
477
+ ],
478
+ }, parentContext);
479
+ this.attemptSpan = attemptSpan;
480
+ }
481
+ wrapOperationAttemptFn(_info, fn) {
482
+ if (!this.attemptSpan) {
483
+ return fn();
484
+ }
485
+ return context.with(trace.setSpan(context.active(), this.attemptSpan), fn);
486
+ }
487
+ async onOperationAttemptEnd(info) {
488
+ if (this.attemptSpan) {
489
+ if (info.error) {
490
+ this.attemptSpan.setStatus({
491
+ code: SpanStatusCode.ERROR,
492
+ message: info.error.message,
493
+ });
494
+ this.attemptSpan.recordException(info.error);
495
+ }
496
+ this.attemptSpan.end(info.endTimestamp);
497
+ this.attemptSpan = undefined;
498
+ }
499
+ }
500
+ async onOperationChange(_info) {
501
+ // No-op for this plugin
502
+ }
503
+ enrichLogContext() {
504
+ const span = trace.getSpan(context.active());
505
+ if (!span) {
506
+ return undefined;
507
+ }
508
+ const spanContext = span.spanContext();
509
+ return {
510
+ traceId: spanContext.traceId,
511
+ spanId: spanContext.spanId,
512
+ };
513
+ }
514
+ }
515
+
516
+ export { DeterministicIdGenerator, DurableExecutionOtelPlugin, deriveSpanIdFromOperationId, deriveTraceIdFromArn, deriveTraceIdFromXRayRoot, w3cClientContextExtractor, xRayContextExtractor };
517
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/deterministic-id-generator.ts","../src/context-extractors.ts","../src/plugin.ts"],"names":[],"mappings":"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"}