nestjs-otel
Version:
NestJS OpenTelemetry Library
60 lines (59 loc) • 1.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WideEventSpanProcessor = void 0;
exports.getLocalRootSpan = getLocalRootSpan;
const localRootSpans = new Map();
const isLocalRoot = (span) => {
const parent = span.parentSpanContext;
return !parent || parent.isRemote === true;
};
/**
* The local-root span for the given trace (the span with no in-process
* parent — usually the HTTP server span created by instrumentation), or
* undefined when the WideEventSpanProcessor is not registered or the span has
* already ended.
*
* @internal
*/
function getLocalRootSpan(traceId) {
return localRootSpans.get(traceId);
}
/**
* Tracks the local-root span of every trace so the WideEventInterceptor can
* flush accumulated attributes onto it instead of a nested instrumentation
* span (e.g. the per-request span created by instrumentation-nestjs-core or
* the per-phase spans created by @fastify/otel).
*
* Register it on your NodeSDK alongside the exporting processor:
*
* ```ts
* new NodeSDK({
* spanProcessors: [
* new WideEventSpanProcessor(),
* new BatchSpanProcessor(traceExporter),
* ],
* });
* ```
*
* @publicApi
*/
class WideEventSpanProcessor {
onStart(span, _parentContext) {
if (isLocalRoot(span)) {
localRootSpans.set(span.spanContext().traceId, span);
}
}
onEnd(span) {
if (isLocalRoot(span)) {
localRootSpans.delete(span.spanContext().traceId);
}
}
forceFlush() {
return Promise.resolve();
}
shutdown() {
localRootSpans.clear();
return Promise.resolve();
}
}
exports.WideEventSpanProcessor = WideEventSpanProcessor;