From 0e8f79277f1dc7a0ac764c866eab8e40e4280c6d Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 10 Jul 2026 06:40:34 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B6=E6=95=9B=20OTel=20validate=20?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform-infra-observability/actions.ts | 72 ++++++++++++++++++- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/scripts/src/platform-infra-observability/actions.ts b/scripts/src/platform-infra-observability/actions.ts index 1a78fbb4..fbbc182e 100644 --- a/scripts/src/platform-infra-observability/actions.ts +++ b/scripts/src/platform-infra-observability/actions.ts @@ -205,7 +205,7 @@ function recordList(value: unknown): Record[] { : []; } -export async function validate(config: UniDeskConfig, options: CommonOptions): Promise> { +export async function validate(config: UniDeskConfig, options: CommonOptions): Promise | RenderedCliResult> { const observability = readObservabilityConfig(); const target = resolveTarget(observability, options.targetId); const result = await capture(config, target.route, ["sh"], statusScript(observability, target, options.full, true)); @@ -217,8 +217,19 @@ export async function validate(config: UniDeskConfig, options: CommonOptions): P : null; const validationTraceId = typeof validationTrace?.traceId === "string" ? validationTrace.traceId : null; const validationTraceOk = validationTrace?.ok === true; + const ok = result.exitCode === 0 && ready && validationTraceOk; + if (!options.full && !options.raw) { + return renderValidateTable({ + ok, + target, + summary, + validationTrace, + validationTraceId, + remote: parsed === null ? compactCapture(result, { full: false }) : null, + }); + } return { - ok: result.exitCode === 0 && ready && validationTraceOk, + ok, action: "platform-infra-observability-validate", mutation: false, target: targetSummary(target), @@ -235,3 +246,60 @@ export async function validate(config: UniDeskConfig, options: CommonOptions): P remote: options.raw ? parsed : compactStatus(parsed, options.full) ?? compactCapture(result, { full: true }), }; } + +function renderValidateTable(input: { + ok: boolean; + target: ObservabilityTarget; + summary: Record | null; + validationTrace: Record | null; + validationTraceId: string | null; + remote: Record | null; +}): RenderedCliResult { + const ingest = input.validationTrace === null ? null : asRecord(input.validationTrace.ingest); + const query = input.validationTrace === null ? null : asRecord(input.validationTrace.query); + const lines = [ + `platform-infra observability validate (${input.ok ? "ok" : "not-ok"})`, + "", + `target=${input.target.id} namespace=${input.target.namespace} ready=${textValue(input.summary?.ready)} route=${input.target.route}`, + "", + "Runtime:", + formatTable(["DEPLOYMENTS", "SERVICES", "PODS", "PROBES"], [[ + String(recordList(input.summary?.deployments).length), + String(Array.isArray(input.summary?.services) ? input.summary.services.length : 0), + String(recordList(input.summary?.pods).length), + String(recordList(input.summary?.probes).length), + ]]), + "", + "Validation trace:", + formatTable(["TRACE", "STAGE", "INGEST", "QUERY", "VALUES_PRINTED"], [[ + shortenEnd(input.validationTraceId ?? "-", 32), + textValue(input.validationTrace?.stage), + textValue(ingest?.ok), + textValue(query?.ok), + textValue(input.validationTrace?.valuesPrinted), + ]]), + ]; + if (input.remote !== null) { + lines.push("", "Remote:"); + lines.push(` ${shortenEnd(JSON.stringify(input.remote), 240)}`); + } + lines.push("", "Next:"); + if (input.validationTraceId !== null) { + lines.push(` bun scripts/cli.ts platform-infra observability trace --target ${input.target.id} --trace-id ${input.validationTraceId}`); + } + lines.push(` bun scripts/cli.ts platform-infra observability status --target ${input.target.id}`); + lines.push("", "Disclosure:"); + lines.push(" default view is a bounded validation table; use --full for compact JSON or --raw for backend/parser debugging."); + return { + ok: input.ok, + command: "platform-infra observability validate", + contentType: "text/plain", + renderedText: lines.join("\n"), + }; +} + +function asRecord(value: unknown): Record | null { + return typeof value === "object" && value !== null && !Array.isArray(value) + ? value as Record + : null; +}