按运行更新时间展示最近 {{ trendRows.length }} 次巡检耗时,单位为分钟
+按运行更新时间展示最近 {{ trendRows.length }} 次巡检的耗时、独立错误类型和独立告警类型
{{ commandSummary(selectedDetail) }}
@@ -963,6 +1065,14 @@ function formatMinutes(value) {
return `${Number.isInteger(rounded) ? String(rounded) : String(rounded).replace(/0+$/u, "").replace(/\.$/u, "")} 分钟`;
}
+function formatMb(value) {
+ const numberValue = optionalNumber(value);
+ if (numberValue === null) return "-";
+ const rounded = Math.round(numberValue * 100) / 100;
+ const text = rounded >= 100 ? String(Math.round(rounded)) : rounded >= 10 ? rounded.toFixed(1).replace(/\.0$/u, "") : rounded.toFixed(2).replace(/0+$/u, "").replace(/\.$/u, "");
+ return `${text} MB`;
+}
+
function runDurationText(run) {
const timing = run?.timing || {};
return formatMinutes(optionalNumber(run?.runDurationMinutes, run?.durationMinutes, timing.runDurationMinutes, timing.durationMinutes));
diff --git a/scripts/src/hwlab-node-web-sentinel-cicd.ts b/scripts/src/hwlab-node-web-sentinel-cicd.ts
index adb74ecc..b780f33f 100644
--- a/scripts/src/hwlab-node-web-sentinel-cicd.ts
+++ b/scripts/src/hwlab-node-web-sentinel-cicd.ts
@@ -121,6 +121,7 @@ export type WebProbeSentinelOptions =
readonly viewport: string;
readonly localDir: string;
readonly name: string | null;
+ readonly runId: string | null;
readonly timeoutMs: number;
readonly waitTimeoutMs: number;
readonly timeoutSeconds: number;
@@ -788,6 +789,7 @@ function publishCurrentDashboardOptions(state: SentinelCicdState, timeoutSeconds
viewport: stringAt(dashboard, "viewport"),
localDir: "/tmp",
name: null,
+ runId: null,
timeoutMs,
waitTimeoutMs,
timeoutSeconds: Math.min(numberAt(dashboard, "commandTimeoutSeconds"), Math.max(1, Math.trunc(timeoutSeconds))),
diff --git a/scripts/src/hwlab-node-web-sentinel-config.ts b/scripts/src/hwlab-node-web-sentinel-config.ts
index a10bd640..23280877 100644
--- a/scripts/src/hwlab-node-web-sentinel-config.ts
+++ b/scripts/src/hwlab-node-web-sentinel-config.ts
@@ -102,7 +102,7 @@ const REQUIRED_TARGET_SHAPES: Record