diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
| commit | 76cb9c2a39d477a64824a985ade40507e3bbade1 (patch) | |
| tree | 41e997aa9c6f538d3a136af61dae9424db2005a9 /vanilla/node_modules/vitest/dist/chunks/traces.CCmnQaNT.js | |
| parent | 819a39a21ac992b1393244a4c283bbb125208c69 (diff) | |
| download | neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.gz neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.bz2 neko-76cb9c2a39d477a64824a985ade40507e3bbade1.zip | |
feat(vanilla): add testing infrastructure and tests (NK-wjnczv)
Diffstat (limited to 'vanilla/node_modules/vitest/dist/chunks/traces.CCmnQaNT.js')
| -rw-r--r-- | vanilla/node_modules/vitest/dist/chunks/traces.CCmnQaNT.js | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/vanilla/node_modules/vitest/dist/chunks/traces.CCmnQaNT.js b/vanilla/node_modules/vitest/dist/chunks/traces.CCmnQaNT.js new file mode 100644 index 0000000..b94a0c4 --- /dev/null +++ b/vanilla/node_modules/vitest/dist/chunks/traces.CCmnQaNT.js @@ -0,0 +1,217 @@ +class Traces { + /** + * otel stands for OpenTelemetry + */ + #otel = null; + #sdk = null; + #init = null; + #noopSpan = createNoopSpan(); + #noopContext = createNoopContext(); + #initStartTime = performance.now(); + #initEndTime = 0; + #initRecorded = false; + constructor(options) { + if (options.enabled) { + const apiInit = import('@opentelemetry/api').then((api) => { + this.#otel = { + tracer: api.trace.getTracer(options.tracerName || "vitest"), + context: api.context, + propagation: api.propagation, + trace: api.trace, + SpanKind: api.SpanKind, + SpanStatusCode: api.SpanStatusCode + }; + }).catch(() => { + throw new Error(`"@opentelemetry/api" is not installed locally. Make sure you have setup OpenTelemetry instrumentation: https://vitest.dev/guide/open-telemetry`); + }); + const sdkInit = (options.sdkPath ? import( + /* @vite-ignore */ + options.sdkPath +) : Promise.resolve()).catch((cause) => { + throw new Error(`Failed to import custom OpenTelemetry SDK script (${options.sdkPath}): ${cause.message}`); + }); + this.#init = Promise.all([sdkInit, apiInit]).then(([sdk]) => { + if (sdk != null) { + if (sdk.default != null && typeof sdk.default === "object" && typeof sdk.default.shutdown === "function") this.#sdk = sdk.default; + else if (options.watchMode !== true && process.env.VITEST_MODE !== "watch") console.warn(`OpenTelemetry instrumentation module (${options.sdkPath}) does not have a default export with a "shutdown" method. Vitest won't be able to ensure that all traces are processed in time. Try running Vitest in watch mode instead.`); + } + }).finally(() => { + this.#initEndTime = performance.now(); + this.#init = null; + }); + } + } + isEnabled() { + return !!this.#otel; + } + /** + * @internal + */ + async waitInit() { + if (this.#init) await this.#init; + return this; + } + /** + * @internal + */ + recordInitSpan(context) { + if (this.#initRecorded) return; + this.#initRecorded = true; + this.startSpan("vitest.runtime.traces", { startTime: this.#initStartTime }, context).end(this.#initEndTime); + } + /** + * @internal + */ + startContextSpan(name, currentContext) { + if (!this.#otel) return { + span: this.#noopSpan, + context: this.#noopContext + }; + const activeContext = currentContext || this.#otel.context.active(); + const span = this.#otel.tracer.startSpan(name, {}, activeContext); + return { + span, + context: this.#otel.trace.setSpan(activeContext, span) + }; + } + /** + * @internal + */ + getContextFromCarrier(carrier) { + if (!this.#otel) return this.#noopContext; + const activeContext = this.#otel.context.active(); + if (!carrier) return activeContext; + return this.#otel.propagation.extract(activeContext, carrier); + } + /** + * @internal + */ + getContextFromEnv(env) { + if (!this.#otel) return this.#noopContext; + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/context/env-carriers.md + // some tools sets only `TRACEPARENT` but not `TRACESTATE` + const carrier = {}; + if (typeof env.TRACEPARENT === "string") carrier.traceparent = env.TRACEPARENT; + if (typeof env.TRACESTATE === "string") carrier.tracestate = env.TRACESTATE; + return this.getContextFromCarrier(carrier); + } + /** + * @internal + */ + getContextCarrier(context) { + if (!this.#otel) return; + const carrier = {}; + this.#otel.propagation.inject(context || this.#otel.context.active(), carrier); + return carrier; + } + #callActiveSpan(span, callback) { + const otel = this.#otel; + let result; + try { + result = callback(span); + if (result instanceof Promise) return result.catch((error) => { + span.recordException({ + name: error.name, + message: error.message, + stack: error.stack + }); + span.setStatus({ code: otel.SpanStatusCode.ERROR }); + throw error; + }).finally(() => span.end()); + return result; + } catch (error) { + if (error instanceof Error) { + span.recordException({ + name: error.name, + message: error.message, + stack: error.stack + }); + span.setStatus({ code: otel.SpanStatusCode.ERROR }); + } + throw error; + } finally { + // end sync callbcak + if (!(result instanceof Promise)) span.end(); + } + } + /** + * @internal + */ + $(name, optionsOrFn, fn) { + const callback = typeof optionsOrFn === "function" ? optionsOrFn : fn; + if (!this.#otel) return callback(this.#noopSpan); + const otel = this.#otel; + const options = typeof optionsOrFn === "function" ? {} : optionsOrFn; + const context = options.context; + if (context) return otel.tracer.startActiveSpan(name, options, context, (span) => this.#callActiveSpan(span, callback)); + return otel.tracer.startActiveSpan(name, options, (span) => this.#callActiveSpan(span, callback)); + } + /** + * @internal + */ + startSpan(name, options, context) { + if (!this.#otel) return this.#noopSpan; + const { tracer } = this.#otel; + return tracer.startSpan(name, options, context); + } + // On browser mode, async context is not automatically propagated, + // so we manually bind the `$` calls to the provided context. + // TODO: this doesn't bind to user land's `@optelemetry/api` calls + /** + * @internal + */ + bind(context) { + if (!this.#otel) return; + const original = this.$.__original ?? this.$; + this.$ = this.#otel.context.bind(context, original); + this.$.__original = original; + } + /** + * @internal + */ + async finish() { + await this.#sdk?.shutdown(); + } + /** + * @internal + */ + async flush() { + await this.#sdk?.forceFlush?.(); + } +} +function noopSpan() { + return this; +} +function createNoopSpan() { + return { + setAttribute: noopSpan, + setStatus: noopSpan, + addEvent: noopSpan, + addLink: noopSpan, + addLinks: noopSpan, + setAttributes: noopSpan, + updateName: noopSpan, + end: () => {}, + isRecording: () => false, + recordException: noopSpan, + spanContext() { + return { + spanId: "", + traceFlags: 0, + traceId: "" + }; + } + }; +} +function noopContext() { + return this; +} +function createNoopContext() { + return { + getValue: noopContext, + setValue: noopContext, + deleteValue: noopContext + }; +} + +export { Traces as T }; |
