raffel 1.1.65 → 1.1.66

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.
Files changed (78) hide show
  1. package/dist/adapters/grpc.d.ts +8 -0
  2. package/dist/adapters/grpc.d.ts.map +1 -1
  3. package/dist/adapters/grpc.js +105 -42
  4. package/dist/adapters/grpc.js.map +1 -1
  5. package/dist/adapters/http.d.ts.map +1 -1
  6. package/dist/adapters/http.js +91 -82
  7. package/dist/adapters/http.js.map +1 -1
  8. package/dist/docs/generators/http-generator.js +17 -13
  9. package/dist/docs/generators/http-generator.js.map +1 -1
  10. package/dist/http/app.d.ts.map +1 -1
  11. package/dist/http/app.js +9 -0
  12. package/dist/http/app.js.map +1 -1
  13. package/dist/mcp/docs/patterns-advanced-data.js +2 -2
  14. package/dist/middleware/correlation-profile.d.ts +52 -0
  15. package/dist/middleware/correlation-profile.d.ts.map +1 -0
  16. package/dist/middleware/correlation-profile.js +162 -0
  17. package/dist/middleware/correlation-profile.js.map +1 -0
  18. package/dist/middleware/index.d.ts +2 -0
  19. package/dist/middleware/index.d.ts.map +1 -1
  20. package/dist/middleware/index.js +1 -0
  21. package/dist/middleware/index.js.map +1 -1
  22. package/dist/middleware/interceptors/logging.d.ts.map +1 -1
  23. package/dist/middleware/interceptors/logging.js +31 -2
  24. package/dist/middleware/interceptors/logging.js.map +1 -1
  25. package/dist/middleware/types.d.ts +14 -0
  26. package/dist/middleware/types.d.ts.map +1 -1
  27. package/dist/server/http-lifecycle/index.d.ts.map +1 -1
  28. package/dist/server/http-lifecycle/index.js +28 -0
  29. package/dist/server/http-lifecycle/index.js.map +1 -1
  30. package/dist/server/rest-middleware.js +2 -2
  31. package/dist/server/rest-middleware.js.map +1 -1
  32. package/dist/tracing/baggage.d.ts +39 -0
  33. package/dist/tracing/baggage.d.ts.map +1 -0
  34. package/dist/tracing/baggage.js +103 -0
  35. package/dist/tracing/baggage.js.map +1 -0
  36. package/dist/tracing/decimal-id.d.ts +30 -0
  37. package/dist/tracing/decimal-id.d.ts.map +1 -0
  38. package/dist/tracing/decimal-id.js +44 -0
  39. package/dist/tracing/decimal-id.js.map +1 -0
  40. package/dist/tracing/grpc.d.ts +70 -0
  41. package/dist/tracing/grpc.d.ts.map +1 -0
  42. package/dist/tracing/grpc.js +111 -0
  43. package/dist/tracing/grpc.js.map +1 -0
  44. package/dist/tracing/http.d.ts +7 -1
  45. package/dist/tracing/http.d.ts.map +1 -1
  46. package/dist/tracing/http.js +35 -19
  47. package/dist/tracing/http.js.map +1 -1
  48. package/dist/tracing/index.d.ts +8 -2
  49. package/dist/tracing/index.d.ts.map +1 -1
  50. package/dist/tracing/index.js +8 -1
  51. package/dist/tracing/index.js.map +1 -1
  52. package/dist/tracing/interceptor.d.ts +14 -0
  53. package/dist/tracing/interceptor.d.ts.map +1 -1
  54. package/dist/tracing/interceptor.js +86 -27
  55. package/dist/tracing/interceptor.js.map +1 -1
  56. package/dist/tracing/traced-fetch.d.ts +63 -0
  57. package/dist/tracing/traced-fetch.d.ts.map +1 -0
  58. package/dist/tracing/traced-fetch.js +219 -0
  59. package/dist/tracing/traced-fetch.js.map +1 -0
  60. package/dist/tracing/tracer.d.ts.map +1 -1
  61. package/dist/tracing/tracer.js +33 -9
  62. package/dist/tracing/tracer.js.map +1 -1
  63. package/dist/tracing/types.d.ts +23 -0
  64. package/dist/tracing/types.d.ts.map +1 -1
  65. package/dist/tracing/types.js.map +1 -1
  66. package/dist/types/context.d.ts +36 -2
  67. package/dist/types/context.d.ts.map +1 -1
  68. package/dist/types/context.js.map +1 -1
  69. package/dist/ui/middleware/types.d.ts +14 -0
  70. package/dist/ui/middleware/types.d.ts.map +1 -1
  71. package/dist/ui/server/http-lifecycle/index.d.ts.map +1 -1
  72. package/dist/ui/types/context.d.ts +36 -2
  73. package/dist/ui/types/context.d.ts.map +1 -1
  74. package/dist/ui/utils/header-metadata.d.ts.map +1 -1
  75. package/dist/utils/header-metadata.d.ts.map +1 -1
  76. package/dist/utils/header-metadata.js +1 -0
  77. package/dist/utils/header-metadata.js.map +1 -1
  78. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ /**
2
+ * gRPC tracing helpers.
3
+ *
4
+ * gRPC carries trace context through call metadata rather than HTTP
5
+ * headers, but the wire format is the same W3C Trace Context / Baggage
6
+ * values — a `traceparent` metadata key propagates the same way a
7
+ * `traceparent` HTTP header does. This lets a trace flow across a
8
+ * mixed A → B → C chain even when one hop is HTTP and another is gRPC:
9
+ * whichever leg B uses to call C, the same header/metadata key round-trips.
10
+ *
11
+ * Raffel only ships a gRPC *server* adapter (`../adapters/grpc.ts`) — there
12
+ * is no bundled gRPC client, so `injectGrpcMetadata` below is exported for
13
+ * callers using `@grpc/grpc-js` directly to make outbound calls (mirroring
14
+ * what `tracedFetch` does automatically for HTTP).
15
+ */
16
+ import { Metadata } from '@grpc/grpc-js';
17
+ import { parseBaggageHeader, serializeBaggageHeader } from './baggage.js';
18
+ /**
19
+ * Extract a `grpc.Metadata`-like map into a plain lowercase-keyed record.
20
+ * Accepts anything with a `.get(key)` method returning `string[]` (the real
21
+ * `grpc.Metadata` shape) so callers don't need the actual class at the type
22
+ * level.
23
+ */
24
+ function metadataGet(metadata, key) {
25
+ const values = metadata.get(key);
26
+ return values && values.length > 0 ? String(values[0]) : undefined;
27
+ }
28
+ /**
29
+ * Extract the W3C trace context (`traceparent`/`tracestate`) from incoming
30
+ * gRPC call metadata.
31
+ */
32
+ export function extractGrpcParentContext(tracer, metadata) {
33
+ return tracer.extractContext({
34
+ traceparent: metadataGet(metadata, 'traceparent'),
35
+ tracestate: metadataGet(metadata, 'tracestate'),
36
+ });
37
+ }
38
+ /**
39
+ * Extract W3C Baggage from incoming gRPC call metadata. Always returns a
40
+ * (possibly empty) object, matching the HTTP-side convention in
41
+ * `interceptor.ts` so handlers can mutate `ctx.tracing.baggage` freely.
42
+ */
43
+ export function extractGrpcBaggage(metadata) {
44
+ return parseBaggageHeader(metadataGet(metadata, 'baggage'));
45
+ }
46
+ function grpcSpanName(options) {
47
+ return `${options.service}/${options.method}`;
48
+ }
49
+ /**
50
+ * Start a `kind: 'server'` span for an incoming gRPC call, following the
51
+ * OTel RPC semantic conventions (`rpc.system`, `rpc.service`, `rpc.method`).
52
+ */
53
+ export function startGrpcServerSpan(tracer, options, parent) {
54
+ const attributes = {
55
+ 'rpc.system': 'grpc',
56
+ 'rpc.service': options.service,
57
+ 'rpc.method': options.method,
58
+ };
59
+ return tracer.startSpan(grpcSpanName(options), {
60
+ kind: 'server',
61
+ parent,
62
+ attributes,
63
+ });
64
+ }
65
+ /**
66
+ * Record the final gRPC status code on a server span and finish it. Mirrors
67
+ * `finishHttpServerSpan` in `./http.ts` — `grpc.status.OK` (0) maps to
68
+ * `'ok'`, anything else to `'error'`.
69
+ */
70
+ export function finishGrpcServerSpan(span, statusCode) {
71
+ span.setAttribute('rpc.grpc.status_code', statusCode);
72
+ span.setStatus(statusCode === 0 ? 'ok' : 'error');
73
+ span.finish();
74
+ }
75
+ /**
76
+ * Build outbound gRPC metadata carrying the current trace context and
77
+ * baggage — the gRPC-side equivalent of what `tracedFetch` injects into
78
+ * HTTP headers automatically.
79
+ *
80
+ * Raffel doesn't bundle a gRPC client, so wire this in manually around
81
+ * `@grpc/grpc-js` calls:
82
+ *
83
+ * ```ts
84
+ * import * as grpc from '@grpc/grpc-js'
85
+ * import { injectGrpcMetadata } from 'raffel'
86
+ *
87
+ * const metadata = injectGrpcMetadata(tracer)
88
+ * client.createOrder(request, metadata, callback)
89
+ * ```
90
+ *
91
+ * No-op (returns `existing` unchanged, or a fresh empty `Metadata`) when no
92
+ * tracer or no active span exists — safe to call unconditionally.
93
+ */
94
+ export function injectGrpcMetadata(tracer, existing) {
95
+ const metadata = existing ?? new Metadata();
96
+ if (!tracer)
97
+ return metadata;
98
+ const active = tracer.getActiveSpan();
99
+ if (active) {
100
+ const traceHeaders = tracer.injectContext(active.context);
101
+ if (traceHeaders.traceparent)
102
+ metadata.set('traceparent', traceHeaders.traceparent);
103
+ if (traceHeaders.tracestate)
104
+ metadata.set('tracestate', traceHeaders.tracestate);
105
+ }
106
+ const baggageHeader = serializeBaggageHeader(tracer.getBaggage());
107
+ if (baggageHeader)
108
+ metadata.set('baggage', baggageHeader);
109
+ return metadata;
110
+ }
111
+ //# sourceMappingURL=grpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc.js","sourceRoot":"","sources":["../../src/tracing/grpc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAazE;;;;;GAKG;AACH,SAAS,WAAW,CAClB,QAAoC,EACpC,GAAW;IAEX,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAChC,OAAO,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAc,EACd,QAAoC;IAEpC,OAAO,MAAM,CAAC,cAAc,CAAC;QAC3B,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC;QACjD,UAAU,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChD,CAAC,CAAA;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAoC;IACrE,OAAO,kBAAkB,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,OAA8B;IAClD,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAA;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,OAA8B,EAC9B,MAAoB;IAEpB,MAAM,UAAU,GAAmB;QACjC,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,OAAO,CAAC,OAAO;QAC9B,YAAY,EAAE,OAAO,CAAC,MAAM;KAC7B,CAAA;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;QAC7C,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,UAAU;KACX,CAAC,CAAA;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAU,EAAE,UAAkB;IACjE,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAA;IACrD,IAAI,CAAC,SAAS,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM,EAAE,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAiC,EACjC,QAAwB;IAExB,MAAM,QAAQ,GAAG,QAAQ,IAAI,IAAI,QAAQ,EAAE,CAAA;IAE3C,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAA;IAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,CAAA;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACzD,IAAI,YAAY,CAAC,WAAW;YAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;QACnF,IAAI,YAAY,CAAC,UAAU;YAAE,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,aAAa,GAAG,sBAAsB,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IACjE,IAAI,aAAa;QAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;IAEzD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -24,10 +24,16 @@ export interface HttpServerSpanOptions {
24
24
  export declare function setHttpTelemetryRoute(carrier: object, route: HttpTelemetryRoute): void;
