"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var chunk_LJTRIVKN_exports = {}; __export(chunk_LJTRIVKN_exports, { ActiveTracingHelper: () => ActiveTracingHelper }); module.exports = __toCommonJS(chunk_LJTRIVKN_exports); var import_api = require("@opentelemetry/api"); var showAllTraces = process.env.PRISMA_SHOW_ALL_TRACES === "true"; var nonSampledTraceParent = `00-10-10-00`; function engineSpanKindToOtelSpanKind(engineSpanKind) { switch (engineSpanKind) { case "client": return import_api.SpanKind.CLIENT; case "internal": default: return import_api.SpanKind.INTERNAL; } } var ActiveTracingHelper = class { traceMiddleware; tracerProvider; ignoreSpanTypes; constructor({ traceMiddleware, tracerProvider, ignoreSpanTypes }) { this.traceMiddleware = traceMiddleware; this.tracerProvider = tracerProvider; this.ignoreSpanTypes = ignoreSpanTypes; } isEnabled() { return true; } getTraceParent(context) { const span = import_api.trace.getSpanContext(context ?? import_api.context.active()); if (span) { return `00-${span.traceId}-${span.spanId}-0${span.traceFlags}`; } return nonSampledTraceParent; } dispatchEngineSpans(spans) { const tracer = this.tracerProvider.getTracer("prisma"); const linkIds = /* @__PURE__ */ new Map(); const roots = spans.filter((span) => span.parentId === null); for (const root of roots) { dispatchEngineSpan(tracer, root, spans, linkIds, this.ignoreSpanTypes); } } getActiveContext() { return import_api.context.active(); } runInChildSpan(options, callback) { if (typeof options === "string") { options = { name: options }; } if (options.internal && !showAllTraces) { return callback(); } if (options.middleware && !this.traceMiddleware) { return callback(); } const tracer = this.tracerProvider.getTracer("prisma"); const context = options.context ?? this.getActiveContext(); const name = `prisma:client:${options.name}`; if (shouldIgnoreSpan(name, this.ignoreSpanTypes)) { return callback(); } if (options.active === false) { const span = tracer.startSpan(name, options, context); return endSpan(span, callback(span, context)); } return tracer.startActiveSpan(name, options, (span) => endSpan(span, callback(span, context))); } }; function dispatchEngineSpan(tracer, engineSpan, allSpans, linkIds, ignoreSpanTypes) { if (shouldIgnoreSpan(engineSpan.name, ignoreSpanTypes)) return; const spanOptions = { attributes: engineSpan.attributes, kind: engineSpanKindToOtelSpanKind(engineSpan.kind), startTime: engineSpan.startTime }; tracer.startActiveSpan(engineSpan.name, spanOptions, (span) => { linkIds.set(engineSpan.id, span.spanContext().spanId); if (engineSpan.links) { span.addLinks( engineSpan.links.flatMap((link) => { const linkedId = linkIds.get(link); if (!linkedId) { return []; } return { context: { spanId: linkedId, traceId: span.spanContext().traceId, traceFlags: span.spanContext().traceFlags } }; }) ); } const children = allSpans.filter((s) => s.parentId === engineSpan.id); for (const child of children) { dispatchEngineSpan(tracer, child, allSpans, linkIds, ignoreSpanTypes); } span.end(engineSpan.endTime); }); } function endSpan(span, result) { if (isPromiseLike(result)) { return result.then( (value) => { span.end(); return value; }, (reason) => { span.end(); throw reason; } ); } span.end(); return result; } function isPromiseLike(value) { return value != null && typeof value["then"] === "function"; } function shouldIgnoreSpan(spanName, ignoreSpanTypes) { return ignoreSpanTypes.some( (pattern) => typeof pattern === "string" ? pattern === spanName : pattern.test(spanName) ); }