raffel 1.1.66 → 1.1.67
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.map +1 -1
- package/dist/adapters/grpc.js +1 -0
- package/dist/adapters/grpc.js.map +1 -1
- package/dist/adapters/http.d.ts +6 -0
- package/dist/adapters/http.d.ts.map +1 -1
- package/dist/adapters/http.js +17 -11
- package/dist/adapters/http.js.map +1 -1
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +13 -6
- package/dist/core/router.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/compose.d.ts +5 -0
- package/dist/middleware/compose.d.ts.map +1 -1
- package/dist/middleware/compose.js +37 -0
- package/dist/middleware/compose.js.map +1 -1
- package/dist/protocols/mcp/auth.d.ts.map +1 -1
- package/dist/protocols/mcp/auth.js +6 -1
- package/dist/protocols/mcp/auth.js.map +1 -1
- package/dist/server/builder/execution-bootstrap.d.ts.map +1 -1
- package/dist/server/builder/execution-bootstrap.js +1 -0
- package/dist/server/builder/execution-bootstrap.js.map +1 -1
- package/dist/server/builder/execution-entrypoint.d.ts.map +1 -1
- package/dist/server/builder/execution-entrypoint.js +5 -0
- package/dist/server/builder/execution-entrypoint.js.map +1 -1
- package/dist/server/telemetry-bootstrap.d.ts +3 -0
- package/dist/server/telemetry-bootstrap.d.ts.map +1 -1
- package/dist/server/telemetry-bootstrap.js +16 -3
- package/dist/server/telemetry-bootstrap.js.map +1 -1
- package/dist/server/types/lifecycle-types.d.ts +5 -0
- package/dist/server/types/lifecycle-types.d.ts.map +1 -1
- package/dist/tracing/http.d.ts.map +1 -1
- package/dist/tracing/http.js +1 -0
- package/dist/tracing/http.js.map +1 -1
- package/dist/tracing/index.d.ts +3 -0
- package/dist/tracing/index.d.ts.map +1 -1
- package/dist/tracing/index.js +1 -0
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/interceptor.d.ts +6 -1
- package/dist/tracing/interceptor.d.ts.map +1 -1
- package/dist/tracing/interceptor.js +131 -34
- package/dist/tracing/interceptor.js.map +1 -1
- package/dist/tracing/opentelemetry-span.d.ts +11 -0
- package/dist/tracing/opentelemetry-span.d.ts.map +1 -0
- package/dist/tracing/opentelemetry-span.js +101 -0
- package/dist/tracing/opentelemetry-span.js.map +1 -0
- package/dist/tracing/opentelemetry.d.ts +22 -0
- package/dist/tracing/opentelemetry.d.ts.map +1 -0
- package/dist/tracing/opentelemetry.js +111 -0
- package/dist/tracing/opentelemetry.js.map +1 -0
- package/dist/tracing/safe-attributes.d.ts +8 -0
- package/dist/tracing/safe-attributes.d.ts.map +1 -0
- package/dist/tracing/safe-attributes.js +53 -0
- package/dist/tracing/safe-attributes.js.map +1 -0
- package/dist/tracing/trace-context.d.ts +6 -0
- package/dist/tracing/trace-context.d.ts.map +1 -0
- package/dist/tracing/trace-context.js +26 -0
- package/dist/tracing/trace-context.js.map +1 -0
- package/dist/tracing/tracer.d.ts.map +1 -1
- package/dist/tracing/tracer.js +3 -26
- package/dist/tracing/tracer.js.map +1 -1
- package/dist/tracing/types.d.ts +7 -0
- package/dist/tracing/types.d.ts.map +1 -1
- package/dist/tracing/types.js.map +1 -1
- package/dist/types/context.d.ts +12 -1
- package/dist/types/context.d.ts.map +1 -1
- package/dist/types/context.js +10 -2
- package/dist/types/context.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/core/router.d.ts.map +1 -1
- package/dist/ui/types/context.d.ts +12 -1
- package/dist/ui/types/context.d.ts.map +1 -1
- package/dist/ui/types/index.d.ts +1 -1
- package/dist/ui/types/index.d.ts.map +1 -1
- package/package.json +4 -1
|
@@ -20,21 +20,127 @@
|
|
|
20
20
|
import { applyHttpRouteToSpan } from './http.js';
|
|
21
21
|
import { hexTraceIdToDecimal, hexSpanIdToDecimal } from './decimal-id.js';
|
|
22
22
|
import { parseBaggageHeader } from './baggage.js';
|
|
23
|
+
import { filterSensitiveSpanAttributes } from './safe-attributes.js';
|
|
24
|
+
import { isAsyncIterable } from '../utils/type-guards.js';
|
|
25
|
+
function recordSpanFailure(span, error) {
|
|
26
|
+
if (error instanceof Error) {
|
|
27
|
+
span.recordError(error);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
span.setStatus('error', String(error));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function* traceAsyncIterable(tracer, span, baggage, iterable) {
|
|
34
|
+
const iterator = iterable[Symbol.asyncIterator]();
|
|
35
|
+
let iteratorDone = false;
|
|
36
|
+
let failed = false;
|
|
37
|
+
try {
|
|
38
|
+
while (true) {
|
|
39
|
+
const result = await tracer.runInSpanContext(span, baggage, () => iterator.next());
|
|
40
|
+
if (result.done) {
|
|
41
|
+
iteratorDone = true;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
yield result.value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
failed = true;
|
|
49
|
+
recordSpanFailure(span, error);
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
try {
|
|
54
|
+
if (!iteratorDone && iterator.return) {
|
|
55
|
+
await tracer.runInSpanContext(span, baggage, () => iterator.return());
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (!failed) {
|
|
60
|
+
failed = true;
|
|
61
|
+
recordSpanFailure(span, error);
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
if (!failed)
|
|
67
|
+
span.setStatus('ok');
|
|
68
|
+
span.finish();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function preserveAsyncIterableCapabilities(tracer, span, baggage, iterable) {
|
|
73
|
+
const tracedIterator = traceAsyncIterable(tracer, span, baggage, iterable)[Symbol.asyncIterator]();
|
|
74
|
+
return new Proxy(iterable, {
|
|
75
|
+
get(target, property) {
|
|
76
|
+
if (property === Symbol.asyncIterator) {
|
|
77
|
+
return () => tracedIterator;
|
|
78
|
+
}
|
|
79
|
+
if (property === 'next' && typeof Reflect.get(target, property) === 'function') {
|
|
80
|
+
return tracedIterator.next.bind(tracedIterator);
|
|
81
|
+
}
|
|
82
|
+
if (property === 'return' && typeof Reflect.get(target, property) === 'function') {
|
|
83
|
+
return tracedIterator.return?.bind(tracedIterator);
|
|
84
|
+
}
|
|
85
|
+
if (property === 'throw' && typeof Reflect.get(target, property) === 'function') {
|
|
86
|
+
return tracedIterator.throw?.bind(tracedIterator);
|
|
87
|
+
}
|
|
88
|
+
const value = Reflect.get(target, property, target);
|
|
89
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async function runWithSpan(tracer, span, baggage, operation) {
|
|
94
|
+
try {
|
|
95
|
+
const result = await tracer.runInSpanContext(span, baggage, operation);
|
|
96
|
+
if (isAsyncIterable(result)) {
|
|
97
|
+
return preserveAsyncIterableCapabilities(tracer, span, baggage, result);
|
|
98
|
+
}
|
|
99
|
+
span.setStatus('ok');
|
|
100
|
+
span.finish();
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
recordSpanFailure(span, error);
|
|
105
|
+
span.finish();
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function createTraceOperation(tracer) {
|
|
110
|
+
return async (name, attributes, operation) => {
|
|
111
|
+
const parent = tracer.getActiveSpan();
|
|
112
|
+
const span = tracer.startSpan(name, {
|
|
113
|
+
kind: 'internal',
|
|
114
|
+
parent: parent?.context,
|
|
115
|
+
attributes: filterSensitiveSpanAttributes(attributes),
|
|
116
|
+
});
|
|
117
|
+
return runWithSpan(tracer, span, tracer.getBaggage(), operation);
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function createTraceEvent(tracer) {
|
|
121
|
+
return (name, attributes = {}) => {
|
|
122
|
+
tracer.getActiveSpan()?.log(name, filterSensitiveSpanAttributes(attributes));
|
|
123
|
+
};
|
|
124
|
+
}
|
|
23
125
|
/**
|
|
24
126
|
* Create an interceptor that automatically traces requests
|
|
25
127
|
*/
|
|
26
|
-
export function createTracingInterceptor(tracer) {
|
|
128
|
+
export function createTracingInterceptor(tracer, options = {}) {
|
|
27
129
|
return async (envelope, ctx, next) => {
|
|
28
130
|
const procedure = envelope.procedure ?? 'unknown';
|
|
29
131
|
// Extract parent context from envelope metadata (if propagated)
|
|
30
132
|
let parentContext;
|
|
31
133
|
const metadata = envelope.metadata;
|
|
32
|
-
|
|
33
|
-
|
|
134
|
+
const extractedParent = metadata?.traceparent
|
|
135
|
+
? tracer.extractContext({
|
|
34
136
|
traceparent: metadata.traceparent,
|
|
35
137
|
tracestate: metadata.tracestate,
|
|
36
|
-
})
|
|
37
|
-
|
|
138
|
+
})
|
|
139
|
+
: undefined;
|
|
140
|
+
const activeParent = tracer.getActiveSpan()?.context;
|
|
141
|
+
parentContext = options.preferActiveParent
|
|
142
|
+
? activeParent ?? extractedParent
|
|
143
|
+
: extractedParent ?? activeParent;
|
|
38
144
|
// Incoming baggage (business context, not trace identity) travels the
|
|
39
145
|
// same path as traceparent/tracestate — see extractMetadataFromHeaders.
|
|
40
146
|
// Always a (possibly empty) object, never undefined, so a handler can
|
|
@@ -61,21 +167,22 @@ export function createTracingInterceptor(tracer) {
|
|
|
61
167
|
const attributes = {
|
|
62
168
|
'rpc.method': procedure,
|
|
63
169
|
'rpc.system': 'raffel',
|
|
170
|
+
'raffel.procedure': procedure,
|
|
64
171
|
};
|
|
65
172
|
if (isHttp && httpMethod) {
|
|
66
173
|
attributes['http.request.method'] = httpMethod;
|
|
67
174
|
if (httpRoute) {
|
|
68
175
|
attributes['http.route'] = httpRoute;
|
|
69
176
|
}
|
|
70
|
-
if (httpPath) {
|
|
177
|
+
if (httpPath && !options.spanName) {
|
|
71
178
|
attributes['url.path'] = httpPath;
|
|
72
179
|
}
|
|
73
180
|
}
|
|
74
181
|
// Start span with parent context
|
|
75
|
-
const span = tracer.startSpan(spanName, {
|
|
76
|
-
kind: 'server',
|
|
182
|
+
const span = tracer.startSpan(options.spanName ?? spanName, {
|
|
183
|
+
kind: options.spanKind ?? 'server',
|
|
77
184
|
parent: parentContext,
|
|
78
|
-
attributes,
|
|
185
|
+
attributes: filterSensitiveSpanAttributes(attributes),
|
|
79
186
|
});
|
|
80
187
|
// Stash tracing context on `ctx` so downstream interceptors (logging,
|
|
81
188
|
// metrics) and handlers can correlate. `ddTraceId` / `ddSpanId` are the
|
|
@@ -91,6 +198,8 @@ export function createTracingInterceptor(tracer) {
|
|
|
91
198
|
ddTraceId: hexTraceIdToDecimal(span.context.traceId),
|
|
92
199
|
ddSpanId: hexSpanIdToDecimal(span.context.spanId),
|
|
93
200
|
baggage: incomingBaggage,
|
|
201
|
+
trace: createTraceOperation(tracer),
|
|
202
|
+
event: createTraceEvent(tracer),
|
|
94
203
|
};
|
|
95
204
|
if (ctx.logger?.child) {
|
|
96
205
|
ctx.logger = ctx.logger.child({
|
|
@@ -101,39 +210,27 @@ export function createTracingInterceptor(tracer) {
|
|
|
101
210
|
if (ctx.http) {
|
|
102
211
|
const method = ctx.http.method.toUpperCase();
|
|
103
212
|
const route = ctx.http.route ?? ctx.http.path;
|
|
104
|
-
|
|
213
|
+
const httpAttributes = {
|
|
105
214
|
'http.request.method': method,
|
|
106
|
-
'url.path': ctx.http.path,
|
|
107
215
|
'http.route': route,
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
216
|
+
};
|
|
217
|
+
if (!options.spanName) {
|
|
218
|
+
httpAttributes['url.path'] = ctx.http.path;
|
|
219
|
+
}
|
|
220
|
+
span.setAttributes(filterSensitiveSpanAttributes(httpAttributes));
|
|
221
|
+
if (!options.spanName) {
|
|
222
|
+
applyHttpRouteToSpan(span, method, {
|
|
223
|
+
route,
|
|
224
|
+
procedure,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
113
227
|
}
|
|
114
228
|
// Run `next()` — and everything it awaits — with this span/baggage as
|
|
115
229
|
// active, correctly restoring the caller's previous span/baggage
|
|
116
230
|
// afterward regardless of how many awaits happen in between (see
|
|
117
231
|
// `runInSpanContext`'s docs for why a manual enterWith+restore pair
|
|
118
232
|
// doesn't do this reliably).
|
|
119
|
-
return tracer
|
|
120
|
-
try {
|
|
121
|
-
const result = await next();
|
|
122
|
-
span.setStatus('ok');
|
|
123
|
-
span.finish();
|
|
124
|
-
return result;
|
|
125
|
-
}
|
|
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;
|
|
135
|
-
}
|
|
136
|
-
});
|
|
233
|
+
return runWithSpan(tracer, span, incomingBaggage, next);
|
|
137
234
|
};
|
|
138
235
|
}
|
|
139
236
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/tracing/interceptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/tracing/interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Span as OtelSpan } from '@opentelemetry/api';
|
|
2
|
+
import type { Span, SpanAttributes, SpanKind } from './types.js';
|
|
3
|
+
export interface OpenTelemetrySpanAdapterOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
kind: SpanKind;
|
|
6
|
+
parentSpanId?: string;
|
|
7
|
+
attributes?: SpanAttributes;
|
|
8
|
+
}
|
|
9
|
+
/** Adapt a native OTel span while reusing Raffel's span state bookkeeping. */
|
|
10
|
+
export declare function createOpenTelemetrySpanAdapter(nativeSpan: OtelSpan, options: OpenTelemetrySpanAdapterOptions): Span;
|
|
11
|
+
//# sourceMappingURL=opentelemetry-span.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opentelemetry-span.d.ts","sourceRoot":"","sources":["../../src/tracing/opentelemetry-span.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,IAAI,IAAI,QAAQ,EACtB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EACV,IAAI,EACJ,cAAc,EAEd,QAAQ,EAET,MAAM,YAAY,CAAA;AAkBnB,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,cAAc,CAAA;CAC5B;AAED,8EAA8E;AAC9E,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,QAAQ,EACpB,OAAO,EAAE,+BAA+B,GACvC,IAAI,CA6FN"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { SpanStatusCode as OtelSpanStatusCode, } from '@opentelemetry/api';
|
|
2
|
+
import { createSpan } from './span.js';
|
|
3
|
+
const OTEL_STATUS = {
|
|
4
|
+
unset: OtelSpanStatusCode.UNSET,
|
|
5
|
+
ok: OtelSpanStatusCode.OK,
|
|
6
|
+
error: OtelSpanStatusCode.ERROR,
|
|
7
|
+
};
|
|
8
|
+
function asOtelAttributes(attributes) {
|
|
9
|
+
const result = {};
|
|
10
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
11
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
12
|
+
result[key] = value;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
/** Adapt a native OTel span while reusing Raffel's span state bookkeeping. */
|
|
18
|
+
export function createOpenTelemetrySpanAdapter(nativeSpan, options) {
|
|
19
|
+
const nativeContext = () => {
|
|
20
|
+
const context = nativeSpan.spanContext();
|
|
21
|
+
return {
|
|
22
|
+
traceId: context.traceId,
|
|
23
|
+
spanId: context.spanId,
|
|
24
|
+
traceFlags: context.traceFlags,
|
|
25
|
+
traceState: context.traceState?.serialize(),
|
|
26
|
+
isRemote: context.isRemote,
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
const context = nativeContext();
|
|
30
|
+
const state = createSpan({
|
|
31
|
+
traceId: context.traceId,
|
|
32
|
+
spanId: context.spanId,
|
|
33
|
+
parentSpanId: options.parentSpanId,
|
|
34
|
+
name: options.name,
|
|
35
|
+
kind: options.kind,
|
|
36
|
+
isRecording: nativeSpan.isRecording(),
|
|
37
|
+
attributes: options.attributes,
|
|
38
|
+
});
|
|
39
|
+
let finished = false;
|
|
40
|
+
const span = {
|
|
41
|
+
get context() {
|
|
42
|
+
return nativeContext();
|
|
43
|
+
},
|
|
44
|
+
get name() {
|
|
45
|
+
return state.name;
|
|
46
|
+
},
|
|
47
|
+
get isRecording() {
|
|
48
|
+
return !finished && nativeSpan.isRecording();
|
|
49
|
+
},
|
|
50
|
+
setAttribute(key, value) {
|
|
51
|
+
state.setAttribute(key, value);
|
|
52
|
+
nativeSpan.setAttribute(key, value);
|
|
53
|
+
return this;
|
|
54
|
+
},
|
|
55
|
+
setAttributes(attributes) {
|
|
56
|
+
state.setAttributes(attributes);
|
|
57
|
+
nativeSpan.setAttributes(attributes);
|
|
58
|
+
return this;
|
|
59
|
+
},
|
|
60
|
+
log(message, fields) {
|
|
61
|
+
state.log(message, fields);
|
|
62
|
+
nativeSpan.addEvent(message, asOtelAttributes(fields ?? {}));
|
|
63
|
+
return this;
|
|
64
|
+
},
|
|
65
|
+
setStatus(code, message) {
|
|
66
|
+
state.setStatus(code, message);
|
|
67
|
+
nativeSpan.setStatus({ code: OTEL_STATUS[code], message });
|
|
68
|
+
return this;
|
|
69
|
+
},
|
|
70
|
+
recordError(error) {
|
|
71
|
+
state.recordError(error);
|
|
72
|
+
nativeSpan.recordException(error);
|
|
73
|
+
nativeSpan.setStatus({ code: OtelSpanStatusCode.ERROR, message: error.message });
|
|
74
|
+
return this;
|
|
75
|
+
},
|
|
76
|
+
updateName(name) {
|
|
77
|
+
state.updateName(name);
|
|
78
|
+
nativeSpan.updateName(name);
|
|
79
|
+
return this;
|
|
80
|
+
},
|
|
81
|
+
finish() {
|
|
82
|
+
if (finished)
|
|
83
|
+
return;
|
|
84
|
+
finished = true;
|
|
85
|
+
state.finish();
|
|
86
|
+
nativeSpan.end();
|
|
87
|
+
},
|
|
88
|
+
toSpanData() {
|
|
89
|
+
const data = state.toSpanData();
|
|
90
|
+
const currentContext = nativeContext();
|
|
91
|
+
return {
|
|
92
|
+
...data,
|
|
93
|
+
traceId: currentContext.traceId,
|
|
94
|
+
spanId: currentContext.spanId,
|
|
95
|
+
context: currentContext,
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
return span;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=opentelemetry-span.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opentelemetry-span.js","sourceRoot":"","sources":["../../src/tracing/opentelemetry-span.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter from Raffel's tracing surface to the process-wide OpenTelemetry API.
|
|
3
|
+
*
|
|
4
|
+
* The application/platform owns the global provider, context manager,
|
|
5
|
+
* processors, exporters, flushing, and shutdown. Raffel only creates child
|
|
6
|
+
* spans through the API so it composes with auto-instrumentation such as
|
|
7
|
+
* Datadog Single-Step Instrumentation.
|
|
8
|
+
*/
|
|
9
|
+
import type { Tracer } from './types.js';
|
|
10
|
+
export interface GlobalOpenTelemetryTracerOptions {
|
|
11
|
+
/** OpenTelemetry instrumentation scope name (default: `raffel`). */
|
|
12
|
+
instrumentationName?: string;
|
|
13
|
+
/** Optional instrumentation scope version. */
|
|
14
|
+
instrumentationVersion?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Use the OpenTelemetry tracer provider already registered by the host.
|
|
18
|
+
* This function never installs a provider or exporter and never shuts the
|
|
19
|
+
* host provider down.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createGlobalOpenTelemetryTracer(options?: GlobalOpenTelemetryTracerOptions): Tracer;
|
|
22
|
+
//# sourceMappingURL=opentelemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opentelemetry.d.ts","sourceRoot":"","sources":["../../src/tracing/opentelemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EAOV,MAAM,EACP,MAAM,YAAY,CAAA;AAYnB,MAAM,WAAW,gCAAgC;IAC/C,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,8CAA8C;IAC9C,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,gCAAqC,GAC7C,MAAM,CA2HR"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter from Raffel's tracing surface to the process-wide OpenTelemetry API.
|
|
3
|
+
*
|
|
4
|
+
* The application/platform owns the global provider, context manager,
|
|
5
|
+
* processors, exporters, flushing, and shutdown. Raffel only creates child
|
|
6
|
+
* spans through the API so it composes with auto-instrumentation such as
|
|
7
|
+
* Datadog Single-Step Instrumentation.
|
|
8
|
+
*/
|
|
9
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
10
|
+
import { context as otelContext, createTraceState, SpanKind as OtelSpanKind, trace as otelTrace, } from '@opentelemetry/api';
|
|
11
|
+
import { createOpenTelemetrySpanAdapter } from './opentelemetry-span.js';
|
|
12
|
+
import { formatW3CTraceContext, parseW3CTraceContext } from './trace-context.js';
|
|
13
|
+
const OTEL_SPAN_KIND = {
|
|
14
|
+
internal: OtelSpanKind.INTERNAL,
|
|
15
|
+
server: OtelSpanKind.SERVER,
|
|
16
|
+
client: OtelSpanKind.CLIENT,
|
|
17
|
+
producer: OtelSpanKind.PRODUCER,
|
|
18
|
+
consumer: OtelSpanKind.CONSUMER,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Use the OpenTelemetry tracer provider already registered by the host.
|
|
22
|
+
* This function never installs a provider or exporter and never shuts the
|
|
23
|
+
* host provider down.
|
|
24
|
+
*/
|
|
25
|
+
export function createGlobalOpenTelemetryTracer(options = {}) {
|
|
26
|
+
const otelTracer = otelTrace.getTracer(options.instrumentationName ?? 'raffel', options.instrumentationVersion);
|
|
27
|
+
const nativeBySpan = new WeakMap();
|
|
28
|
+
const spanByNative = new WeakMap();
|
|
29
|
+
const activeSpanStorage = new AsyncLocalStorage();
|
|
30
|
+
const baggageStorage = new AsyncLocalStorage();
|
|
31
|
+
function wrapSpan(nativeSpan, name, kind, parentSpanId, initialAttributes = {}) {
|
|
32
|
+
const existing = spanByNative.get(nativeSpan);
|
|
33
|
+
if (existing)
|
|
34
|
+
return existing;
|
|
35
|
+
const span = createOpenTelemetrySpanAdapter(nativeSpan, {
|
|
36
|
+
name,
|
|
37
|
+
kind,
|
|
38
|
+
parentSpanId,
|
|
39
|
+
attributes: initialAttributes,
|
|
40
|
+
});
|
|
41
|
+
nativeBySpan.set(span, nativeSpan);
|
|
42
|
+
spanByNative.set(nativeSpan, span);
|
|
43
|
+
return span;
|
|
44
|
+
}
|
|
45
|
+
function parentOtelContext(parent) {
|
|
46
|
+
if (parent) {
|
|
47
|
+
return otelTrace.setSpanContext(otelContext.active(), {
|
|
48
|
+
traceId: parent.traceId,
|
|
49
|
+
spanId: parent.spanId,
|
|
50
|
+
traceFlags: parent.traceFlags,
|
|
51
|
+
traceState: parent.traceState ? createTraceState(parent.traceState) : undefined,
|
|
52
|
+
isRemote: parent.isRemote ?? false,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const manuallyActive = activeSpanStorage.getStore();
|
|
56
|
+
const nativeActive = manuallyActive && nativeBySpan.get(manuallyActive);
|
|
57
|
+
return nativeActive
|
|
58
|
+
? otelTrace.setSpan(otelContext.active(), nativeActive)
|
|
59
|
+
: otelContext.active();
|
|
60
|
+
}
|
|
61
|
+
const tracer = {
|
|
62
|
+
startSpan(name, options = {}) {
|
|
63
|
+
const kind = options.kind ?? 'internal';
|
|
64
|
+
const nativeSpan = otelTracer.startSpan(name, {
|
|
65
|
+
kind: OTEL_SPAN_KIND[kind],
|
|
66
|
+
attributes: options.attributes,
|
|
67
|
+
}, parentOtelContext(options.parent));
|
|
68
|
+
return wrapSpan(nativeSpan, name, kind, options.parent?.spanId, options.attributes);
|
|
69
|
+
},
|
|
70
|
+
getActiveSpan() {
|
|
71
|
+
const nativeSpan = otelTrace.getSpan(otelContext.active());
|
|
72
|
+
if (nativeSpan) {
|
|
73
|
+
return wrapSpan(nativeSpan, 'external.active', 'internal');
|
|
74
|
+
}
|
|
75
|
+
return activeSpanStorage.getStore();
|
|
76
|
+
},
|
|
77
|
+
setActiveSpan(span) {
|
|
78
|
+
activeSpanStorage.enterWith(span);
|
|
79
|
+
},
|
|
80
|
+
getBaggage() {
|
|
81
|
+
return baggageStorage.getStore();
|
|
82
|
+
},
|
|
83
|
+
setBaggage(baggage) {
|
|
84
|
+
baggageStorage.enterWith(baggage);
|
|
85
|
+
},
|
|
86
|
+
runInSpanContext(span, baggage, fn) {
|
|
87
|
+
const nativeSpan = span && nativeBySpan.get(span);
|
|
88
|
+
const context = nativeSpan
|
|
89
|
+
? otelTrace.setSpan(otelContext.active(), nativeSpan)
|
|
90
|
+
: otelContext.active();
|
|
91
|
+
return otelContext.with(context, () => activeSpanStorage.run(span, () => baggageStorage.run(baggage, fn)));
|
|
92
|
+
},
|
|
93
|
+
startSpanFromContext(name, parentContext, options = {}) {
|
|
94
|
+
return this.startSpan(name, { ...options, parent: parentContext });
|
|
95
|
+
},
|
|
96
|
+
extractContext(headers) {
|
|
97
|
+
return parseW3CTraceContext(headers);
|
|
98
|
+
},
|
|
99
|
+
injectContext(context) {
|
|
100
|
+
return formatW3CTraceContext(context);
|
|
101
|
+
},
|
|
102
|
+
async flush() {
|
|
103
|
+
// The host provider owns processors/exporters and their flush lifecycle.
|
|
104
|
+
},
|
|
105
|
+
async shutdown() {
|
|
106
|
+
// The host provider is process-global and must not be shut down by Raffel.
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
return tracer;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=opentelemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opentelemetry.js","sourceRoot":"","sources":["../../src/tracing/opentelemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SpanAttributes } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Drop attribute categories that commonly carry credentials, personal
|
|
4
|
+
* identifiers, or high-cardinality cache keys. Tracing must never make the
|
|
5
|
+
* application fail, so unsafe attributes are omitted rather than rejected.
|
|
6
|
+
*/
|
|
7
|
+
export declare function filterSensitiveSpanAttributes(attributes: SpanAttributes): SpanAttributes;
|
|
8
|
+
//# sourceMappingURL=safe-attributes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-attributes.d.ts","sourceRoot":"","sources":["../../src/tracing/safe-attributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAsChD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,cAAc,GAAG,cAAc,CAQxF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const SENSITIVE_ATTRIBUTE_KEY_PATTERN = /(?:^|[._-])(?:authorization|cookie|document|documento|cpf|cnpj|oid|password|secret|token|cache[._-]?key|api[._-]?key)(?:$|[._-])/i;
|
|
2
|
+
const SAFE_STRING_ATTRIBUTE_KEYS = new Set([
|
|
3
|
+
'cache.system',
|
|
4
|
+
'db.operation.name',
|
|
5
|
+
'db.system',
|
|
6
|
+
'deployment.environment',
|
|
7
|
+
'deployment.environment.name',
|
|
8
|
+
'http.request.method',
|
|
9
|
+
'http.route',
|
|
10
|
+
'messaging.system',
|
|
11
|
+
'network.protocol.name',
|
|
12
|
+
'network.protocol.version',
|
|
13
|
+
'raffel.handler.kind',
|
|
14
|
+
'raffel.interceptor',
|
|
15
|
+
'raffel.procedure',
|
|
16
|
+
'rpc.method',
|
|
17
|
+
'rpc.system',
|
|
18
|
+
'service.name',
|
|
19
|
+
'url.path',
|
|
20
|
+
'url.scheme',
|
|
21
|
+
]);
|
|
22
|
+
const SENSITIVE_ATTRIBUTE_VALUE_PATTERNS = [
|
|
23
|
+
/\b\d{3}\.?\d{3}\.?\d{3}-?\d{2}\b/,
|
|
24
|
+
/(?:^|[^a-z0-9])(?:bearer|oid|token)[._:=/-]?[a-z0-9]/i,
|
|
25
|
+
/^[a-f0-9]{24}$/i,
|
|
26
|
+
/^[a-z0-9._-]+(?::[a-z0-9._-]+)+$/i,
|
|
27
|
+
/^eyJ[a-z0-9_-]+\.[a-z0-9_-]+\.[a-z0-9_-]+$/i,
|
|
28
|
+
];
|
|
29
|
+
function hasSensitiveValue(value) {
|
|
30
|
+
if (typeof value === 'boolean')
|
|
31
|
+
return false;
|
|
32
|
+
const text = String(value);
|
|
33
|
+
if (text.length > 256 || /[\u0000-\u001f\u007f]/.test(text))
|
|
34
|
+
return true;
|
|
35
|
+
return SENSITIVE_ATTRIBUTE_VALUE_PATTERNS.some((pattern) => pattern.test(text));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Drop attribute categories that commonly carry credentials, personal
|
|
39
|
+
* identifiers, or high-cardinality cache keys. Tracing must never make the
|
|
40
|
+
* application fail, so unsafe attributes are omitted rather than rejected.
|
|
41
|
+
*/
|
|
42
|
+
export function filterSensitiveSpanAttributes(attributes) {
|
|
43
|
+
const safe = {};
|
|
44
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
45
|
+
if (SENSITIVE_ATTRIBUTE_KEY_PATTERN.test(key) || hasSensitiveValue(value))
|
|
46
|
+
continue;
|
|
47
|
+
if (typeof value === 'string' && !SAFE_STRING_ATTRIBUTE_KEYS.has(key))
|
|
48
|
+
continue;
|
|
49
|
+
safe[key] = value;
|
|
50
|
+
}
|
|
51
|
+
return safe;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=safe-attributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-attributes.js","sourceRoot":"","sources":["../../src/tracing/safe-attributes.ts"],"names":[],"mappings":"AAEA,MAAM,+BAA+B,GAAG,mIAAmI,CAAA;AAC3K,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IACzC,cAAc;IACd,mBAAmB;IACnB,WAAW;IACX,wBAAwB;IACxB,6BAA6B;IAC7B,qBAAqB;IACrB,YAAY;IACZ,kBAAkB;IAClB,uBAAuB;IACvB,0BAA0B;IAC1B,qBAAqB;IACrB,oBAAoB;IACpB,kBAAkB;IAClB,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,UAAU;IACV,YAAY;CACb,CAAC,CAAA;AACF,MAAM,kCAAkC,GAAG;IACzC,kCAAkC;IAClC,uDAAuD;IACvD,iBAAiB;IACjB,mCAAmC;IACnC,6CAA6C;CAC9C,CAAA;AAED,SAAS,iBAAiB,CAAC,KAAgC;IACzD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1B,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACxE,OAAO,kCAAkC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AACjF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAAC,UAA0B;IACtE,MAAM,IAAI,GAAmB,EAAE,CAAA;IAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC;YAAE,SAAQ;QACnF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAQ;QAC/E,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACnB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SpanContext, TraceHeaders } from './types.js';
|
|
2
|
+
/** Parse the W3C traceparent/tracestate headers used by Raffel tracers. */
|
|
3
|
+
export declare function parseW3CTraceContext(headers: TraceHeaders): SpanContext | undefined;
|
|
4
|
+
/** Format a Raffel span context as W3C traceparent/tracestate headers. */
|
|
5
|
+
export declare function formatW3CTraceContext(context: SpanContext): TraceHeaders;
|
|
6
|
+
//# sourceMappingURL=trace-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-context.d.ts","sourceRoot":"","sources":["../../src/tracing/trace-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE3D,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,WAAW,GAAG,SAAS,CAgBnF;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,CAMxE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Parse the W3C traceparent/tracestate headers used by Raffel tracers. */
|
|
2
|
+
export function parseW3CTraceContext(headers) {
|
|
3
|
+
const parts = headers.traceparent?.split('-');
|
|
4
|
+
if (!parts || parts.length !== 4)
|
|
5
|
+
return undefined;
|
|
6
|
+
const [version, traceId, spanId, flags] = parts;
|
|
7
|
+
if (version !== '00' || traceId.length !== 32 || spanId.length !== 16) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
traceId,
|
|
12
|
+
spanId,
|
|
13
|
+
traceFlags: Number.parseInt(flags, 16),
|
|
14
|
+
traceState: headers.tracestate,
|
|
15
|
+
isRemote: true,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Format a Raffel span context as W3C traceparent/tracestate headers. */
|
|
19
|
+
export function formatW3CTraceContext(context) {
|
|
20
|
+
const flags = context.traceFlags.toString(16).padStart(2, '0');
|
|
21
|
+
return {
|
|
22
|
+
traceparent: `00-${context.traceId}-${context.spanId}-${flags}`,
|
|
23
|
+
tracestate: context.traceState,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=trace-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-context.js","sourceRoot":"","sources":["../../src/tracing/trace-context.ts"],"names":[],"mappings":"AAEA,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;IAC7C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAElD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;IAC/C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtE,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO;QACL,OAAO;QACP,MAAM;QACN,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QACtC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,IAAI;KACf,CAAA;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,OAAoB;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC9D,OAAO;QACL,WAAW,EAAE,MAAM,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE;QAC/D,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracing/tracer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EAQd,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracing/tracer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EAQd,MAAM,YAAY,CAAA;AAKnB;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,aAAkB,GAAG,MAAM,CA2L/D"}
|