25
25
  export declare function getHttpTelemetryRoute(carrier: object): HttpTelemetryRoute | undefined;
26
26
  export declare function extractHttpParentContext(tracer: Tracer, headers: Headers | Record<string, string | string[] | undefined>): SpanContext | undefined;
27
+ /**
28
+ * Extract the `baggage` header from an incoming request, in whichever
29
+ * headers shape the transport hands us (Fetch `Headers` or the Node
30
+ * `IncomingHttpHeaders`-style record).
31
+ */
32
+ export declare function extractHttpBaggageHeader(headers: Headers | Record<string, string | string[] | undefined>): string | undefined;
27
33
  export declare function startHttpServerSpan(tracer: Tracer, options: HttpServerSpanOptions, parent?: SpanContext): Span;
28
34
  export declare function applyHttpRouteToSpan(span: Span, method: string, route?: HttpTelemetryRoute): void;
29
35
  export declare function finishHttpServerSpan(span: Span, statusCode: number): void;
30
- export declare function bindContextToSpan(ctx: Context, span: Span, parentContext?: SpanContext): void;
36
+ export declare function bindContextToSpan(ctx: Context, span: Span, parentContext?: SpanContext, baggage?: Record<string, string>): void;
31
37
  export declare function setTraceResponseHeaders(target: ServerResponse | {
32
38
  header(name: string, value: string): void;
33
39
  }, span: Span): void;
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/tracing/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,IAAI,EAAkB,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,GAAG,CAAA;IACR,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAGtF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAErF;AAmDD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAC/D,WAAW,GAAG,SAAS,CAczB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,IAAI,CAON;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAYjG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAWzE;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,IAAI,EACV,aAAa,CAAC,EAAE,WAAW,GAC1B,IAAI,CAUN;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,GAAG;IAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACtE,IAAI,EAAE,IAAI,GACT,IAAI,CAWN;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAiC1E"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/tracing/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,IAAI,EAAkB,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAG3E,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,GAAG,CAAA;IACR,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAGtF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAErF;AAmDD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAC/D,WAAW,GAAG,SAAS,CAczB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAC/D,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,IAAI,CAON;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAYjG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAWzE;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,IAAI,EACV,aAAa,CAAC,EAAE,WAAW,EAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI,CAWN;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,GAAG;IAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACtE,IAAI,EAAE,IAAI,GACT,IAAI,CAWN;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAoC1E"}
@@ -4,6 +4,7 @@
4
4
  * Keeps the HTTP server span close to the transport boundary while allowing
