diff --git a/scripts/src/platform-infra-observability/options.ts b/scripts/src/platform-infra-observability/options.ts index f738a9a0..2fc345bb 100644 --- a/scripts/src/platform-infra-observability/options.ts +++ b/scripts/src/platform-infra-observability/options.ts @@ -37,7 +37,7 @@ export function observabilityHelp(): Record { "bun scripts/cli.ts platform-infra observability status --target D601 [--full|--raw]", "bun scripts/cli.ts platform-infra observability status --target D518 [--full|--raw]", "bun scripts/cli.ts platform-infra observability validate --target D518 [--full|--raw]", - "bun scripts/cli.ts platform-infra observability trace --target D518 --trace-id [--grep provider-stream-disconnected] [--limit 40] [--full|--raw]", + "bun scripts/cli.ts platform-infra observability trace --target D518 [--grep provider-stream-disconnected] [--limit 40] [--full|--raw]", "bun scripts/cli.ts platform-infra observability search --target D518 --grep 'no rollout found' [--lookback-minutes 360] [--candidate-limit 80] [--limit 20] [--full|--raw]", "bun scripts/cli.ts platform-infra observability search --target JD01 --grep opencode.proxy.stream.start --lookback-minutes 30 --limit 20", "bun scripts/cli.ts platform-infra observability search --target JD01 --grep opencode.proxy.sse.directory_rewrite_enabled --lookback-minutes 30 --limit 20", @@ -113,13 +113,17 @@ export function parseTraceOptions(args: string[]): TraceOptions { let traceId: string | null = null; let grep: string | null = null; let limit = 40; + const assignTraceId = (value: string) => { + if (!/^[0-9a-fA-F]{32}$/u.test(value)) throw new Error("trace id must be a 32-character OpenTelemetry trace id encoded as hex"); + if (traceId !== null) throw new Error("observability trace accepts exactly one trace id, either positionally or through --trace-id"); + traceId = value; + }; for (let index = 0; index < args.length; index += 1) { const arg = args[index]; if (arg === "--trace-id") { const value = args[index + 1]; if (value === undefined || value.startsWith("--")) throw new Error("--trace-id requires a value"); - if (!/^[0-9a-fA-F]{32}$/u.test(value)) throw new Error("--trace-id must be a 32-character OpenTelemetry trace id encoded as hex"); - traceId = value; + assignTraceId(value); index += 1; } else if (arg === "--grep") { const value = args[index + 1]; @@ -133,6 +137,8 @@ export function parseTraceOptions(args: string[]): TraceOptions { if (!Number.isInteger(parsed) || parsed < 1 || parsed > 500) throw new Error("--limit must be an integer from 1 to 500"); limit = parsed; index += 1; + } else if (!arg.startsWith("--")) { + assignTraceId(arg); } else { commonArgs.push(arg); if (arg === "--target") { diff --git a/scripts/src/platform-infra/entry.ts b/scripts/src/platform-infra/entry.ts index bd711d17..9e2771b2 100644 --- a/scripts/src/platform-infra/entry.ts +++ b/scripts/src/platform-infra/entry.ts @@ -438,7 +438,7 @@ export function platformInfraHelp(): unknown { "bun scripts/cli.ts platform-infra observability apply --target D601 --confirm", "bun scripts/cli.ts platform-infra observability status --target D601", "bun scripts/cli.ts platform-infra observability validate --target D601", - "bun scripts/cli.ts platform-infra observability trace --target D601 --trace-id [--grep text] [--limit 40] [--full|--raw]", + "bun scripts/cli.ts platform-infra observability trace --target D601 [--grep text] [--limit 40] [--full|--raw]", "bun scripts/cli.ts platform-infra observability search --target D601 --grep 'no rollout found' [--lookback-minutes 360] [--candidate-limit 80] [--limit 20]", "bun scripts/cli.ts platform-infra observability diagnose-code-agent --target D601 --business-trace-id [--full|--raw]", "bun scripts/cli.ts platform-infra observability diagnose-code-agent --target D601 --run-id [--command-id ] [--runner-job-id ]",