docs: 新增4份治理文件 — 告警目錄/AI模型卡/事後分析模板/值班手冊

- docs/reference/ALERT-TAXONOMY-CATALOG.md:16大類、56筆alertname、24條Rule優先順序表
- docs/ai/AI-MODEL-CARDS.md:7個AI模型治理卡(deepseek/qwen/gemini/claude/nemotron)+fallback順序
- docs/templates/POSTMORTEM-TEMPLATE.md:對齊report_generation_service,[AUTO]欄位已標記
- docs/operations/ON-CALL-HANDBOOK.md:P0/P1 SOP、Kill Switch、SLO應對、常用指令速查

建立: 2026-04-14 台北時間 Claude Sonnet 4.6(戰術B Phase 1 完整收尾)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-14 15:29:12 +08:00
parent 2c6ed4e9cf
commit 43c96890d1
4 changed files with 1242 additions and 0 deletions

View File

@@ -0,0 +1,297 @@
# AWOOOI 告警分類目錄Alert Taxonomy Catalog
> **文件類型**: 告警分類權威目錄
> **版本**: v1.0
> **建立日期**: 2026-04-14台北時間
> **建立者**: Claude Sonnet 4.6(首席架構師)
> **資料來源**: `alert_types.py`56 筆)、`alert_rules.yaml`24 條規則)、`classify_alert_early()`
> **維護方式**: `alert_types.py` 為 Layer 2 fallback新類型優先加入 `alert_rules.yaml`Layer 1
---
## 告警分類三層架構
```
Layer 1 → alert_rules.yaml (incident_type 欄位,優先)
Layer 2 → ALERTNAME_TO_TYPE dict (alert_types.pyfallback)
Layer 3 → "custom" (未匹配,兜底)
```
**程式碼入口**: `alert_rule_engine.get_incident_type(alertname)` — 已整合三層降級
---
## 類別目錄16 大類)
| # | 類別 ID | 中文說明 | 預設 Action | 風險等級 | 數量 |
|---|---------|---------|------------|---------|-----|
| 1 | `host_down` | 主機完全失去回應 | `RESTART_SERVICE` | HIGH | 5 |
| 2 | `host_cpu` | 主機 CPU 過載 | `NO_ACTION` | MEDIUM | 2 |
| 3 | `host_memory` | 主機記憶體不足 | `NO_ACTION` | MEDIUM | 2 |
| 4 | `disk_full` | 磁碟空間耗盡 | `NO_ACTION` | HIGH | 3 |
| 5 | `backup_failure` | 備份任務失敗 | `NO_ACTION` | MEDIUM | 3 |
| 6 | `k8s_node_failure` | K8s 節點異常 | `NO_ACTION` | CRITICAL | 3 |
| 7 | `k8s_pod_crash` | Pod 崩潰/未就緒 | `KUBECTL_ROLLOUT_RESTART` | HIGH | 4 |
| 8 | `k8s_deployment_mismatch` | 部署副本數不符 | `KUBECTL_SCALE` | MEDIUM | 1 |
| 9 | `database_down` | 資料庫服務下線 | `RESTART_SERVICE` | CRITICAL | 2 |
| 10 | `database_performance` | 資料庫效能異常 | `NO_ACTION` | MEDIUM | 6 |
| 11 | `service_down` | 內部服務下線 | `RESTART_SERVICE` | HIGH | 9 |
| 12 | `service_404` | 外部服務/網站無法連線 | `NO_ACTION` | MEDIUM | 5 |
| 13 | `ssl_expiry` | SSL/TLS 憑證到期 | `NO_ACTION` | MEDIUM | 2 |
| 14 | `alert_chain_broken` | 告警鏈路斷裂 | `NO_ACTION` | CRITICAL | 4 |
| 15 | `docker_container_unhealthy` | Docker 容器異常 | `RESTART_SERVICE` | MEDIUM | 2 |
| 16 | `auto_repair_degraded` | 自動修復效率下降 | `NO_ACTION` | HIGH | 2 |
| — | `high_cpu` / `high_memory` | 舊版相容 alias | — | — | 3 |
| — | `custom` | 未匹配兜底 | `NO_ACTION` | LOW | — |
---
## 詳細分類清單
### 1. 主機層Host Layer
#### `host_down` — 主機失去回應
| alertname | 說明 | SSH 可用? |
|-----------|------|-----------|
| `HostDown` | 主機完全失去 ICMP/TCP 回應 | 否(已失聯) |
- **決策路徑**: TYPE-3高風險人工審核
- **修復模式**: SSH 路徑若主機重新上線後or 手動介入
- **Rule 匹配**: `host_down` 規則priority 100
#### `host_cpu` — CPU 過載
| alertname | 說明 |
|-----------|------|
| `HostHighCpuLoad` | 主機 CPU 負載持續超過閾值 |
| `HighCPUUsage` | 舊版 alias相容保留 |
- **決策路徑**: LLM 分析 → 識別高耗 CPU 程序 → NO_ACTIONINFO
- **Rule 匹配**: `host_high_cpu` 規則priority 115
#### `host_memory` — 記憶體不足
| alertname | 說明 |
|-----------|------|
| `HostOutOfMemory` | 主機可用記憶體低於 10% |
| `HighMemoryUsage` | 舊版 alias相容保留 |
| `RedisMemoryHigh` | Redis 記憶體超過 80% |
- **決策路徑**: NO_ACTIONINFO建議人工清理
- **Rule 匹配**: `host_out_of_memory` 規則priority 110
#### `disk_full` — 磁碟空間耗盡
| alertname | 說明 |
|-----------|------|
| `HostOutOfDiskSpace` | 主機磁碟剩餘空間不足 |
| `DiskSpaceLow` | 舊版 alias相容保留 |
- **決策路徑**: TYPE-1INFOlog 分析後 NO_ACTION
- **Rule 匹配**: `disk_full` 規則priority 120
#### `backup_failure` — 備份失敗
| alertname | 說明 |
|-----------|------|
| `HostBackupFailed` | 主機備份腳本失敗 |
| `VeleroBackupFailed` | Kubernetes Velero 備份失敗 |
| `VeleroBackupNotRun` | Velero 備份超過預定時間未執行 |
- **決策路徑**: NO_ACTION通知統帥
- **SLA 影響**: RPO 可能受損,需人工確認
---
### 2. Kubernetes 層K8s Layer
#### `k8s_node_failure` — 節點異常
| alertname | 說明 |
|-----------|------|
| `K3sNodeNotReady` | K3s 節點 NotReady 狀態 |
| `KubeNodeNotReady` | Kubernetes 節點 NotReady |
| `KubeNodeUnreachable` | 節點無法連線 |
- **決策路徑**: TYPE-3CRITICAL強制人工審核
- **禁止自動修復**: 節點問題影響全叢集,不自動 drain/cordon
#### `k8s_pod_crash` — Pod 崩潰
| alertname | 說明 |
|-----------|------|
| `KubePodCrashLooping` | Pod 反覆崩潰重啟CrashLoopBackOff |
| `KubePodNotReady` | Pod 持續未就緒 |
- **決策路徑**: LLM RCA → rollout restart
- **標準 kubectl**: `kubectl rollout restart deployment/{name} -n {namespace}`
- **Rule 匹配**: `pod_crash_looping` / `pod_not_ready` 規則priority 50/55
#### `k8s_deployment_mismatch` — 副本數不符
| alertname | 說明 |
|-----------|------|
| `KubeDeploymentReplicasMismatch` | 實際 Pod 數 ≠ 期望副本數 |
- **決策路徑**: LLM 分析 → kubectl scale需人工確認
- **注意**: `--replicas=0` 被安全閘阻擋ADR-064
---
### 3. 資料庫層Database Layer
#### `database_down` — 資料庫下線
| alertname | 說明 |
|-----------|------|
| `PostgreSQLDown` | PostgreSQL 無法連線 |
| `RedisDown` | Redis 無法連線 |
- **決策路徑**: TYPE-3CRITICAL→ 人工審核後 rollout restart
- **Rule 匹配**: `postgresql_down` / `redis_down` 規則priority 30/35
#### `database_performance` — 資料庫效能
| alertname | 說明 |
|-----------|------|
| `PostgreSQLHighConnections` | 連線數過高 |
| `PostgreSQLSlowQueries` | 慢查詢偵測 |
| `PostgreSQLDeadlocks` | 死鎖偵測 |
| `PostgreSQLTooManyConnections` | 超過最大連線限制 |
| `RedisKeyEviction` | Redis key 被驅逐 |
| `RedisConnectionsHigh` | Redis 連線數過高 |
| `RedisCommandLatencyHigh` | Redis 命令延遲過高 |
- **決策路徑**: LLM 分析 → NO_ACTIONINFO + 建議)
---
### 4. 服務層Service Layer
#### `service_down` — 內部服務下線
| alertname | 說明 | 主機位置 |
|-----------|------|---------|
| `OpenClawDown` | OpenClaw AI 引擎下線 | 188 |
| `MinIODown` | MinIO 物件儲存下線 | 188 |
| `HarborDown` | Harbor 容器倉儲下線 | 188 |
| `GiteaDown` | Gitea CI/CD 服務下線 | 188 |
| `AlertmanagerDown` | Alertmanager 下線(鏈路失效) | 110 |
| `SignOzDown` | SignOz 監控平台下線 | 110 |
| `SentryDown` | Sentry 錯誤追蹤下線 | — |
| `KaliScannerDown` | Kali 安全掃描器下線 | 121 |
- **Rule 覆蓋**:
- `minio_down`priority 10→ SSH docker restart
- `gitea_down`priority 125→ NO_ACTIONCI/CD 服務,不自動修復)
- `openclaw_down`priority 40→ kubectl rollout restart
- **修復模式**: 視服務所在層K8s Pod / Docker Container / 主機服務)
#### `service_404` — 外部網站/服務異常
| alertname | 說明 |
|-----------|------|
| `MoWoooWorkDown` | 工作用外部網站下線 |
| `TsenyangWebsiteDown` | 個人網站下線 |
| `StockWoooWorkDown` | 股票工具網站下線 |
| `BitanWoooWorkDown` | 碧潭相關網站下線 |
| `ExternalSiteSSLExpiringSoon` | 外部網站 SSL 到期 |
| `TargetDown` | 舊版 blackbox 告警 alias |
- **Rule 匹配**: `external_site_down`priority 127→ NO_ACTION通知
- **決策路徑**: TYPE-1INFO
#### `ssl_expiry` — SSL/TLS 憑證到期
| alertname | 說明 |
|-----------|------|
| `SSLCertExpiringSoon` | 憑證即將到期(< 30 天) |
| `ExternalSiteSSLExpiringSoon` | 外部網站憑證到期 |
- **Rule 匹配**: `ssl_cert_expiring`priority 126→ NO_ACTION提醒
- **修復方式**: 人工 certbot renew / cert-manager 更新
---
### 5. 告警鏈路層Alert Chain Layer
#### `alert_chain_broken` — 告警鏈路斷裂
| alertname | 說明 |
|-----------|------|
| `AlertChainBroken_Alertmanager` | Alertmanager 停止發送告警 |
| `AlertChainBroken_Sentry` | Sentry 停止發送錯誤通知 |
| `NoAlertsReceived2Hours` | 2 小時無任何告警watchdog 失效) |
| `AlertChainUnhealthy` | 鏈路整體健康度低 |
- **嚴重性**: CRITICAL告警鏈路失效 = 系統失明)
- **Rule 匹配**: `alert_chain_broken`priority 20
- **通知**: Telegram 緊急通道(立即)
---
### 6. 容器層Docker Layer
#### `docker_container_unhealthy` — Docker 容器異常
| alertname | 說明 |
|-----------|------|
| `DockerContainerUnhealthy` | Docker healthcheck 失敗 |
| `DockerContainerExited` | 容器意外退出(非 K8s 管理的裸 Docker |
- **修復模式**: SSH → `docker restart {container_name}`
- **注意**: 不可用 `docker restart` 重啟整個 Docker Engine會殺死 Gitea
---
### 7. 自動修復監控Auto Repair Monitoring
#### `auto_repair_degraded` — 飛輪效率下降
| alertname | 說明 |
|-----------|------|
| `AutoRepairLowSuccessRate` | SLO-1 < 80%7天滾動 |
| `PermanentFixRequired` | 同一告警重複修復 > 3 次 |
- **觸發**: HITL-8SLO-1 < 50% 連續 2h
- **處理**: TYPE-8M 通知,建議暫停自動修復
- **Root Cause**: 見 `feedback_auto_repair_flywheel_v2.md`
---
## Alert Rule 優先順序速查
| Priority | Rule ID | alertname 關鍵字 | Action |
|----------|---------|-----------------|--------|
| 10 | `minio_down` | MinioDown, MinIODown | SSH restart |
| 20 | `alert_chain_broken` | AlertChainBroken_* | NO_ACTION |
| 30 | `postgresql_down` | PostgreSQLDown | kubectl restart |
| 35 | `redis_down` | RedisDown | kubectl restart |
| 40 | `openclaw_down` | OpenClawDown | kubectl restart |
| 50 | `pod_crash_looping` | KubePodCrashLooping | kubectl restart |
| 55 | `pod_not_ready` | KubePodNotReady | kubectl restart |
| 100 | `host_down` | HostDown | NO_ACTION |
| 110 | `host_out_of_memory` | HostOutOfMemory | NO_ACTION |
| 115 | `host_high_cpu` | HostHighCpuLoad | NO_ACTION |
| 120 | `disk_full` | HostOutOfDiskSpace | NO_ACTION |
| 125 | `gitea_down` | GiteaDown | NO_ACTION |
| 126 | `ssl_cert_expiring` | SSLCertExpiringSoon | NO_ACTION |
| 127 | `external_site_down` | MoWoooWorkDown | NO_ACTION |
| 999 | `generic_fallback` | * | NO_ACTION |
**總計**: 24 條規則56 個 alertname 對應
---
## 新增告警類別 SOP
1. 確認 alertname 是否已在 `ALERTNAME_TO_TYPE` 中 → 如有,只需在 `alert_rules.yaml` 補規則
2. 決定 `incident_type`(參考現有 16 類;必要時新增)
3.`alert_rules.yaml` 新增規則(`priority` < 999`> 127``< 999` 為安全區)
4. 若新 `incident_type`,在 `alert_types.py` 補 dict 條目
5. 更新本文件 + `LOGBOOK.md`
---
*本文件由 Claude Sonnet 4.6 於 2026-04-14 台北時間建立,以 `alert_types.py` v56筆 + `alert_rules.yaml` v24條 為資料來源*