@volontariapp/database 3.7.0 → 3.8.0-snap-1ed0a4f

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Restore the trace context of an asynchronous step. `BaseWorker.process`, `SinglePostProcessor` and `BatchPostProcessor` now extract the `traceparent` carried by the job or the event and run the handler in a child span (`job <type>` / `event <type>`, attributes `type`, `emitter`, `correlation_id`). A batch gets one span per message, in the trace of its own message, plus a batch span linked to them. Adds `runInTraceContext` and `runBatchInTraceContext` to `@volontariapp/database`. A message without a `traceparent` starts a new trace.
8
+
3
9
  ## 3.7.0
4
10
 
5
11
  ### Minor Changes
@@ -1,2 +1,3 @@
1
1
  export * from './capture-traceparent.js';
2
+ export * from './run-in-trace-context.js';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/outbox/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/outbox/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export * from './capture-traceparent.js';
2
+ export * from './run-in-trace-context.js';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/outbox/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/outbox/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type Attributes } from '@opentelemetry/api';
2
+ export interface TraceScope {
3
+ traceparent?: string | null;
4
+ name: string;
5
+ attributes?: Attributes;
6
+ }
7
+ export declare function runInTraceContext<T>(scope: TraceScope, fn: () => Promise<T>): Promise<T>;
8
+ export declare function runBatchInTraceContext<T>(batchName: string, scopes: TraceScope[], fn: () => Promise<T>): Promise<T>;
9
+ //# sourceMappingURL=run-in-trace-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-in-trace-context.d.ts","sourceRoot":"","sources":["../../../src/outbox/utils/run-in-trace-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EAIhB,MAAM,oBAAoB,CAAC;AAK5B,MAAM,WAAW,UAAU;IAEzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AA2BD,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAc9F;AASD,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,EAAE,EACpB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CA6BZ"}
@@ -0,0 +1,57 @@
1
+ import { SpanKind, SpanStatusCode, context, propagation, trace, } from '@opentelemetry/api';
2
+ import { normalizeTraceparent } from './capture-traceparent.js';
3
+ const TRACER_NAME = '@volontariapp/async';
4
+ function parentContext(traceparent) {
5
+ const value = normalizeTraceparent(traceparent);
6
+ if (value === undefined) {
7
+ return context.active();
8
+ }
9
+ return propagation.extract(context.active(), { traceparent: value });
10
+ }
11
+ function markFailed(span, error) {
12
+ const failure = error instanceof Error ? error : new Error(String(error));
13
+ span.recordException(failure);
14
+ span.setStatus({ code: SpanStatusCode.ERROR, message: failure.message });
15
+ }
16
+ export async function runInTraceContext(scope, fn) {
17
+ const parent = parentContext(scope.traceparent);
18
+ const span = trace
19
+ .getTracer(TRACER_NAME)
20
+ .startSpan(scope.name, { kind: SpanKind.CONSUMER, attributes: scope.attributes }, parent);
21
+ try {
22
+ return await context.with(trace.setSpan(parent, span), fn);
23
+ }
24
+ catch (error) {
25
+ markFailed(span, error);
26
+ throw error;
27
+ }
28
+ finally {
29
+ span.end();
30
+ }
31
+ }
32
+ export async function runBatchInTraceContext(batchName, scopes, fn) {
33
+ const tracer = trace.getTracer(TRACER_NAME);
34
+ const messageSpans = scopes.map((scope) => tracer.startSpan(scope.name, { kind: SpanKind.CONSUMER, attributes: scope.attributes }, parentContext(scope.traceparent)));
35
+ const links = messageSpans.map((span) => ({ context: span.spanContext() }));
36
+ const batchSpan = tracer.startSpan(batchName, {
37
+ kind: SpanKind.CONSUMER,
38
+ attributes: { 'messaging.batch.message_count': scopes.length },
39
+ links,
40
+ });
41
+ const allSpans = [batchSpan, ...messageSpans];
42
+ try {
43
+ return await context.with(trace.setSpan(context.active(), batchSpan), fn);
44
+ }
45
+ catch (error) {
46
+ allSpans.forEach((span) => {
47
+ markFailed(span, error);
48
+ });
49
+ throw error;
50
+ }
51
+ finally {
52
+ allSpans.forEach((span) => {
53
+ span.end();
54
+ });
55
+ }
56
+ }
57
+ //# sourceMappingURL=run-in-trace-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-in-trace-context.js","sourceRoot":"","sources":["../../../src/outbox/utils/run-in-trace-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run-in-trace-context.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-in-trace-context.unit.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/entities/run-in-trace-context.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,122 @@
1
+ import { afterAll, afterEach, beforeAll, describe, expect, it } from '@jest/globals';
2
+ import { SpanKind, SpanStatusCode, context, propagation, trace } from '@opentelemetry/api';
3
+ import { InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
4
+ import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
5
+ import { runBatchInTraceContext, runInTraceContext, } from '../../../outbox/utils/run-in-trace-context.js';
6
+ import { captureTraceparent } from '../../../outbox/utils/capture-traceparent.js';
7
+ import { SAMPLED_TRACEPARENT, SPAN_ID_HEX, TRACE_ID_HEX } from './span-context.factory.js';
8
+ const OTHER_TRACE_ID_HEX = '4bf92f3577b34da6a3ce929d0e0e4736';
9
+ const OTHER_SPAN_ID_HEX = '00f067aa0ba902b7';
10
+ const OTHER_TRACEPARENT = `00-${OTHER_TRACE_ID_HEX}-${OTHER_SPAN_ID_HEX}-01`;
11
+ describe('runInTraceContext (Unit)', () => {
12
+ const exporter = new InMemorySpanExporter();
13
+ const provider = new NodeTracerProvider({ spanProcessors: [new SimpleSpanProcessor(exporter)] });
14
+ beforeAll(() => {
15
+ provider.register();
16
+ });
17
+ afterAll(async () => {
18
+ await provider.shutdown();
19
+ trace.disable();
20
+ context.disable();
21
+ propagation.disable();
22
+ });
23
+ afterEach(() => {
24
+ exporter.reset();
25
+ });
26
+ const finished = (name) => {
27
+ const span = exporter.getFinishedSpans().find((s) => s.name === name);
28
+ if (!span) {
29
+ throw new Error(`span ${name} not found`);
30
+ }
31
+ return span;
32
+ };
33
+ describe('runInTraceContext', () => {
34
+ it('should create a consumer span that is a child of the message context', async () => {
35
+ await runInTraceContext({
36
+ traceparent: SAMPLED_TRACEPARENT,
37
+ name: 'event user.created',
38
+ attributes: { type: 'user.created', emitter: 'ms-user', correlation_id: 'corr-1' },
39
+ }, () => Promise.resolve());
40
+ const span = finished('event user.created');
41
+ expect(span.spanContext().traceId).toBe(TRACE_ID_HEX);
42
+ expect(span.parentSpanContext?.spanId).toBe(SPAN_ID_HEX);
43
+ expect(span.kind).toBe(SpanKind.CONSUMER);
44
+ expect(span.attributes).toMatchObject({
45
+ type: 'user.created',
46
+ emitter: 'ms-user',
47
+ correlation_id: 'corr-1',
48
+ });
49
+ });
50
+ it('should make the new span the active one inside the callback', async () => {
51
+ const inside = await runInTraceContext({ traceparent: SAMPLED_TRACEPARENT, name: 'job user.cleanup' }, () => Promise.resolve(trace.getActiveSpan()?.spanContext()));
52
+ expect(inside?.traceId).toBe(TRACE_ID_HEX);
53
+ expect(inside?.spanId).not.toBe(SPAN_ID_HEX);
54
+ });
55
+ it('should let a row created inside the callback carry the restored trace', async () => {
56
+ const captured = await runInTraceContext({ traceparent: SAMPLED_TRACEPARENT, name: 'event user.created' }, () => Promise.resolve(captureTraceparent()));
57
+ expect(captured?.startsWith(`00-${TRACE_ID_HEX}-`)).toBe(true);
58
+ expect(captured?.split('-')[2]).toBe(finished('event user.created').spanContext().spanId);
59
+ });
60
+ it('should return the value of the callback', async () => {
61
+ const result = await runInTraceContext({ name: 'job x' }, () => Promise.resolve(42));
62
+ expect(result).toBe(42);
63
+ });
64
+ it.each([undefined, null, '', 'not-a-traceparent'])('should open a root span when the traceparent is %p', async (traceparent) => {
65
+ await runInTraceContext({ traceparent, name: 'job root' }, () => Promise.resolve());
66
+ const span = finished('job root');
67
+ expect(span.parentSpanContext).toBeUndefined();
68
+ expect(span.spanContext().traceId).not.toBe(TRACE_ID_HEX);
69
+ });
70
+ it('should continue the active trace when the message carries no traceparent', async () => {
71
+ const outer = trace.getTracer('test').startSpan('outer');
72
+ await context.with(trace.setSpan(context.active(), outer), () => runInTraceContext({ name: 'job inherited' }, () => Promise.resolve()));
73
+ outer.end();
74
+ expect(finished('job inherited').spanContext().traceId).toBe(outer.spanContext().traceId);
75
+ });
76
+ it('should record the error on the span and rethrow it', async () => {
77
+ const failure = new Error('handler exploded');
78
+ await expect(runInTraceContext({ traceparent: SAMPLED_TRACEPARENT, name: 'job failing' }, () => Promise.reject(failure))).rejects.toBe(failure);
79
+ const span = finished('job failing');
80
+ expect(span.status.code).toBe(SpanStatusCode.ERROR);
81
+ expect(span.status.message).toBe('handler exploded');
82
+ expect(span.events.map((event) => event.name)).toContain('exception');
83
+ });
84
+ });
85
+ describe('runBatchInTraceContext', () => {
86
+ const scopes = [
87
+ { traceparent: SAMPLED_TRACEPARENT, name: 'event a', attributes: { type: 'a' } },
88
+ { traceparent: OTHER_TRACEPARENT, name: 'event b', attributes: { type: 'b' } },
89
+ ];
90
+ it('should create one span per message, each in the trace of its own message', async () => {
91
+ await runBatchInTraceContext('batch events', scopes, () => Promise.resolve());
92
+ const a = finished('event a');
93
+ const b = finished('event b');
94
+ expect(a.spanContext().traceId).toBe(TRACE_ID_HEX);
95
+ expect(a.parentSpanContext?.spanId).toBe(SPAN_ID_HEX);
96
+ expect(b.spanContext().traceId).toBe(OTHER_TRACE_ID_HEX);
97
+ expect(b.parentSpanContext?.spanId).toBe(OTHER_SPAN_ID_HEX);
98
+ });
99
+ it('should link the batch span to every message span and keep it active', async () => {
100
+ const active = await runBatchInTraceContext('batch events', scopes, () => Promise.resolve(trace.getActiveSpan()?.spanContext()));
101
+ const batch = finished('batch events');
102
+ expect(active?.spanId).toBe(batch.spanContext().spanId);
103
+ expect(batch.links.map((link) => link.context.spanId)).toEqual([
104
+ finished('event a').spanContext().spanId,
105
+ finished('event b').spanContext().spanId,
106
+ ]);
107
+ expect(batch.attributes['messaging.batch.message_count']).toBe(2);
108
+ });
109
+ it('should mark every span as failed and rethrow when the batch fails', async () => {
110
+ const failure = new Error('batch exploded');
111
+ await expect(runBatchInTraceContext('batch events', scopes, () => Promise.reject(failure))).rejects.toBe(failure);
112
+ for (const name of ['batch events', 'event a', 'event b']) {
113
+ expect(finished(name).status.code).toBe(SpanStatusCode.ERROR);
114
+ }
115
+ });
116
+ it('should run the callback for an empty batch', async () => {
117
+ const result = await runBatchInTraceContext('batch events', [], () => Promise.resolve('ok'));
118
+ expect(result).toBe('ok');
119
+ });
120
+ });
121
+ });
122
+ //# sourceMappingURL=run-in-trace-context.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-in-trace-context.unit.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/entities/run-in-trace-context.unit.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volontariapp/database",
3
- "version": "3.7.0",
3
+ "version": "3.8.0-snap-1ed0a4f",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
@@ -55,6 +55,8 @@
55
55
  "devDependencies": {
56
56
  "@jest/globals": "^30.3.0",
57
57
  "@opentelemetry/core": "^2.6.1",
58
+ "@opentelemetry/sdk-trace-base": "^2.7.1",
59
+ "@opentelemetry/sdk-trace-node": "^2.7.1",
58
60
  "@types/jest": "^30.0.0",
59
61
  "@types/node": "^22.10.7",
60
62
  "@types/pg": "^8",