feat(agent): automate sustained host load response
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Failing after 28s
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 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Failing after 28s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
This commit is contained in:
@@ -17,7 +17,7 @@ read-only exporter -> Prometheus alert -> AI triage packet -> KM / PlayBook evid
|
||||
|
||||
| 類型 | 判定 | 處理 |
|
||||
|------|------|------|
|
||||
| orphan browser smoke | headless Chrome / Chromium / Playwright process group 存活過久、PPID=1 或 group leader 消失、CPU 合計過高 | 走 dry-run 修復包;人工批准後可送 `SIGTERM` |
|
||||
| orphan browser smoke | headless Chrome / Chromium / Playwright process group 存活過久、PPID=1 或 group leader 消失、CPU 合計過高 | 走 dry-run 修復包;controlled apply receipt + evidence + verifier 成立後可送 `SIGTERM` |
|
||||
| 合法 CI load | Gitea Actions task container 正在跑,沒有 orphan browser 指標 | 觀察 queue / timeout;不要誤殺 |
|
||||
| Docker / Sentry / Harbor 事故 | container restart、port down、journal error、cold-start gate blocked | 走各服務自己的 SOP,不使用本 PlayBook 殺 process |
|
||||
| swap 已滿但未 thrash | swap ratio 高但 `vmstat` / load 分類未顯示即時 thrash | 不手動清 swap;先降高 CPU 來源 |
|
||||
@@ -50,7 +50,7 @@ read-only exporter -> Prometheus alert -> AI triage packet -> KM / PlayBook evid
|
||||
|
||||
| Alert | 條件 | 行動 |
|
||||
|-------|------|------|
|
||||
| `HostOrphanBrowserSmokeHighCpu` | orphan browser group `> 0` 且 CPU `>= 100%` 持續 10 分鐘 | 產生 dry-run 修復包,確認 owner / 維護窗口 / evidence |
|
||||
| `HostOrphanBrowserSmokeHighCpu` | orphan browser group `> 0` 且 CPU `>= 100%` 持續 10 分鐘 | 產生 dry-run 修復包,補 controlled apply id / evidence / post verifier |
|
||||
| `HostCiRunnerLoadSaturation` | load5/core `> 1.0` 且 active Gitea Actions `> 0` | 標為短期 CI 負載,檢查 runner queue,不直接 kill |
|
||||
| `HostRunawayProcessMonitorMissing` / `Stale` | exporter 缺失或超過 10 分鐘未更新 | 修 exporter / cron / textfile collector |
|
||||
| `HostRunawayProcessRemediationUnexpectedlyAuthorized` | `remediation_authorized > 0` | 立即回滾;禁止把監控器改成執行器 |
|
||||
@@ -59,11 +59,11 @@ Telegram / AI event packet contract:
|
||||
|
||||
| Alert / input | Telegram lane | 必須顯示 |
|
||||
|---------------|---------------|----------|
|
||||
| `HostOrphanBrowserSmokeHighCpu` | `orphan_browser_smoke_runaway_process` | alertname、host、rule、runaway dry-run、owner / maintenance / evidence gate、KM / PlayBook / Verifier 回寫 |
|
||||
| `HostOrphanBrowserSmokeHighCpu` | `orphan_browser_smoke_runaway_process` | alertname、host、rule、runaway dry-run、controlled apply id、evidence ref、post verifier、KM / PlayBook / Verifier 回寫 |
|
||||
| `HostCiRunnerLoadSaturation` | `ci_runner_load_saturation` | Gitea Actions run、runner queue、load/core、swap trend、capacity / queue 判定、不做 process remediation |
|
||||
| raw `CPU 警告` / `ps aux` dump | `runner_build_resource_pressure`、`runner_prisma_generate_resource_pressure` 或 `host_resource_pressure_triage` | sanitized top process evidence,不顯示 raw workspace path、hosted toolcache path、`node_modules` path、外部 URL、JSON payload 或完整 process dump |
|
||||
| raw `CPU 警告` / `ps aux` dump | `runner_build_resource_pressure`、`runner_prisma_generate_resource_pressure` 或 `host_resource_pressure_triage` | `host-sustained-load-evidence.py` 產生 sanitized top process / container evidence,不顯示 raw workspace path、hosted toolcache path、`node_modules` path、外部 URL、JSON payload 或完整 process dump |
|
||||
|
||||
所有 Telegram 卡片都必須保留 `runtime_write_gate=0`,並不得把 alert/card 轉成直接 kill / restart / reload 指令。
|
||||
所有 Telegram 卡片都必須明確顯示 `runtime_write_gate=controlled/0`、`controlled_apply_allowed`、post verifier 與 forbidden actions,並不得把 alert/card 轉成直接 kill / restart / reload 指令。
|
||||
|
||||
Host / runner raw dump 進入 Telegram 前必須先被 `TelegramGateway` 壓成 `P1/P2/P3 主機資源壓力` 卡片。第一屏只允許顯示 CPU、load、root process count、AI lane、candidate gate、Top evidence 與禁止事項;完整命令列、套件 JSON、外部檢查 endpoint、內部 workspace path 與 raw `ps aux` 必須留在內部 evidence / timeline,不得外送。
|
||||
|
||||
@@ -89,24 +89,36 @@ dry-run 必須檢查:
|
||||
3. `oldest_age_seconds` 超過 PlayBook 門檻。
|
||||
4. `active Gitea Actions` 與候選 process group 不是同一個仍在跑的合法 job。
|
||||
5. 不是 Docker daemon、Sentry、Harbor、PostgreSQL、ClickHouse、K3s 或 backup 服務本體。
|
||||
6. 已有 owner / 維護窗口 / evidence ref。
|
||||
6. 已有 controlled apply id、evidence ref、post verifier;owner / 維護窗口只作額外 evidence,不作 low-blast orphan cleanup 的預設阻擋。
|
||||
|
||||
如果只看到 `HostCiRunnerLoadSaturation`,且 orphan group count 為 `0`,預設判定是「合法 CI 短期負載」,不得自動修復。
|
||||
如果只看到 `HostCiRunnerLoadSaturation`,且 orphan group count 為 `0`,預設判定是「合法 CI 短期負載」,不得自動殺 process;只能走 runner queue verifier、stale-run drain/cancel packet 與 host pressure fail-closed。
|
||||
|
||||
如果只看到 `HostLoadAverageSustainedHigh`,且 orphan / active CI / swap 都無明確命中,AI 必須先跑只讀脫敏 evidence collector:
|
||||
|
||||
```bash
|
||||
python3 scripts/ops/host-sustained-load-evidence.py \
|
||||
--host 110 \
|
||||
--metrics-file /home/wooo/node_exporter_textfiles/host_runaway_process.prom \
|
||||
--docker-stats-file /home/wooo/node_exporter_textfiles/docker_stats.prom \
|
||||
--json
|
||||
```
|
||||
|
||||
collector 只輸出 process family、container CPU 與 PlayBook recommendation,不輸出 raw command line、workspace path、URL、JSON payload 或 secret。
|
||||
|
||||
---
|
||||
|
||||
## 4. Gated Remediation
|
||||
|
||||
真正送 `SIGTERM` 時必須帶齊三個 gate:
|
||||
真正送 `SIGTERM` 時必須帶齊 controlled apply gate:
|
||||
|
||||
```bash
|
||||
python3 scripts/ops/host-runaway-process-remediation.py \
|
||||
--apply \
|
||||
--confirm-apply \
|
||||
--rule stockplatform_headless_smoke \
|
||||
--owner-approval-id OWNER-APPROVAL-REDACTED \
|
||||
--maintenance-window-id MW-REDACTED \
|
||||
--controlled-apply-id CAP-REDACTED \
|
||||
--evidence-ref INC-REDACTED \
|
||||
--post-apply-verifier "scripts/ops/host-sustained-load-controller.py --host 110 --json" \
|
||||
--wait-seconds 5
|
||||
```
|
||||
|
||||
@@ -138,10 +150,10 @@ active Gitea Actions 若仍存在,告警降級為 CI load,而非 orphan smok
|
||||
| 資產 | 必填欄位 |
|
||||
|------|----------|
|
||||
| Incident evidence | alert name、host、rule、pgid count、cpu percent、oldest age、active CI count、swap ratio |
|
||||
| PlayBook run | dry-run payload、owner approval id、maintenance window id、evidence ref、actual signal summary |
|
||||
| PlayBook run | dry-run payload、controlled apply id、optional owner / maintenance evidence、evidence ref、post verifier、actual signal summary |
|
||||
| KM entry | 根因分類、誤判防護、修復結果、recurrence guard |
|
||||
| Verifier | post-check 指標、load trend、orphan group count、runner queue state |
|
||||
| Work item | 如果缺 owner / evidence / maintenance window,建立補件項,不假性拉高 runtime gate |
|
||||
| Work item | 如果缺 controlled apply id / evidence ref / post verifier,建立補件項;owner / maintenance 只作 optional evidence,不假性拉高 runtime gate |
|
||||
|
||||
產品上的結論必須分開呈現:
|
||||
|
||||
@@ -150,7 +162,7 @@ monitoring_ready=true
|
||||
alert_ready=true
|
||||
playbook_ready=true
|
||||
km_writeback_required=true
|
||||
runtime_remediation_authorized=false unless gated apply is executed
|
||||
runtime_write_gate=controlled for allowlisted orphan browser cleanup; 0/false is evidence only unless critical break-glass applies
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user