5
5
  * route-aware middleware to attach low-cardinality route metadata later.
6
6
  */
7
+ import { parseBaggageHeader } from './baggage.js';
7
8
  const httpTelemetryRoutes = new WeakMap();
8
9
  export function setHttpTelemetryRoute(carrier, route) {
9
10
  const current = httpTelemetryRoutes.get(carrier) ?? {};
@@ -73,6 +74,18 @@ export function extractHttpParentContext(tracer, headers) {
73
74
  tracestate: Array.isArray(tracestate) ? tracestate[0] : tracestate,
74
75
  });
75
76
  }
77
+ /**
78
+ * Extract the `baggage` header from an incoming request, in whichever
79
+ * headers shape the transport hands us (Fetch `Headers` or the Node
80
+ * `IncomingHttpHeaders`-style record).
81
+ */
82
+ export function extractHttpBaggageHeader(headers) {
83
+ if (headers instanceof Headers) {
84
+ return headers.get('baggage') ?? undefined;
85
+ }
86
+ const baggage = headers.baggage;
87
+ return Array.isArray(baggage) ? baggage[0] : baggage;
88
+ }
76
89
  export function startHttpServerSpan(tracer, options, parent) {
77
90
  const method = normalizeMethod(options.method);
78
91
  return tracer.startSpan(spanName(method, options.route, options.procedure), {
@@ -107,11 +120,12 @@ export function finishHttpServerSpan(span, statusCode) {
107
120
  }
108
121
  span.finish();
109
122
  }
110
- export function bindContextToSpan(ctx, span, parentContext) {
123
+ export function bindContextToSpan(ctx, span, parentContext, baggage) {
111
124
  ctx.tracing = {
112
125
  traceId: span.context.traceId,
113
126
  spanId: span.context.spanId,
114
127
  parentSpanId: parentContext?.spanId,
128
+ baggage: baggage ?? {},
115
129
  };
116
130
  ctx.logger = ctx.logger.child({
117
131
  trace_id: span.context.traceId,
@@ -141,27 +155,29 @@ export function createHttpTracingMiddleware(tracer) {
141
155
  route: route?.route,
142
156
  procedure: route?.procedure,
143
157
  }, parentContext);
144
- const previousSpan = tracer.getActiveSpan();
145
- tracer.setActiveSpan(span);
158
+ const baggage = parseBaggageHeader(extractHttpBaggageHeader(ctx.req.raw.headers));
146
159
  setTraceResponseHeaders(ctx, span);
147
- try {
148
- await next();
149
- applyHttpRouteToSpan(span, method, getHttpTelemetryRoute(ctx.req.raw));
150
- finishHttpServerSpan(span, ctx.res?.status ?? 404);
151
- }
152
- catch (error) {
153
- if (error instanceof Error) {
154
- span.recordError(error);
160
+ // See `runInSpanContext`'s docs: this scopes the span/baggage to `next()`
161
+ // (and everything it awaits) and restores the caller's previous
162
+ // span/baggage afterward, which a manual enterWith+restore pair cannot
163
+ // do reliably across `await` boundaries.
164
+ return tracer.runInSpanContext(span, baggage, async () => {
165
+ try {
166
+ await next();
167
+ applyHttpRouteToSpan(span, method, getHttpTelemetryRoute(ctx.req.raw));
168
+ finishHttpServerSpan(span, ctx.res?.status ?? 404);
155
169
  }
156
- else {
157
- span.setStatus('error', String(error));
170
+ catch (error) {
171
+ if (error instanceof Error) {
172
+ span.recordError(error);
173
+ }
174
+ else {
175
+ span.setStatus('error', String(error));
176
+ }
177
+ span.finish();
178
+ throw error;
158
179
  }
159
- span.finish();
160
- throw error;
161
- }
162
- finally {
163
- tracer.setActiveSpan(previousSpan);
164
- }
180
+ });
165
181
  };
166
182
  }
167
183
  //# sourceMappingURL=http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/tracing/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/tracing/http.ts"],"names":[],"mappings":"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"}
@@ -32,14 +32,20 @@
32
32
  * })
33
33
  * ```
34
34
  */
35
- export type { SpanKind, SpanStatusCode, SpanAttributes, SpanLogEntry, SpanStatus, SpanContext, TraceHeaders, SpanData, Span, SpanExporter, SamplingResult, Sampler, StartSpanOptions, Tracer, TracingConfig, } from './types.js';
35
+ export type { SpanKind, SpanStatusCode, SpanAttributes, SpanLogEntry, SpanStatus, SpanContext, TraceHeaders, Baggage, SpanData, Span, SpanExporter, SamplingResult, Sampler, StartSpanOptions, Tracer, TracingConfig, } from './types.js';
36
+ export { parseBaggageHeader, serializeBaggageHeader, mergeBaggage } from './baggage.js';
36
37
  export { SAMPLING_STRATEGIES } from './types.js';
37
38
  export { createSpan, generateTraceId, generateSpanId } from './span.js';
38
39
  export { createAlwaysOnSampler, createAlwaysOffSampler, createProbabilitySampler, createRateLimitedSampler, createParentBasedSampler, createCompositeSampler, } from './sampler.js';
39
40
  export { createTracer } from './tracer.js';
41
+ export { hexTraceIdToDecimal, hexSpanIdToDecimal } from './decimal-id.js';
42
+ export { tracedFetch } from './traced-fetch.js';
43
+ export type { FetchInput, FetchInit } from './traced-fetch.js';
40
44
  export { createConsoleExporter, createJaegerExporter, createZipkinExporter, createOtlpHttpExporter, createNoopExporter, } from './exporters.js';
41
45
  export type { JaegerExporterOptions, ZipkinExporterOptions, OtlpHttpExporterOptions, } from './exporters.js';
42
46
  export { createTracingInterceptor, extractTraceHeaders, injectTraceHeaders, } from './interceptor.js';
43
- export { applyHttpRouteToSpan, bindContextToSpan, createHttpTracingMiddleware, extractHttpParentContext, finishHttpServerSpan, getHttpTelemetryRoute, setHttpTelemetryRoute, setTraceResponseHeaders, startHttpServerSpan, } from './http.js';
47
+ export { applyHttpRouteToSpan, bindContextToSpan, createHttpTracingMiddleware, extractHttpBaggageHeader, extractHttpParentContext, finishHttpServerSpan, getHttpTelemetryRoute, setHttpTelemetryRoute, setTraceResponseHeaders, startHttpServerSpan, } from './http.js';
44
48
  export type { HttpServerSpanOptions, HttpTelemetryRoute, } from './http.js';
49
+ export { extractGrpcBaggage, extractGrpcParentContext, finishGrpcServerSpan, injectGrpcMetadata, startGrpcServerSpan, } from './grpc.js';
50
+ export type { GrpcServerSpanOptions } from './grpc.js';
45
51
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,YAAY,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,MAAM,EACN,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGhD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGvE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,YAAY,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,MAAM,EACN,aAAa,GACd,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGhD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGvE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAG9D,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA"}
@@ -32,6 +32,8 @@
32
32
  * })
33
33
  * ```
34
34
  */
35
+ // W3C Baggage — cross-cutting business context propagated alongside the trace
36
+ export { parseBaggageHeader, serializeBaggageHeader, mergeBaggage } from './baggage.js';
35
37
  export { SAMPLING_STRATEGIES } from './types.js';
36
38
  // Span
37
39
  export { createSpan, generateTraceId, generateSpanId } from './span.js';
@@ -39,9 +41,14 @@ export { createSpan, generateTraceId, generateSpanId } from './span.js';
39
41
  export { createAlwaysOnSampler, createAlwaysOffSampler, createProbabilitySampler, createRateLimitedSampler, createParentBasedSampler, createCompositeSampler, } from './sampler.js';
40
42
  // Tracer
41
43
  export { createTracer } from './tracer.js';
44
+ // Datadog-friendly helpers
45
+ export { hexTraceIdToDecimal, hexSpanIdToDecimal } from './decimal-id.js';
46
+ export { tracedFetch } from './traced-fetch.js';
42
47
  // Exporters
43
48
  export { createConsoleExporter, createJaegerExporter, createZipkinExporter, createOtlpHttpExporter, createNoopExporter, } from './exporters.js';
44
49
  // Interceptor
45
50
  export { createTracingInterceptor, extractTraceHeaders, injectTraceHeaders, } from './interceptor.js';
46
- export { applyHttpRouteToSpan, bindContextToSpan, createHttpTracingMiddleware, extractHttpParentContext, finishHttpServerSpan, getHttpTelemetryRoute, setHttpTelemetryRoute, setTraceResponseHeaders, startHttpServerSpan, } from './http.js';
51
+ export { applyHttpRouteToSpan, bindContextToSpan, createHttpTracingMiddleware, extractHttpBaggageHeader, extractHttpParentContext, finishHttpServerSpan, getHttpTelemetryRoute, setHttpTelemetryRoute, setTraceResponseHeaders, startHttpServerSpan, } from './http.js';
52
+ // gRPC tracing helpers
53
+ export { extractGrpcBaggage, extractGrpcParentContext, finishGrpcServerSpan, injectGrpcMetadata, startGrpcServerSpan, } from './grpc.js';
47
54
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAqBH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,OAAO;AACP,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEvE,WAAW;AACX,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,cAAc,CAAA;AAErB,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,YAAY;AACZ,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AAOvB,cAAc;AACd,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAsBH,8EAA8E;AAC9E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,OAAO;AACP,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEvE,WAAW;AACX,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,cAAc,CAAA;AAErB,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,2BAA2B;AAC3B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,YAAY;AACZ,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AAOvB,cAAc;AACd,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,WAAW,CAAA;AAMlB,uBAAuB;AACvB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAA"}
@@ -2,6 +2,20 @@
2
2
  * Tracing Interceptor
3
3
  *
4
4
  * Automatically creates spans for incoming requests.
5
+ *
6
+ * Span naming + attributes follow the OpenTelemetry HTTP semantic
7
+ * conventions where applicable:
8
+ * - server span name: `${http.request.method} ${http.route}`
9
+ * (so Datadog APM auto-groups by resource name)
10
+ * - attrs: `http.request.method`, `http.route`, `url.path`,
11
+ * `rpc.method`, `rpc.system`
12
+ *
13
+ * Falls back to `${procedure}` for non-HTTP transports (gRPC, JSON-RPC,
14
+ * WS, TCP/UDP) where there is no HTTP route to model.
15
+ *
16
+ * On every span the interceptor also stashes `ddTraceId` / `ddSpanId` on
17
+ * `ctx.tracing` — the **decimal** form of the hex IDs that the Datadog
18
+ * Agent looks for in JSON logs (`dd.trace_id` / `dd.span_id`).
5
19
  */
6
20
  import type { Interceptor } from '../types/index.js';
7
21
  import type { Tracer, TraceHeaders } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../../src/tracing/interceptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAe,YAAY,EAAE,MAAM,YAAY,CAAA;AAGnE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CA2EpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GACrD,YAAY,CAYd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxB"}
1
+ {"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../../src/tracing/interceptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAe,YAAY,EAA2B,MAAM,YAAY,CAAA;AAK5F;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CA0HpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GACrD,YAAY,CAYd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxB"}
@@ -2,8 +2,24 @@
2
2
  * Tracing Interceptor
3
3
  *
4
4
  * Automatically creates spans for incoming requests.
5
+ *
6
+ * Span naming + attributes follow the OpenTelemetry HTTP semantic
7
+ * conventions where applicable:
8
+ * - server span name: `${http.request.method} ${http.route}`
9
+ * (so Datadog APM auto-groups by resource name)
10
+ * - attrs: `http.request.method`, `http.route`, `url.path`,
11
+ * `rpc.method`, `rpc.system`
12
+ *
13
+ * Falls back to `${procedure}` for non-HTTP transports (gRPC, JSON-RPC,
14
+ * WS, TCP/UDP) where there is no HTTP route to model.
15
+ *
16
+ * On every span the interceptor also stashes `ddTraceId` / `ddSpanId` on
17
+ * `ctx.tracing` — the **decimal** form of the hex IDs that the Datadog
18
+ * Agent looks for in JSON logs (`dd.trace_id` / `dd.span_id`).
5
19
  */
6
20
  import { applyHttpRouteToSpan } from './http.js';
21
+ import { hexTraceIdToDecimal, hexSpanIdToDecimal } from './decimal-id.js';
22
+ import { parseBaggageHeader } from './baggage.js';
7
23
  /**
8
24
  * Create an interceptor that automatically traces requests
9
25
  */
@@ -19,22 +35,62 @@ export function createTracingInterceptor(tracer) {
19
35
  tracestate: metadata.tracestate,
20
36
  });
21
37
  }
38
+ // Incoming baggage (business context, not trace identity) travels the
39
+ // same path as traceparent/tracestate — see extractMetadataFromHeaders.
40
+ // Always a (possibly empty) object, never undefined, so a handler can
41
+ // add a member (`ctx.tracing.baggage.tenantId = ...`) without a null
42
+ // check first.
43
+ const incomingBaggage = metadata?.baggage
44
+ ? parseBaggageHeader(metadata.baggage)
45
+ : {};
46
+ // Resolve HTTP-style span name + attributes when the transport set
47
+ // `ctx.http`. We read defensively because the core `Context` interface
48
+ // uses `http?: HttpContextCapability` and the value may be missing or
49
+ // partially populated for non-HTTP protocols.
50
+ const http = ctx.http;
51
+ const httpMethod = http?.method;
52
+ const httpRoute = http?.route;
53
+ const httpPath = http?.path;
54
+ const isHttp = Boolean(httpMethod && (httpRoute || httpPath));
55
+ const spanName = isHttp
56
+ ? `${httpMethod} ${httpRoute ?? httpPath}`
57
+ : procedure;
58
+ // Build attributes — keep the legacy `rpc.method` / `rpc.system`
59
+ // alongside the OTel HTTP ones so existing dashboards / alerts that
60
+ // query the old keys keep working.
61
+ const attributes = {
62
+ 'rpc.method': procedure,
63
+ 'rpc.system': 'raffel',
64
+ };
65
+ if (isHttp && httpMethod) {
66
+ attributes['http.request.method'] = httpMethod;
67
+ if (httpRoute) {
68
+ attributes['http.route'] = httpRoute;
69
+ }
70
+ if (httpPath) {
71
+ attributes['url.path'] = httpPath;
72
+ }
73
+ }
22
74
  // Start span with parent context
23
- const span = tracer.startSpan(`${procedure}`, {
75
+ const span = tracer.startSpan(spanName, {
24
76
  kind: 'server',
25
77
  parent: parentContext,
26
- attributes: {
27
- 'rpc.method': procedure,
28
- 'rpc.system': 'raffel',
29
- },
78
+ attributes,
30
79
  });
31
- // Set as active span
32
- const previousSpan = tracer.getActiveSpan();
33
- tracer.setActiveSpan(span);
80
+ // Stash tracing context on `ctx` so downstream interceptors (logging,
81
+ // metrics) and handlers can correlate. `ddTraceId` / `ddSpanId` are the
82
+ // decimal 64-bit form expected by the Datadog Agent's log correlator.
83
+ // `baggage` is exposed read/write so a handler can add a member (e.g.
84
+ // `ctx.tracing.baggage.tenantId = ...`) before calling a downstream
85
+ // service — tracedFetch picks up whatever is active on the tracer at
86
+ // call time, not a frozen copy.
34
87
  ctx.tracing = {
35
88
  traceId: span.context.traceId,
36
89
  spanId: span.context.spanId,
37
90
  parentSpanId: parentContext?.spanId,
91
+ ddTraceId: hexTraceIdToDecimal(span.context.traceId),
92
+ ddSpanId: hexSpanIdToDecimal(span.context.spanId),
93
+ baggage: incomingBaggage,
38
94
  };
39
95
  if (ctx.logger?.child) {
40
96
  ctx.logger = ctx.logger.child({
@@ -44,7 +100,7 @@ export function createTracingInterceptor(tracer) {
44
100
  }
45
101
  if (ctx.http) {
46
102
  const method = ctx.http.method.toUpperCase();
47
- const route = ctx.http.path;
103
+ const route = ctx.http.route ?? ctx.http.path;
48
104
  span.setAttributes({
49
105
  'http.request.method': method,
50
106
  'url.path': ctx.http.path,
@@ -55,26 +111,29 @@ export function createTracingInterceptor(tracer) {
55
111
  procedure,
56
112
  });
57
113
  }
58
- try {
59
- const result = await next();
60
- span.setStatus('ok');
61
- span.finish();
62
- return result;
63
- }
64
- catch (error) {
65
- if (error instanceof Error) {
66
- span.recordError(error);
114
+ // Run `next()` — and everything it awaits — with this span/baggage as
115
+ // active, correctly restoring the caller's previous span/baggage
116
+ // afterward regardless of how many awaits happen in between (see
117
+ // `runInSpanContext`'s docs for why a manual enterWith+restore pair
118
+ // doesn't do this reliably).
119
+ return tracer.runInSpanContext(span, incomingBaggage, async () => {
120
+ try {
121
+ const result = await next();
122
+ span.setStatus('ok');
123
+ span.finish();
124
+ return result;
67
125
  }
68
- else {
69
- span.setStatus('error', String(error));
126
+ catch (error) {
127
+ if (error instanceof Error) {
128
+ span.recordError(error);
129
+ }
130
+ else {
131
+ span.setStatus('error', String(error));
132
+ }
133
+ span.finish();
134
+ throw error;
70
135
  }
71
- span.finish();
72
- throw error;
73
- }
74
- finally {
75
- // Restore previous active span
76
- tracer.setActiveSpan(previousSpan);
77
- }
136
+ });
78
137
  };
79
138
  }
80
139
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/tracing/interceptor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/tracing/interceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * `tracedFetch` — Outbound HTTP client with automatic W3C trace context
3
+ * propagation and its own client span. Drop-in replacement for the global
4
+ * `fetch` that:
5
+ *
6
+ * 1. Starts a `kind: 'client'` span — a child of the tracer's active span
7
+ * when one exists, or a new root span otherwise (so background jobs
8
+ * and startup calls are traced too, not just in-request calls).
9
+ * 2. Injects `traceparent` (+ optional `tracestate`) from *that* client
10
+ * span's own context into the outbound request headers using W3C Trace
11
+ * Context, so the downstream service becomes a child of the client
12
+ * span rather than a sibling of it.
13
+ * 3. Records the response status (or the thrown error) on the span and
14
+ * finishes it, then forwards the response/error to the caller
15
+ * unchanged.
16
+ *
17
+ * When two Raffel apps talk to each other through `tracedFetch`, the
18
+ * downstream app extracts the `traceparent` from `envelope.metadata`, so the
19
+ * `createTracingInterceptor` reuses the same trace as a child of this client
20
+ * span. Across A → B → C, that gives one connected trace where each hop
21
+ * is visible as its own span — including the network leg itself: a slow or
22
+ * failed call between A and B (timeout, DNS failure, connection refused)
23
+ * shows up as an errored/long client span even if the request never reaches
24
+ * B, which a bare header-injection approach can't represent.
25
+ *
26
+ * No-op propagation-wise when no tracer is supplied: we just call the
27
+ * underlying `fetch` with the original headers. That keeps it safe to wire
28
+ * in unconditionally and remove the tracer later without touching callers.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { createServer, createTracer, tracedFetch, createConsoleExporter } from 'raffel'
33
+ *
34
+ * const tracer = createTracer({ serviceName: 'svc-a', exporters: [createConsoleExporter()] })
35
+ *
36
+ * const server = createServer({ port: 3000, tracer })
37
+ * .procedure('orders.create')
38
+ * .handler(async (input, ctx) => {
39
+ * // Trace headers are injected automatically — the downstream service
40
+ * // will see this request as a child of the current span.
41
+ * const res = await tracedFetch(tracer, 'http://svc-b.internal/payments.charge', {
42
+ * method: 'POST',
43
+ * headers: { 'content-type': 'application/json' },
44
+ * body: JSON.stringify({ orderId: input.orderId }),
45
+ * })
46
+ * return res.json()
47
+ * })
48
+ *
49
+ * await server.start()
50
+ * ```
51
+ */
52
+ import type { Tracer } from './types.js';
53
+ export type FetchInput = Parameters<typeof fetch>[0];
54
+ export type FetchInit = Parameters<typeof fetch>[1];
55
+ /**
56
+ * Fetch variant that always carries the active span's `traceparent` header
57
+ * and records the call itself as a `kind: 'client'` span.
58
+ *
59
+ * Signature mirrors `globalThis.fetch` so it can be swapped without callers
60
+ * noticing (the spread `init` lets `Request` objects be used as input).
61
+ */
62
+ export declare function tracedFetch(tracer: Tracer | undefined | null, input: FetchInput, init?: FetchInit): Promise<Response>;
63
+ //# sourceMappingURL=traced-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traced-fetch.d.ts","sourceRoot":"","sources":["../../src/tracing/traced-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACpD,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EACjC,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,SAAS,GACf,OAAO,CAAC,QAAQ,CAAC,CAyDnB"}