




















@@ -277,6 +277,7 @@ export type QaSuiteSummaryJsonParams = {
277277scenarios: QaSuiteScenarioResult[];
278278startedAt: Date;
279279finishedAt: Date;
280+metrics?: QaSuiteSummaryJson["metrics"];
280281providerMode: QaProviderMode;
281282primaryModel: string;
282283alternateModel: string;
@@ -317,6 +318,7 @@ export function buildQaSuiteSummaryJson(params: QaSuiteSummaryJsonParams): QaSui
317318passed: params.scenarios.filter((scenario) => scenario.status === "pass").length,
318319failed: countQaSuiteFailedScenarios(params.scenarios),
319320},
321+ ...(params.metrics ? { metrics: params.metrics } : {}),
320322run: {
321323startedAt: params.startedAt.toISOString(),
322324finishedAt: params.finishedAt.toISOString(),
@@ -340,6 +342,7 @@ async function writeQaSuiteArtifacts(params: {
340342startedAt: Date;
341343finishedAt: Date;
342344scenarios: QaSuiteScenarioResult[];
345+metrics?: QaSuiteSummaryJson["metrics"];
343346transport: QaTransportAdapter;
344347// Reuse the canonical QaProviderMode union instead of re-declaring it
345348// inline. Loop 6 already unified `QaSuiteSummaryJsonParams.providerMode`
@@ -376,6 +379,27 @@ async function writeQaSuiteArtifacts(params: {
376379return { report, reportPath, summaryPath };
377380}
378381382+function buildQaSuiteRuntimeMetrics(params: {
383+startedAt: Date;
384+finishedAt: Date;
385+gatewayProcessCpuStartMs: number | null;
386+gatewayProcessCpuEndMs: number | null;
387+}): QaSuiteSummaryJson["metrics"] {
388+const wallMs = Math.max(1, params.finishedAt.getTime() - params.startedAt.getTime());
389+if (params.gatewayProcessCpuStartMs === null || params.gatewayProcessCpuEndMs === null) {
390+return { wallMs };
391+}
392+const gatewayProcessCpuMs = Math.max(
393+0,
394+params.gatewayProcessCpuEndMs - params.gatewayProcessCpuStartMs,
395+);
396+return {
397+ wallMs,
398+ gatewayProcessCpuMs,
399+gatewayCpuCoreRatio: Math.round((gatewayProcessCpuMs / wallMs) * 1000) / 1000,
400+};
401+}
402+379403export async function runQaSuite(params?: QaSuiteRunParams): Promise<QaSuiteResult> {
380404const startedAt = new Date();
381405const repoRoot = path.resolve(params?.repoRoot ?? process.cwd());
@@ -730,6 +754,7 @@ export async function runQaSuite(params?: QaSuiteRunParams): Promise<QaSuiteResu
730754scenarios: liveScenarioOutcomes,
731755});
732756757+const gatewayProcessCpuStartMs = gateway.getProcessCpuMs?.() ?? null;
733758for (const [index, scenario] of selectedCatalogScenarios.entries()) {
734759const scenarioIdForLog = sanitizeQaSuiteProgressValue(scenario.id);
735760writeQaSuiteProgress(
@@ -773,6 +798,12 @@ export async function runQaSuite(params?: QaSuiteRunParams): Promise<QaSuiteResu
773798}
774799775800const finishedAt = new Date();
801+const metrics = buildQaSuiteRuntimeMetrics({
802+ startedAt,
803+ finishedAt,
804+ gatewayProcessCpuStartMs,
805+gatewayProcessCpuEndMs: gateway.getProcessCpuMs?.() ?? null,
806+});
776807const failedCount = scenarios.filter((scenario) => scenario.status === "fail").length;
777808if (scenarios.some((scenario) => scenario.status === "fail")) {
778809preserveGatewayRuntimeDir = path.join(outputDir, "artifacts", "gateway-runtime");
@@ -789,6 +820,7 @@ export async function runQaSuite(params?: QaSuiteRunParams): Promise<QaSuiteResu
789820 startedAt,
790821 finishedAt,
791822 scenarios,
823+ metrics,
792824 transport,
793825 providerMode,
794826 primaryModel,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。