Files
awoooi/docs/operations/ON-CALL-HANDBOOK.md
OG T 43c96890d1 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>
2026-04-14 15:29:12 +08:00

430 lines
12 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.
# AWOOOI On-Call 值班手冊On-Call Handbook
> **文件類型**: 值班操作手冊
> **版本**: v1.0
> **建立日期**: 2026-04-14台北時間
> **建立者**: Claude Sonnet 4.6(首席架構師)
> **適用對象**: 統帥(首席)+ 未來 SRE 成員
> **相依文件**: `HUMAN-IN-THE-LOOP.md`、`SLO-SLI-DEFINITION.md`、`ALERT-TAXONOMY-CATALOG.md`
---
## 0. 哲學你是機長AI 是副駕駛
> **AI 永遠可以被覆蓋,你永遠是最後決策者。**
AWOOOI AIOps 系統設計為:
- **日常 P2/P3 告警** → AI 自動處理,你只需監控 Telegram 通知
- **P0/P1 高風險告警** → AI 分析後送審,你做最終決定
- **系統失控時** → Kill Switch 一鍵凍結所有自動操作
**值班的目標不是盯著告警,而是確保飛輪轉得順。**
---
## 1. 值班前準備Shift Start Checklist
每天(建議 08:00 台北時間)執行:
```bash
# 1. 確認系統健康
curl -s http://192.168.0.188:8000/health | python3 -m json.tool
# 2. 確認 Alertmanager 正常
curl -s http://192.168.0.110:9093/api/v1/status
# 3. 確認昨日 SLO 數字
curl -s http://192.168.0.188:8000/api/v1/slo/dashboard
# 4. 確認 AI 模型可用
curl -s http://192.168.0.111:11434/api/tags | python3 -c "import json,sys; [print(m['name']) for m in json.load(sys.stdin)['models']]"
# 5. 看 Telegram #awoooi-alerts 頻道最近 12 小時的告警
```
**每日晨報**: AIOps 系統於 08:00 台北時間自動發送前 24 小時摘要至 Telegram
---
## 2. 告警分級處理矩陣
### 告警嚴重度 → 處理方式
| 嚴重度 | P0 (CRITICAL) | P1 (HIGH) | P2 (MEDIUM) | P3 (LOW) |
|--------|--------------|-----------|-------------|----------|
| **AI 處理** | 分析 + 送審 | 分析 + 送審 | 自動執行 | 自動執行 |
| **你的角色** | 必須審核 | 必須審核 | 監控結果 | 可忽略 |
| **SLA** | 15 分鐘內 | 30 分鐘內 | 無強制 | 無強制 |
| **若超時** | 自動升級通知 | 自動升級通知 | 自動重試 | 自動記錄 |
### Telegram 卡片類型 → 你需要做什麼
| 卡片類型 | 外觀特徵 | 你的動作 |
|---------|---------|---------|
| **TYPE-1** INFO | `💚 INFO` 開頭 | 無需動作,系統已自動記錄 |
| **TYPE-2** AUTO | `⚡ AUTO REPAIR` | 觀察後續 RESULT 卡片即可 |
| **TYPE-3** REVIEW | `🔴 NEEDS REVIEW` + 按鈕 | **必須點擊 APPROVE 或 REJECT** |
| **TYPE-4** WAIT | `⏸️ WAITING` | 人工評估後決定要不要手動修復 |
| **TYPE-8M** SLO | `📊 SLO ALERT` | 評估是否暫停自動修復 |
---
## 3. 高頻場景 SOP
### 3.1 Pod CrashLoopBackOff
**Telegram 卡片**: TYPE-2 或 TYPE-3視 P 等級)
自動修復路徑AI 已執行):
```bash
kubectl rollout restart deployment/{name} -n {namespace}
```
若自動修復失敗,手動 SOP
```bash
# 1. 查看 Pod 日誌
kubectl logs {pod-name} -n {namespace} --previous --tail=100
# 2. 確認 Pod 狀態
kubectl describe pod {pod-name} -n {namespace}
# 3. 手動重啟
kubectl rollout restart deployment/{name} -n {namespace}
# 4. 確認恢復
kubectl rollout status deployment/{name} -n {namespace}
```
---
### 3.2 MinIO 下線(或其他 188 主機上的 Docker 服務)
**Telegram 卡片**: TYPE-3P1需審核
AI 建議的 SSH 修復:
```bash
ssh 192.168.0.188 'docker restart minio'
# 或
ssh 192.168.0.188 'docker ps | grep minio' # 先確認狀態
```
手動 SOP
```bash
# 1. 確認 188 主機可達
ping 192.168.0.188
# 2. SSH 進入主機
ssh 192.168.0.188
# 3. 確認容器狀態
docker ps -a | grep minio
# 4. 重啟容器
docker restart minio
# 5. 確認恢復
docker logs minio --tail=20
curl -s http://localhost:9000/minio/health/live
```
⚠️ **禁止**: `systemctl restart docker`(會殺死 Gitea 等所有容器)
---
### 3.3 PostgreSQL 下線
**Telegram 卡片**: TYPE-3CRITICAL必須審核
AI 會建議 kubectl rollout restart但必須先確認
```bash
# 1. 確認是服務問題還是 Pod 問題
kubectl get pods -n awoooi-prod | grep postgres
# 2. 若 Pod 崩潰 → 重啟
kubectl rollout restart deployment/postgresql -n awoooi-prod
# 3. 若 PVC 問題 → 不可自動處理,聯絡統帥
kubectl describe pvc postgres-pvc -n awoooi-prod
# 4. 確認 DB 可用
kubectl exec -n awoooi-prod deployment/postgresql -- psql -U postgres -c 'SELECT 1;'
```
**資料風險提示**: PostgreSQL 問題涉及持久化資料,`kubectl delete pvc` 被系統永久阻擋
---
### 3.4 告警鏈路斷裂NoAlertsReceived2Hours
這是最嚴重的情況:**你看不到告警 = 系統失明**
```bash
# 1. 確認 Alertmanager
curl http://192.168.0.110:9093/api/v1/status
curl http://192.168.0.110:9093/api/v1/alerts
# 2. 確認 AWOOOI API
curl http://192.168.0.188:8000/webhooks/test
# 3. 確認 Watchdog 心跳
# Watchdog 每分鐘送一個告警,若 2 小時沒收到 → 觸發此規則
# 4. 手動測試告警鏈路
curl -X POST http://192.168.0.110:9093/api/v1/alerts \
-H 'Content-Type: application/json' \
-d '[{"labels":{"alertname":"ManualTest","severity":"info"},"annotations":{"summary":"Manual test"}}]'
```
---
### 3.5 HostHighCpuLoad
**Telegram 卡片**: TYPE-1INFO系統自動記錄
通常不需動作。若持續 > 30 分鐘:
```bash
# 確認高耗 CPU 程序
ssh 192.168.0.{110/120/121/188} 'top -bn1 | head -20'
# 若是 Ollama 模型推理(正常,等它結束)
ssh 192.168.0.188 'ps aux | grep ollama'
```
---
### 3.6 SSL 憑證到期告警
**Telegram 卡片**: TYPE-1INFO
```bash
# 確認哪個憑證快到期
# 通常是 Let's Encrypt 憑證需要 renew
# 若在 K8s 中由 cert-manager 管理
kubectl get certificates -A
kubectl describe certificate {cert-name} -n {namespace}
# 手動 renew若 cert-manager 沒自動處理)
kubectl delete secret {tls-secret-name} -n {namespace} # 觸發重新申請
```
---
## 4. 審核決策指南APPROVE / REJECT
在 Telegram 收到 TYPE-3 審核卡時:
### 應 APPROVE 的情況
- AI 信心度 > 0.80,且 kubectl 指令是 `rollout restart` / `scale --replicas>0`
- 你已確認症狀與 AI 診斷吻合
- 修復操作是可回滾的rollout restart 可 rollout undo
- 這是已知的重複故障,上次 Playbook 記錄過
### 應 REJECT 的情況
- AI 信心度 < 0.65(系統通常會標記 LOW CONFIDENCE
- kubectl 指令包含不熟悉的資源名稱(可能是 LLM 幻覺)
- 時機不對(業務高峰期,即使必要也要評估)
- 你懷疑這是誤報
### REJECT 後手動 SOP
```bash
# 1. 確認實際狀態
kubectl get pods -n {namespace}
kubectl logs {pod-name} -n {namespace} --tail=50
# 2. 若確認需要修復,手動執行
{manual command}
# 3. 在 Telegram 回覆告知已手動處理
```
---
## 5. Kill Switch — 緊急凍結
當你判斷 AI 系統行為異常(瘋狂重啟、錯誤修復),立即啟動:
```bash
# 方法 1API Kill Switch推薦
curl -X POST http://192.168.0.188:8000/api/v1/kill-switch \
-H 'Authorization: Bearer {ADMIN_TOKEN}' \
-d '{"reason": "異常行為觀察到,手動凍結"}'
# 方法 2直接修改 ConfigMap
kubectl set env deployment/awoooi-api AUTO_REPAIR_ENABLED=false -n awoooi-prod
kubectl rollout restart deployment/awoooi-api -n awoooi-prod
```
**Kill Switch 效果**: 所有 auto_repair 自動執行停止TYPE-3 卡片不再自動批准;仍可手動操作
**重新啟動 Kill Switch**:
```bash
curl -X DELETE http://192.168.0.188:8000/api/v1/kill-switch \
-H 'Authorization: Bearer {ADMIN_TOKEN}'
```
---
## 6. SLO 監控與應對
### SLO 儀表板
```bash
curl -s http://192.168.0.188:8000/api/v1/slo/dashboard | python3 -m json.tool
```
### SLO 閾值與應對
| SLO | 指標 | 目標 | 警戒線 | 緊急線 | 應對 |
|-----|------|------|--------|--------|------|
| SLO-1 | 自動修復成功率7天| ≥ 80% | < 80% | < 50% | HITL-8評估暫停自動修復 |
| SLO-2 | 告警分析延遲 P95 | < 20s | > 20s | > 30s | 檢查 LLM / 切 Expert System |
| SLO-3 | 決策引擎可用性 | ≥ 95% | < 95% | < 80% | 確認 Ollama + Gemini 狀態 |
| SLO-4 | 未解決 P0/P1 逾時 | 0 件 | > 0 | > 2 | 立即介入 |
### SLO-1 下降處理
若 SLO-1 < 80%
1. 分析最近失敗的修復:`SELECT * FROM approval_requests WHERE execution_success=false ORDER BY created_at DESC LIMIT 20;`
2. 確認是新類型告警(知識庫沒有)還是已知告警修復失敗
3. 若是系統性問題 → 暫停自動修復,人工介入
4. 更新 `docs/postmortems/` 記錄分析結果
---
## 7. 常用指令速查
### Kubernetes
```bash
# 查看所有 Pod 狀態
kubectl get pods -n awoooi-prod
# 查看 Pod 日誌(最近 100 行)
kubectl logs {pod-name} -n awoooi-prod --tail=100
# 查看 Pod 日誌(上一個 Pod崩潰後
kubectl logs {pod-name} -n awoooi-prod --previous --tail=100
# 重啟 Deployment
kubectl rollout restart deployment/{name} -n awoooi-prod
# 查看 Deployment 狀態
kubectl rollout status deployment/{name} -n awoooi-prod
# 查看節點狀態
kubectl get nodes -o wide
# 查看所有資源
kubectl get all -n awoooi-prod
```
### Docker188 主機)
```bash
# SSH 進入 188
ssh 192.168.0.188
# 查看所有容器
docker ps -a
# 重啟特定容器
docker restart {container_name}
# 查看容器日誌
docker logs {container_name} --tail=100 -f
# 查看容器狀態
docker inspect {container_name} | python3 -m json.tool
```
### AIOps API
```bash
# 系統健康
curl http://192.168.0.188:8000/health
# 最近 Incident 列表
curl http://192.168.0.188:8000/api/v1/incidents?limit=20
# SLO 儀表板
curl http://192.168.0.188:8000/api/v1/slo/dashboard
# 知識庫搜尋
curl "http://192.168.0.188:8000/api/v1/knowledge?q=minio+restart"
```
---
## 8. 主機快速參考
| 主機 | IP | 主要服務 | SSH |
|------|-----|---------|-----|
| 主控節點 | 192.168.0.110 | K3s Master, Prometheus, Alertmanager | `ssh 192.168.0.110` |
| 工作節點-1 | 192.168.0.120 | K3s Worker | `ssh 192.168.0.120` |
| 工作節點-2 | 192.168.0.121 | K3s Worker, Kali | `ssh 192.168.0.121` |
| AI 主機 | 192.168.0.188 | Ollama, Harbor, Gitea, MinIO, AWOOOI | `ssh 192.168.0.188` |
詳細 Port 分配 → [reference_four_hosts.md](~/.claude/projects/-Users-ogt-awoooi/memory/reference_four_hosts.md)
---
## 9. 升級聯絡矩陣
> 目前系統為統帥單人值班;未來擴展 SRE 團隊時使用
| 情況 | 聯絡對象 | 方式 | 優先度 |
|------|---------|------|--------|
| P0 持續 > 15min | 統帥 | Telegram 直接訊息 | 立即 |
| SLO-1 < 50% | 統帥 | Telegram #awoooi-alerts | 15min 內 |
| Kill Switch 啟動 | 統帥 | Telegram 直接訊息 | 立即 |
| 疑似資安事件 | 統帥 | 電話 | 立即 |
---
## 10. 值班後交接Shift End Checklist
```
□ 所有 TYPE-3 卡片已處理APPROVE/REJECT
□ 未解決 Incident 已記錄在 LOGBOOK.md
□ SLO-1 在 80% 以上(若低於 80% 記錄原因)
□ 若觸發了 Kill Switch已確認原因並重啟或記錄保持凍結的理由
□ 有意義的新故障 → 撰寫 Postmortem使用 docs/templates/POSTMORTEM-TEMPLATE.md
□ 更新 docs/LOGBOOK.md 今日條目
```
---
## 附錄 A事件等級速查
| 等級 | Severity | 定義 | 典型案例 |
|------|---------|------|---------|
| P0 | CRITICAL | 服務完全中斷,用戶無法使用 | DB 下線、K8s 節點故障 |
| P1 | HIGH | 核心功能受損,影響大多數用戶 | MinIO 下線、OpenClaw 下線 |
| P2 | MEDIUM | 部分功能受影響,有降級措施 | Pod CrashLoop、SSL 到期 |
| P3 | LOW | 輕微問題,無直接用戶影響 | CPU 高負載、備份失敗 |
---
## 附錄 B相關文件索引
| 文件 | 路徑 | 說明 |
|------|------|------|
| HITL 規格書 | `docs/operations/HUMAN-IN-THE-LOOP.md` | 人工介入完整規格 |
| SLO 定義 | `docs/slo/SLO-SLI-DEFINITION.md` | SLO/SLI 量化定義 |
| 告警目錄 | `docs/reference/ALERT-TAXONOMY-CATALOG.md` | 告警分類完整列表 |
| 事後分析模板 | `docs/templates/POSTMORTEM-TEMPLATE.md` | Postmortem 標準格式 |
| AI 模型卡片 | `docs/ai/AI-MODEL-CARDS.md` | 各 AI 模型治理規格 |
| 服務端點 | `docs/reference/SERVICE-ENDPOINTS.md` | 所有服務 URL/Port |
| K3s 優化手冊 | `docs/runbooks/K3S-OPTIMIZATION-RUNBOOK.md` | 節點調優 SOP |
| 飛輪鐵律 | `memory/feedback_auto_repair_flywheel_v2.md` | ADR-068 五根因鐵律 |
---
*本文件由 Claude Sonnet 4.6 於 2026-04-14 台北時間建立*