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.
- package/dist/adapters/grpc.d.ts +8 -0
- package/dist/adapters/grpc.d.ts.map +1 -1
- package/dist/adapters/grpc.js +105 -42
- package/dist/adapters/grpc.js.map +1 -1
- package/dist/adapters/http.d.ts.map +1 -1
- package/dist/adapters/http.js +91 -82
- package/dist/adapters/http.js.map +1 -1
- package/dist/docs/generators/http-generator.js +17 -13
- package/dist/docs/generators/http-generator.js.map +1 -1
- package/dist/http/app.d.ts.map +1 -1
- package/dist/http/app.js +9 -0
- package/dist/http/app.js.map +1 -1
- package/dist/mcp/docs/patterns-advanced-data.js +2 -2
- package/dist/middleware/correlation-profile.d.ts +52 -0
- package/dist/middleware/correlation-profile.d.ts.map +1 -0
- package/dist/middleware/correlation-profile.js +162 -0
- package/dist/middleware/correlation-profile.js.map +1 -0
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +1 -0
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/interceptors/logging.d.ts.map +1 -1
- package/dist/middleware/interceptors/logging.js +31 -2
- package/dist/middleware/interceptors/logging.js.map +1 -1
- package/dist/middleware/types.d.ts +14 -0
- package/dist/middleware/types.d.ts.map +1 -1
- package/dist/server/http-lifecycle/index.d.ts.map +1 -1
- package/dist/server/http-lifecycle/index.js +28 -0
- package/dist/server/http-lifecycle/index.js.map +1 -1
- package/dist/server/rest-middleware.js +2 -2
- package/dist/server/rest-middleware.js.map +1 -1
- package/dist/tracing/baggage.d.ts +39 -0
- package/dist/tracing/baggage.d.ts.map +1 -0
- package/dist/tracing/baggage.js +103 -0
- package/dist/tracing/baggage.js.map +1 -0
- package/dist/tracing/decimal-id.d.ts +30 -0
- package/dist/tracing/decimal-id.d.ts.map +1 -0
- package/dist/tracing/decimal-id.js +44 -0
- package/dist/tracing/decimal-id.js.map +1 -0
- package/dist/tracing/grpc.d.ts +70 -0
- package/dist/tracing/grpc.d.ts.map +1 -0
- package/dist/tracing/grpc.js +111 -0
- package/dist/tracing/grpc.js.map +1 -0
- package/dist/tracing/http.d.ts +7 -1
- package/dist/tracing/http.d.ts.map +1 -1
- package/dist/tracing/http.js +35 -19
- package/dist/tracing/http.js.map +1 -1
- package/dist/tracing/index.d.ts +8 -2
- package/dist/tracing/index.d.ts.map +1 -1
- package/dist/tracing/index.js +8 -1
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/interceptor.d.ts +14 -0
- package/dist/tracing/interceptor.d.ts.map +1 -1
- package/dist/tracing/interceptor.js +86 -27
- package/dist/tracing/interceptor.js.map +1 -1
- package/dist/tracing/traced-fetch.d.ts +63 -0
- package/dist/tracing/traced-fetch.d.ts.map +1 -0
- package/dist/tracing/traced-fetch.js +219 -0
- package/dist/tracing/traced-fetch.js.map +1 -0
- package/dist/tracing/tracer.d.ts.map +1 -1
- package/dist/tracing/tracer.js +33 -9
- package/dist/tracing/tracer.js.map +1 -1
- package/dist/tracing/types.d.ts +23 -0
- package/dist/tracing/types.d.ts.map +1 -1
- package/dist/tracing/types.js.map +1 -1
- package/dist/types/context.d.ts +36 -2
- package/dist/types/context.d.ts.map +1 -1
- package/dist/types/context.js.map +1 -1
- package/dist/ui/middleware/types.d.ts +14 -0
- package/dist/ui/middleware/types.d.ts.map +1 -1
- package/dist/ui/server/http-lifecycle/index.d.ts.map +1 -1
- package/dist/ui/types/context.d.ts +36 -2
- package/dist/ui/types/context.d.ts.map +1 -1
- package/dist/ui/utils/header-metadata.d.ts.map +1 -1
- package/dist/utils/header-metadata.d.ts.map +1 -1
- package/dist/utils/header-metadata.js +1 -0
- package/dist/utils/header-metadata.js.map +1 -1
- 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"}
|
package/dist/tracing/http.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/tracing/http.js
CHANGED
|
@@ -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
|
|
145
|
-
tracer.setActiveSpan(span);
|
|
158
|
+
const baggage = parseBaggageHeader(extractHttpBaggageHeader(ctx.req.raw.headers));
|
|
146
159
|
setTraceResponseHeaders(ctx, span);
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
span.
|
|
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
|
-
|
|
157
|
-
|
|
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
|
-
|
|
160
|
-
throw error;
|
|
161
|
-
}
|
|
162
|
-
finally {
|
|
163
|
-
tracer.setActiveSpan(previousSpan);
|
|
164
|
-
}
|
|
180
|
+
});
|
|
165
181
|
};
|
|
166
182
|
}
|
|
167
183
|
//# sourceMappingURL=http.js.map
|
package/dist/tracing/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/tracing/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/tracing/http.ts"],"names":[],"mappings":"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"}
|
package/dist/tracing/index.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/tracing/index.js
CHANGED
|
@@ -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;
|
|
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
|
|
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(
|
|
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
|
-
//
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
span.
|
|
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
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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":"AAAA
|
|
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"}
|