# 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.py,fallback) 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_ACTION(INFO) - **Rule 匹配**: `host_high_cpu` 規則(priority 115) #### `host_memory` — 記憶體不足 | alertname | 說明 | |-----------|------| | `HostOutOfMemory` | 主機可用記憶體低於 10% | | `HighMemoryUsage` | 舊版 alias(相容保留) | | `RedisMemoryHigh` | Redis 記憶體超過 80% | - **決策路徑**: NO_ACTION(INFO),建議人工清理 - **Rule 匹配**: `host_out_of_memory` 規則(priority 110) #### `disk_full` — 磁碟空間耗盡 | alertname | 說明 | |-----------|------| | `HostOutOfDiskSpace` | 主機磁碟剩餘空間不足 | | `DiskSpaceLow` | 舊版 alias(相容保留) | - **決策路徑**: TYPE-1(INFO),log 分析後 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-3(CRITICAL,強制人工審核) - **禁止自動修復**: 節點問題影響全叢集,不自動 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-3(CRITICAL)→ 人工審核後 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_ACTION(INFO + 建議) --- ### 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_ACTION(CI/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-1(INFO) #### `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-8(SLO-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條 為資料來源*