Files
awoooi/docs/adr/ADR-061-alert-operation-log-event-sourcing.md
OG T f525e657ca docs: ADR-060/061 全面監控+Event Sourcing架構決策記錄
- ADR-060: 全面基礎設施監控規劃 (Plan A/B/C/D/E)
- ADR-061: Alert Operation Log Event Sourcing 架構
- LOGBOOK: 2026-04-08 里程碑記錄更新

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 11:44:06 +08:00

121 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-061: Alert Operation Log — Event Sourcing 操作溯源
**狀態**: 已實施 (2026-04-08)
**日期**: 2026-04-08
**提案者**: Claude Code
**審核者**: 統帥 (首席架構師)
---
## 背景
統帥指令:「所有操作都必須被記錄,寫入資料庫」「把之前所有的告警訊息,通通寫入資料庫,並且要有然後去記錄相關的操作」
現有問題:
- `audit_logs` 只記錄 K8s 操作,不記錄告警生命週期
- `approval_records` 記錄審批狀態,但不記錄操作時間軸
- 自動修復操作 (`auto_repair_executions`) 之前未寫入 DB
- 沒有統一的告警全生命週期視圖
## 決策
### 兩個新表
**1. `auto_repair_executions`** (Phase 10)
- 記錄每次自動修復執行的成功/失敗
- 欄位incident_id, playbook_id, playbook_name, success, executed_steps, similarity_score, risk_level, execution_time_ms
**2. `alert_operation_log`** (Phase 11) — Event Sourcing
- 不可變 (Immutable) — 只 INSERT不 UPDATE/DELETE
- 每個告警生命週期的每個事件都寫一筆
- 支援完整溯源:從告警進來到解決的所有步驟
### Event Types
```
ALERT_RECEIVED — Alertmanager/外部告警進來
TELEGRAM_SENT — 推送 Telegram 審核卡片
USER_ACTION — 使用者在 Telegram 按按鈕 (approve/reject/silence)
AUTO_REPAIR_TRIGGERED — 自動修復評估通過,準備執行
EXECUTION_STARTED — 開始執行 K8s/SSH/Docker 指令
EXECUTION_COMPLETED — 執行完成 (success/failure)
TELEGRAM_RESULT_SENT — 自動修復結果推送到 Telegram
RESOLVED — 告警解除
SILENCED — 靜默中
ESCALATED — 升級 (P3→P2 等)
CHANGE_APPLIED — 生產環境變更記錄
BACKUP_COMPLETED — 備份完成事件
BACKUP_FAILED — 備份失敗事件
DR_DRILL_COMPLETED — DR 演練完成
```
### 歷史數據回填
執行 `phase11b_backfill_alert_operation_log.sql` 回填:
- 14 筆 ALERT_RECEIVED (incidents 表)
- 265 筆 TELEGRAM_SENT (approval_records 表)
- 265 筆 USER_ACTION (approval_records 表)
- 110 筆 EXECUTION_COMPLETED (audit_logs 表)
- **總計 654 筆歷史記錄**
## 實施
### 寫入點
| 事件 | 觸發位置 |
|------|---------|
| ALERT_RECEIVED | `webhooks.py` alertmanager_webhook → `alert_operation_log` |
| TELEGRAM_SENT | `_push_to_telegram_background` 成功後 |
| USER_ACTION | `telegram.py` handle_callback approve/reject |
| AUTO_REPAIR_TRIGGERED | `_try_auto_repair_background` evaluate 後 |
| EXECUTION_COMPLETED | `_try_auto_repair_background` result 後 |
| TELEGRAM_RESULT_SENT | `_try_auto_repair_background` telegram 推送後 |
### 程式碼位置
```
apps/api/src/db/models.py — AlertOperationLog, AutoRepairExecution models
apps/api/src/repositories/
alert_operation_log_repository.py — append() / list_by_incident() / get_stats()
audit_log_repository.py — get_auto_repair_execution_repository()
apps/api/src/api/v1/webhooks.py — 寫入點整合
apps/api/src/api/v1/telegram.py — USER_ACTION 寫入
apps/api/migrations/
phase10_auto_repair_executions.sql
phase11_alert_operation_log.sql
phase11b_backfill_alert_operation_log.sql
```
## 查詢範例
```sql
-- 查詢某 incident 的完整操作時間軸
SELECT event_type, actor, action_detail, success, created_at
FROM alert_operation_log
WHERE incident_id = 'INC-20260408-XXXXXX'
ORDER BY created_at ASC;
-- 統計 24 小時自動修復成功率
SELECT success, COUNT(*) FROM auto_repair_executions
WHERE created_at > NOW() - INTERVAL '24 hours'
GROUP BY success;
-- 所有使用者操作記錄
SELECT actor, action_detail, context->>'username', created_at
FROM alert_operation_log
WHERE event_type = 'USER_ACTION'
ORDER BY created_at DESC;
```
## 結果
- 所有告警操作 100% 持久化到 DB
- 支援完整審計 (Audit Trail)
- 654 筆歷史記錄已回填
- 未來:可建立 AWOOOI Web 操作記錄頁面
## 相關 ADR
- ADR-030: Intelligent Auto-Remediation
- ADR-060: 全面基礎設施監控