























@@ -73,6 +73,12 @@ type CaseResult = {
7373};
7474};
757576+type BenchmarkFailure = {
77+id: string;
78+reason: string;
79+sampleIndex: number;
80+};
81+7682type PluginFixtureResult = {
7783pluginIds: string[];
7884pluginsDir: string;
@@ -372,6 +378,58 @@ function summarizeCase(benchCase: GatewayBenchCase, samples: GatewaySample[]): C
372378};
373379}
374380381+function collectResultFailures(
382+results: CaseResult[],
383+options: { processMetricsRequired?: boolean } = {},
384+): BenchmarkFailure[] {
385+const processMetricsRequired = options.processMetricsRequired ?? process.platform !== "win32";
386+const failures: BenchmarkFailure[] = [];
387+for (const result of results) {
388+result.samples.forEach((sample, index) => {
389+const missing: string[] = [];
390+if (sample.healthz.status !== 200 || sample.healthz.ms == null) {
391+missing.push("/healthz");
392+}
393+if (sample.readyz.status !== 200 || sample.readyz.ms == null) {
394+missing.push("/readyz");
395+}
396+if (processMetricsRequired) {
397+if (sample.cpuMs == null || sample.cpuCoreRatio == null) {
398+missing.push("cpu");
399+}
400+if (sample.maxRssMb == null) {
401+missing.push("rss");
402+}
403+}
404+if (missing.length > 0) {
405+failures.push({
406+id: result.id,
407+reason: `missing ${missing.join(", ")}`,
408+sampleIndex: index + 1,
409+});
410+}
411+});
412+}
413+return failures;
414+}
415+416+function printBenchmarkFailures(failures: BenchmarkFailure[]): void {
417+if (failures.length === 0) {
418+return;
419+}
420+console.error(
421+`[gateway-startup-bench] failed: ${failures.length} sample(s) did not produce ready probes or process metrics`,
422+);
423+for (const failure of failures.slice(0, 8)) {
424+console.error(
425+`[gateway-startup-bench] ${failure.id} run ${failure.sampleIndex}: ${failure.reason}`,
426+);
427+}
428+if (failures.length > 8) {
429+console.error(`[gateway-startup-bench] ${failures.length - 8} more sample failure(s) omitted`);
430+}
431+}
432+375433function formatMs(value: number | null): string {
376434if (value == null) {
377435return "n/a";
@@ -1029,16 +1087,23 @@ async function main() {
10291087}
10301088if (options.json) {
10311089console.log(JSON.stringify(payload, null, 2));
1032-return;
1090+} else {
1091+for (const result of results) {
1092+printResult(result);
1093+}
10331094}
1034-for (const result of results) {
1035-printResult(result);
1095+1096+const failures = collectResultFailures(results);
1097+if (failures.length > 0) {
1098+printBenchmarkFailures(failures);
1099+process.exitCode = 1;
10361100}
10371101}
1038110210391103export const testing = {
10401104 classifyGatewayReadyLog,
10411105 classifyProbeErrorKind,
1106+ collectResultFailures,
10421107 collectStartupTrace,
10431108 parseNonNegativeInt,
10441109 parsePositiveInt,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。