feat(ai-ops): ADR-013 AIOps 自動修復閉環完整實作
Some checks failed
CD Pipeline / deploy (push) Failing after 3m24s
Some checks failed
CD Pipeline / deploy (push) Failing after 3m24s
架構(Exception → Incident → PlayBook → Heal → KM → Telegram): 新增元件: - database/autoheal_models.py: Incident/Playbook/HealLog 三張表 + 7 條種子 PlayBook - migrations/013_autoheal.sql: 建表 DDL + 種子資料(冪等 INSERT) - services/auto_heal_service.py: 核心引擎 7 步閉環 - _classify_error: 8 類錯誤自動分類 (DNS_FAIL/DB_UNREACHABLE/OOM/...) - _match_playbook: error_type + keyword + 冷卻 + max_retries 保護 - _execute_playbook: DOCKER_RESTART/SSH_CMD/ALERT_ONLY/WAIT_RETRY - _sink_to_km: 修復知識寫入 ai_insights (auto_heal_playbook) - SSH 白名單:僅允許 docker restart / compose restart / docker start 修改元件: - database/manager.py: _init_autoheal_tables() 啟動時建表+種子 PlayBook - scheduler.py: 3 個核心任務植入 handle_exception (run_auto_import_task / run_icaim_analysis_task / run_weekly_strategy_task) - requirements.txt: paramiko(SSH 跳板;不可用時降級 subprocess+CLI ssh) 安全設計: CMD 白名單 + cooldown + max_retries escalation + DB 冪等 migration Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
69
docs/adr/ADR-013-aiops-autoheal.md
Normal file
69
docs/adr/ADR-013-aiops-autoheal.md
Normal file
@@ -0,0 +1,69 @@
|
||||
# ADR-013: AIOps 自動修復閉環架構
|
||||
|
||||
**狀態**: Accepted
|
||||
**日期**: 2026-04-19
|
||||
**提案者**: Antigravity
|
||||
|
||||
---
|
||||
|
||||
## 背景與問題
|
||||
|
||||
EwoooC 系統已有 L1 Hermes 告警派發,但告警只能「通知」,無法「自癒」。
|
||||
當 `psycopg2.OperationalError: could not translate host name "momo-postgres"` 這類明確的基礎設施問題發生時,仍需人工 SSH 登入修復,缺乏自動化閉環。
|
||||
|
||||
---
|
||||
|
||||
## 決策
|
||||
|
||||
建立三層 AIOps 閉環架構:
|
||||
|
||||
```
|
||||
Exception → Incident(DB) → PlayBook 匹配 → Auto-Heal 執行 → HealLog(DB) → KM 沉澱(ai_insights) → Telegram 通知
|
||||
```
|
||||
|
||||
### 新增元件
|
||||
|
||||
| 元件 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `database/autoheal_models.py` | Model | Incident / Playbook / HealLog 三張表 |
|
||||
| `migrations/013_autoheal.sql` | Migration | 建表 + 種子 PlayBook 植入 |
|
||||
| `services/auto_heal_service.py` | Service | 核心引擎(分類、匹配、執行、沉澱) |
|
||||
| `database/manager.py` | 修改 | 加入 `_init_autoheal_tables()` |
|
||||
| `scheduler.py` | 修改 | 三個核心任務植入 `handle_exception` |
|
||||
| `requirements.txt` | 修改 | 加入 `paramiko` |
|
||||
|
||||
### PlayBook 動作類型
|
||||
|
||||
| action_type | 說明 |
|
||||
|---|---|
|
||||
| `DOCKER_RESTART` | 透過 SSH 跳板 restart 指定容器 |
|
||||
| `SSH_CMD` | 執行白名單內的任意 SSH 指令 |
|
||||
| `ALERT_ONLY` | 僅發 Telegram 告警,人工介入 |
|
||||
| `WAIT_RETRY` | 紀錄後等待排程重試 |
|
||||
|
||||
### 安全設計
|
||||
|
||||
- SSH 指令白名單:僅允許 `docker restart *`, `docker compose restart *`, `docker start *`
|
||||
- 冷卻機制:同 PlayBook 在 `cooldown_min` 內不重複觸發
|
||||
- 升級機制:達到 `max_retries` 後 incident.status = `escalated` 並通知人工
|
||||
|
||||
### KM 沉澱格式
|
||||
|
||||
每次修復後寫入 `ai_insights`:
|
||||
- `insight_type = "auto_heal_playbook"`
|
||||
- 包含事件、症狀、行動、結果、教訓五要素
|
||||
- 自動排入 `embedding_retry_queue` 完成 RAG 向量化
|
||||
|
||||
---
|
||||
|
||||
## 取捨
|
||||
|
||||
**優先使用 paramiko** 而非 subprocess + CLI ssh,原因是在容器內環境控制更精準,且支援跳板機 ProxyJump。若 paramiko 未安裝則自動降級到 CLI ssh(向後相容)。
|
||||
|
||||
---
|
||||
|
||||
## 結果
|
||||
|
||||
- P1/P2 等級的 DB_UNREACHABLE / DNS_FAIL 類問題可在 30 秒內完成自動修復
|
||||
- 所有修復知識自動沉澱至 RAG KM,提升未來 AI 的判斷品質
|
||||
- 覆蓋任務:`run_auto_import_task` / `run_icaim_analysis_task` / `run_weekly_strategy_task`
|
||||
Reference in New Issue
Block a user