diff --git a/scripts/qa-otel-smoke.ts b/scripts/qa-otel-smoke.ts index a1660e8fedc..6849c864845 100644 --- a/scripts/qa-otel-smoke.ts +++ b/scripts/qa-otel-smoke.ts @@ -93,10 +93,34 @@ const DISALLOWED_ATTRIBUTE_KEYS = new Set([ "openclaw.toolCallId", ]); -const require = createRequire(import.meta.url); -const otlpRoot = require("@opentelemetry/otlp-transformer/build/src/generated/root.js") as OtlpRoot; -const traceRequestDecoder = - otlpRoot.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; +let traceRequestDecoder: + | OtlpRoot["opentelemetry"]["proto"]["collector"]["trace"]["v1"]["ExportTraceServiceRequest"] + | undefined; + +function requireOtlpRoot(): OtlpRoot { + const candidates = [ + path.join(process.cwd(), "dist", "extensions", "diagnostics-otel", "package.json"), + path.join(process.cwd(), "extensions", "diagnostics-otel", "package.json"), + import.meta.url, + ]; + const failures: string[] = []; + for (const candidate of candidates) { + try { + return createRequire(candidate)( + "@opentelemetry/otlp-transformer/build/src/generated/root.js", + ) as OtlpRoot; + } catch (error) { + failures.push(`${candidate}: ${error instanceof Error ? error.message : String(error)}`); + } + } + throw new Error(`failed to load OTLP transformer decoder:\n${failures.join("\n")}`); +} + +function getTraceRequestDecoder() { + traceRequestDecoder ??= + requireOtlpRoot().opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; + return traceRequestDecoder; +} function usage(): string { return `Usage: pnpm qa:otel:smoke [--output-dir ] [--provider-mode ] [--scenario ] [--model ] [--alt-model ] @@ -197,7 +221,7 @@ function spanAttributes(span: OtlpSpan): Record