feat(iwooos): show controlled cd lane live metric proof
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 1s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Failing after 42s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 1s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Failing after 42s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
This commit is contained in:
@@ -9111,6 +9111,20 @@
|
||||
"value": "guardrails blocked"
|
||||
}
|
||||
},
|
||||
"liveMetrics": {
|
||||
"enforcer": "110 enforcer",
|
||||
"ready": "metric fresh",
|
||||
"missing": "metric missing",
|
||||
"enforcerDetail": "apply={apply} · metadata-only={metadata}",
|
||||
"drainGuard": "Drain guard",
|
||||
"drainGuardValue": "active={active} / staging={staging}",
|
||||
"blockers": "blockers={count}",
|
||||
"jobs": "Jobs / lane",
|
||||
"jobsValue": "jobs={jobs} / lane={lane}",
|
||||
"restoreSources": "restore sources={count}",
|
||||
"load": "110 load",
|
||||
"loadValue": "load5/core={value}"
|
||||
},
|
||||
"metrics": {
|
||||
"tags": "Tags",
|
||||
"groups": "Groups",
|
||||
|
||||
@@ -9111,6 +9111,20 @@
|
||||
"value": "guardrails blocked"
|
||||
}
|
||||
},
|
||||
"liveMetrics": {
|
||||
"enforcer": "110 enforcer",
|
||||
"ready": "metric 已更新",
|
||||
"missing": "metric 未讀回",
|
||||
"enforcerDetail": "apply={apply} · metadata-only={metadata}",
|
||||
"drainGuard": "Drain guard",
|
||||
"drainGuardValue": "active={active} / staging={staging}",
|
||||
"blockers": "阻塞={count}",
|
||||
"jobs": "Jobs / lane",
|
||||
"jobsValue": "jobs={jobs} / lane={lane}",
|
||||
"restoreSources": "restore sources={count}",
|
||||
"load": "110 load",
|
||||
"loadValue": "load5/core={value}"
|
||||
},
|
||||
"metrics": {
|
||||
"tags": "Tags",
|
||||
"groups": "分群鍵",
|
||||
|
||||
@@ -1046,6 +1046,21 @@ type PriorityWorkOrderResponse = {
|
||||
ai_loop_current_blocker_safe_next_action_command?: string | null;
|
||||
ai_loop_current_blocker_safe_next_action_post_verifier?: string | null;
|
||||
ai_loop_current_blocker_safe_next_action_requires_local_console?: boolean | null;
|
||||
controlled_cd_lane_live_metric_status?: string | null;
|
||||
controlled_cd_lane_live_metric_metadata_only?: boolean | null;
|
||||
controlled_cd_lane_live_enforcer_metric_present?: boolean | null;
|
||||
controlled_cd_lane_live_enforcer_last_run_fresh?: boolean | null;
|
||||
controlled_cd_lane_live_enforcer_apply_performed?: number | null;
|
||||
controlled_cd_lane_live_active_job_containers?: number | null;
|
||||
controlled_cd_lane_live_lane_process_count?: number | null;
|
||||
controlled_cd_lane_live_root_restore_sources_left?: number | null;
|
||||
controlled_cd_lane_live_controlled_drain_active_allowed?: boolean | null;
|
||||
controlled_cd_lane_live_controlled_drain_staging_allowed?: boolean | null;
|
||||
controlled_cd_lane_live_host_load5_per_core?: number | null;
|
||||
controlled_cd_lane_live_gitea_actions_active_container_count?: number | null;
|
||||
controlled_cd_lane_live_gitea_actions_active_process_count?: number | null;
|
||||
controlled_cd_lane_live_metric_blocker_count?: number | null;
|
||||
controlled_cd_lane_live_metric_blockers?: string[] | null;
|
||||
ai_loop_log_source_grouping_key_count?: number | null;
|
||||
ai_loop_log_source_grouping_keys?: string[] | null;
|
||||
ai_loop_log_source_tagging_contract_count?: number | null;
|
||||
@@ -1066,6 +1081,21 @@ type PriorityWorkOrderResponse = {
|
||||
ai_loop_current_blocker_safe_next_action_command?: string | null;
|
||||
ai_loop_current_blocker_safe_next_action_post_verifier?: string | null;
|
||||
ai_loop_current_blocker_safe_next_action_requires_local_console?: boolean | null;
|
||||
controlled_cd_lane_live_metric_status?: string | null;
|
||||
controlled_cd_lane_live_metric_metadata_only?: boolean | null;
|
||||
controlled_cd_lane_live_enforcer_metric_present?: boolean | null;
|
||||
controlled_cd_lane_live_enforcer_last_run_fresh?: boolean | null;
|
||||
controlled_cd_lane_live_enforcer_apply_performed?: number | null;
|
||||
controlled_cd_lane_live_active_job_containers?: number | null;
|
||||
controlled_cd_lane_live_lane_process_count?: number | null;
|
||||
controlled_cd_lane_live_root_restore_sources_left?: number | null;
|
||||
controlled_cd_lane_live_controlled_drain_active_allowed?: boolean | null;
|
||||
controlled_cd_lane_live_controlled_drain_staging_allowed?: boolean | null;
|
||||
controlled_cd_lane_live_host_load5_per_core?: number | null;
|
||||
controlled_cd_lane_live_gitea_actions_active_container_count?: number | null;
|
||||
controlled_cd_lane_live_gitea_actions_active_process_count?: number | null;
|
||||
controlled_cd_lane_live_metric_blocker_count?: number | null;
|
||||
controlled_cd_lane_live_metric_blockers?: string[] | null;
|
||||
} | null;
|
||||
}>;
|
||||
};
|
||||
@@ -7851,6 +7881,54 @@ function AiLoopLogSourceTagsPanel({
|
||||
summary?.ai_loop_current_blocker_deployment_closure_state ??
|
||||
evidence?.ai_loop_current_blocker_deployment_closure_state ??
|
||||
"";
|
||||
const liveMetricStatus =
|
||||
summary?.controlled_cd_lane_live_metric_status ??
|
||||
evidence?.controlled_cd_lane_live_metric_status ??
|
||||
"";
|
||||
const liveMetricMetadataOnly =
|
||||
summary?.controlled_cd_lane_live_metric_metadata_only ??
|
||||
evidence?.controlled_cd_lane_live_metric_metadata_only ??
|
||||
false;
|
||||
const liveEnforcerMetricPresent =
|
||||
summary?.controlled_cd_lane_live_enforcer_metric_present ??
|
||||
evidence?.controlled_cd_lane_live_enforcer_metric_present ??
|
||||
false;
|
||||
const liveEnforcerFresh =
|
||||
summary?.controlled_cd_lane_live_enforcer_last_run_fresh ??
|
||||
evidence?.controlled_cd_lane_live_enforcer_last_run_fresh ??
|
||||
false;
|
||||
const liveEnforcerApplyPerformed =
|
||||
summary?.controlled_cd_lane_live_enforcer_apply_performed ??
|
||||
evidence?.controlled_cd_lane_live_enforcer_apply_performed ??
|
||||
0;
|
||||
const liveActiveAllowed =
|
||||
summary?.controlled_cd_lane_live_controlled_drain_active_allowed ??
|
||||
evidence?.controlled_cd_lane_live_controlled_drain_active_allowed ??
|
||||
false;
|
||||
const liveStagingAllowed =
|
||||
summary?.controlled_cd_lane_live_controlled_drain_staging_allowed ??
|
||||
evidence?.controlled_cd_lane_live_controlled_drain_staging_allowed ??
|
||||
false;
|
||||
const liveActiveJobContainers =
|
||||
summary?.controlled_cd_lane_live_active_job_containers ??
|
||||
evidence?.controlled_cd_lane_live_active_job_containers ??
|
||||
0;
|
||||
const liveLaneProcessCount =
|
||||
summary?.controlled_cd_lane_live_lane_process_count ??
|
||||
evidence?.controlled_cd_lane_live_lane_process_count ??
|
||||
0;
|
||||
const liveRootRestoreSourcesLeft =
|
||||
summary?.controlled_cd_lane_live_root_restore_sources_left ??
|
||||
evidence?.controlled_cd_lane_live_root_restore_sources_left ??
|
||||
0;
|
||||
const liveHostLoad5PerCore =
|
||||
summary?.controlled_cd_lane_live_host_load5_per_core ??
|
||||
evidence?.controlled_cd_lane_live_host_load5_per_core ??
|
||||
0;
|
||||
const liveMetricBlockerCount =
|
||||
summary?.controlled_cd_lane_live_metric_blocker_count ??
|
||||
evidence?.controlled_cd_lane_live_metric_blocker_count ??
|
||||
0;
|
||||
const currentBlockerId = summary?.ai_loop_current_blocker_id ?? "";
|
||||
const controlledCdLaneGuardrailsBlocked =
|
||||
currentBlockerId === "controlled_cd_lane_guardrails_blocked";
|
||||
@@ -7912,6 +7990,75 @@ function AiLoopLogSourceTagsPanel({
|
||||
ids: receiptOutputIds,
|
||||
},
|
||||
];
|
||||
const liveMetricCards =
|
||||
controlledCdLaneGuardrailsBlocked && liveMetricStatus
|
||||
? [
|
||||
{
|
||||
key: "enforcer",
|
||||
icon: ShieldCheck,
|
||||
label: t("liveMetrics.enforcer"),
|
||||
value:
|
||||
liveEnforcerMetricPresent && liveEnforcerFresh
|
||||
? t("liveMetrics.ready")
|
||||
: t("liveMetrics.missing"),
|
||||
detail: t("liveMetrics.enforcerDetail", {
|
||||
apply: String(liveEnforcerApplyPerformed),
|
||||
metadata: String(Boolean(liveMetricMetadataOnly)),
|
||||
}),
|
||||
tone:
|
||||
liveEnforcerMetricPresent && liveEnforcerFresh
|
||||
? "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]"
|
||||
: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]",
|
||||
},
|
||||
{
|
||||
key: "drain-guard",
|
||||
icon: Activity,
|
||||
label: t("liveMetrics.drainGuard"),
|
||||
value: t("liveMetrics.drainGuardValue", {
|
||||
active: String(Boolean(liveActiveAllowed)),
|
||||
staging: String(Boolean(liveStagingAllowed)),
|
||||
}),
|
||||
detail: t("liveMetrics.blockers", {
|
||||
count: liveMetricBlockerCount,
|
||||
}),
|
||||
tone:
|
||||
liveActiveAllowed || liveStagingAllowed
|
||||
? "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]"
|
||||
: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]",
|
||||
},
|
||||
{
|
||||
key: "jobs",
|
||||
icon: ListChecks,
|
||||
label: t("liveMetrics.jobs"),
|
||||
value: t("liveMetrics.jobsValue", {
|
||||
jobs: liveActiveJobContainers,
|
||||
lane: liveLaneProcessCount,
|
||||
}),
|
||||
detail: t("liveMetrics.restoreSources", {
|
||||
count: liveRootRestoreSourcesLeft,
|
||||
}),
|
||||
tone:
|
||||
liveActiveJobContainers === 0 &&
|
||||
liveLaneProcessCount === 0 &&
|
||||
liveRootRestoreSourcesLeft === 0
|
||||
? "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]"
|
||||
: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]",
|
||||
},
|
||||
{
|
||||
key: "load",
|
||||
icon: Gauge,
|
||||
label: t("liveMetrics.load"),
|
||||
value: t("liveMetrics.loadValue", {
|
||||
value: liveHostLoad5PerCore.toFixed(2),
|
||||
}),
|
||||
detail: liveMetricStatus,
|
||||
tone:
|
||||
liveHostLoad5PerCore <= 1
|
||||
? "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]"
|
||||
: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]",
|
||||
},
|
||||
]
|
||||
: [];
|
||||
const rootCause = queueNormalizerFieldIds.some((id) =>
|
||||
id.includes("server_accepts_key_then_session_timeout")
|
||||
)
|
||||
@@ -8076,6 +8223,35 @@ function AiLoopLogSourceTagsPanel({
|
||||
))}
|
||||
</div>
|
||||
) : null}
|
||||
{liveMetricCards.length > 0 ? (
|
||||
<div
|
||||
className="mt-3 grid gap-2 border border-[#d8d3c7] bg-white p-2 sm:grid-cols-2 xl:grid-cols-4"
|
||||
data-testid="ai-loop-controlled-cd-lane-live-metrics"
|
||||
>
|
||||
{liveMetricCards.map((metric) => {
|
||||
const Icon = metric.icon;
|
||||
return (
|
||||
<div
|
||||
key={metric.key}
|
||||
className={cn("min-w-0 border px-3 py-2", metric.tone)}
|
||||
>
|
||||
<div className="flex items-center justify-between gap-2">
|
||||
<span className="text-[11px] font-semibold">
|
||||
{metric.label}
|
||||
</span>
|
||||
<Icon className="h-3.5 w-3.5 shrink-0" aria-hidden="true" />
|
||||
</div>
|
||||
<div className="mt-2 break-words font-mono text-xs font-semibold text-[#141413]">
|
||||
{loading ? "--" : metric.value}
|
||||
</div>
|
||||
<div className="mt-1 break-words font-mono text-[10px] leading-4 text-[#5f5b52]">
|
||||
{loading ? "--" : metric.detail}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
) : null}
|
||||
<div className="mt-4 grid gap-px border border-[#e0ddd4] bg-[#e0ddd4] sm:grid-cols-2 xl:grid-cols-4">
|
||||
{metrics.map((metric) => {
|
||||
const Icon = metric.icon;
|
||||
|
||||
Reference in New Issue
Block a user