# AWOOOI 監控機制完整規劃:讓監控成為 AI 智慧的感知神經,而非束縛 > **文件類型**: 架構設計 + 實施 RunBook > **優先級**: 🔴 重中之重 > **建立**: 2026-03-29 12:38 (台北) > **建立者**: Antigravity > **核心命題**: 監控不是目的,而是 AI 決策的神經末梢。 --- ## 一、核心哲學:監控與 AI 的關係定位 ### 1.1 「不能淪為監控產品」— 這個恐懼從哪裡來? 傳統監控產品(Grafana / Prometheus / Datadog)的底層邏輯是: > 「系統把原始數據攤開,**人類**負責看懂並做決定。」 這讓使用者變成**數據的搬運工**,而非**決策者**。 AWOOOI 的定位必須是: > 「AI 消化所有數據,**主動帶著分析結論來問統帥**:『這裡我建議這樣做,您核准嗎?』」 --- ### 1.2 黃金法則:哪些監控數據「應該消失在後台」,哪些「必須浮現到前台」 ``` ┌────────────────────────────────────────────────────────────────────────┐ │ 監控資訊的兩個命運 │ ├───────────────────────────┬────────────────────────────────────────────┤ │ 🔒 靜默消化(後台進行) │ 🚨 主動浮現(推送給統帥) │ ├───────────────────────────┼────────────────────────────────────────────┤ │ Prometheus Metrics 原始值 │ AI 判斷「這是異常」後產生的 Approval 卡片 │ │ SigNoz Trace 詳情 │ Anomaly Counter 升級到 ESCALATE 時的警示 │ │ Sentry Error Log 完整堆疊 │ Auto-Repair 執行後的結果摘要 │ │ Grafana 儀表板圖表 │ P0 事件的緊急插隊(Priority Preemption) │ │ Alertmanager 規則配置 │ 每日 AI 健康摘要(主動推送) │ │ K8s Pod 狀態明細 │ FinOps 成本異常告警 │ └───────────────────────────┴────────────────────────────────────────────┘ ``` **核心結論**:監控數據 99% 應該「靜默消化」,只有 AI 無法自動處理的 1% 才浮現為「需要統帥決策的卡片」。 --- ## 二、監控完整節點盤點(現況 vs 目標) ### 2.1 五層監控架構 ``` Layer 0: 物理感知層(主機/節點) ↓ Layer 1: 服務感知層(容器/Pod) ↓ Layer 2: 應用感知層(API/前端/Worker) ↓ Layer 3: AI 智慧層(LLM 推理/工具調用) ↓ Layer 4: 業務感知層(用戶行為/成本/SLO) ``` --- ### 2.2 各層完整節點盤點 #### Layer 0: 物理感知層 | 節點 | 工具 | 數據 | 現況 | 缺口 | |------|------|------|------|------| | .110 CPU/Memory/Disk | Node Exporter | 系統指標 | ✅ Prometheus | — | | .112 CPU/Memory/Disk | Node Exporter | 系統指標 | 🟡 孤立,無 Webhook | 無告警整合 | | .188 CPU/Memory/Disk | Node Exporter | 系統指標 + GPU | ✅ Prometheus | — | | .120 K3s Master | Node Exporter + kube-state | K3s 節點指標 | ✅ | — | | .121 K3s Worker | Node Exporter + kube-state | K3s 節點指標 | ✅ | — | | VIP .125 | Blackbox Exporter | TCP 健康 | ✅ 已配置 | — | #### Layer 1: 服務感知層(Docker/K8s) | 服務 | Prometheus | Sentry | OTEL | 告警 | 自動修復 | 缺口 | |------|-----------|-------|------|------|---------|------| | awoooi-api | ✅ | ✅ | ✅ | ✅ 完整 | ✅ | — | | awoooi-web | ✅ | ✅ | ✅ | ✅ 完整 | ✅ | — | | awoooi-worker | ✅ | ✅ | ✅ | 🟡 | ✅ | HPA 缺失 | | Ollama | ✅ | — | — | ✅ | ✅ 重啟 | — | | OpenClaw | ✅ | ✅ | ✅ | ✅ | ✅ 重啟 | — | | Redis | ✅ | — | — | ✅ | ❌(謹慎) | 自動修復 too conservative | | PostgreSQL | ✅ | — | — | ✅ | ❌(謹慎) | 同上 | | Harbor | ✅ | — | — | ✅ | — | — | | Sentry | ✅ | — | — | ✅ | — | — | | Langfuse | ✅ | — | — | ✅ | — | — | | **MinIO** | ❌ | — | — | ❌ | ❌ | 完全未監控 | | **Kali Scanner** | ❌ | — | — | ❌ | ❌ | 孤立節點 | #### Layer 2: 應用感知層 | 數據類型 | 工具 | 現況 | 缺口 | |---------|------|------|------| | API Error Rate | Prometheus + SigNoz | ✅ | — | | API Latency P50/P95/P99 | SigNoz OTEL | ✅ | — | | Distributed Traces | SigNoz | ✅ | — | | Frontend Web Vitals (LCP/FID/CLS) | Sentry | ✅ | — | | Frontend JS Errors | Sentry | ✅ | — | | Frontend Session Replay | Sentry | ✅ | — | | **Frontend Rage Click** | Sentry | ✅ | **未整合進 AI 分析** | | **API Slow Query** | Sentry + structlog | ✅ | **無 AI 自動優化建議** | | **K8s Resource Quota** | kube-state-metrics | ✅ | — | | Alert Chain E2E | Prometheus Counter | ✅ ADR-037 | — | #### Layer 3: AI 智慧層 | 數據類型 | 工具 | 現況 | 缺口 | |---------|------|------|------| | LLM 請求/回應 Traces | Langfuse | ✅ | — | | LLM Token 用量/成本 | Langfuse | ✅ | **無 AWOOOI Dashboard** | | Ollama 推理延遲 | Prometheus | ✅ | — | | AI Fallback 觸發次數 | Prometheus | ✅(ADR-006)| — | | NVIDIA Circuit Breaker | Prometheus | ✅(ADR-036)| — | | **AI 自治率指數** | — | ❌ 完全缺失 | 核心指標未建立 | | **Anomaly Counter 統計** | Redis 計數器 | ✅ ADR-037 | **無前端展示** | | **Approval 決策分析** | PostgreSQL | ✅ | **只有原始 CRUD,無分析** | #### Layer 4: 業務感知層 | 數據類型 | 工具 | 現況 | 缺口 | |---------|------|------|------| | SLO 達成率 | Prometheus + rules | ✅ 定義 | **無可視化** | | 事件 MTTR(平均修復時間)| PostgreSQL | ✅ 原始資料 | **無計算與展示** | | **FinOps 成本追蹤** | cost_analyzer.py | ✅ 邏輯 | **無 UI,完全閒置** | | **用戶操作審計** | audit_logs.py | ✅ | — | | **知識庫查詢統計** | — | ❌ | 無知識庫後端 | --- ## 三、整合缺口分析 ### 3.1 「最後一哩路」缺口(已有工具,未整合) | 缺口 | 工具已準備 | 缺什麼 | 工時 | |------|-----------|-------|------| | MinIO 監控 | Prometheus | MinIO Exporter 未部署 | 1h | | Kali 安全掃描 | Nmap/ZAP on .112 | 無 AWOOOI Webhook 整合 | 2h | | FinOps 前端 | cost_analyzer.py | 無 API 端點 + 無 UI | 8h | | AI 自治率指數 | Prometheus Counter 可建 | 指標定義 + Dashboard | 4h | | Rage Click → AI 分析 | Sentry `get_ux_audit_summary()` | 無觸發器,未週期調用 | 2h | | Anomaly Counter 前端展示 | Redis + anomaly_counter.py | 無 GenUI 卡片 | 4h | | SLO 可視化 | Prometheus rules 已定義 | 無 Grafana/前端展示 | 3h | | MTTR 計算 | PostgreSQL 有 incidents 資料 | 無計算 API 端點 | 2h | | 雙 Prometheus 聯邦 | 188/110 各一個 | 無 Federation 配置 | 2h | **整合缺口總工時估算:~28 小時** --- ## 四、監控 UI 呈現戰略(避免淪為監控產品的核心設計) ### 4.1 三種監控 UI 反模式(絕對禁止) ``` ❌ 反模式 A:Grafana 嵌入 iframe → 整個頁面都是 Grafana,用戶感覺在用 Grafana ❌ 反模式 B:「監控頁面」頂級選單項目 → 將 AWOOOI 降格為「有 AI 輔助的 Grafana」 ❌ 反模式 C:Prometheus 原始指標直接展示 → 用戶看到 rate(http_requests_total[5m]) 這種語法,違反 AI 原生體驗 ``` ### 4.2 正確的監控 UI 架構:「三義分離原則」 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ AWOOOI 監控 UI 三義分離 │ ├────────────────────┬──────────────────┬─────────────────────────────┤ │ 義 1: AI 主動浮現 │ 義 2: 問即答 │ 義 3: 深度調查跳脫 │ │ (AWOOOI 前端) │ (Omni-Terminal) │ (外部工具直連) │ ├────────────────────┼──────────────────┼─────────────────────────────┤ │ Nexus 頁面 │ /status awoooi-api│ 🔗 Grafana (新分頁) │ │ → AI 健康脈搏 │ → GenUI 健康卡 │ 🔗 SigNoz (新分頁) │ │ → 自治率指數 │ /cost this-month │ 🔗 Sentry (新分頁) │ │ → 異常趨勢圖 │ → FinOps 成本卡 │ │ │ War Room 頁面 │ /trace xxx │ 不直接嵌入,保持 AWOOOI │ │ → 待決策 Approval │ → Trace 彙整卡 │ 界面純淨性 │ └────────────────────┴──────────────────┴─────────────────────────────┘ ``` ### 4.3 Nexus 頁面的監控呈現規格 這是首頁(The Nexus / 全局心智樞紐),呈現監控摘要的唯一入口: ```tsx // Nexus 頁面結構(Nothing.tech 純白工業風) // 區塊 A:AI 自治率指數(最大最重要) 今日 AI 成功攔截並自動修復:7/10 事件(70% 自治率) ↗ 比昨日提升 12% // 區塊 B:系統脈搏(3 個數字,非圖表) // 區塊 C:AI 思考流(背景動態,非重點) [Investigator] Redis latency: 2ms ... OK [Investigator] API error rate: 0.1% ... OK [Investigator] cert://*.wooo.work: 42 days ... OK // 區塊 D:需要統帥決策的卡片(只有這個需要互動) // → 有待決策才出現,平時此區域「靜默」 ``` --- ### 4.4 監控數據在 Omni-Terminal 的呈現(問即答模式) Terminal 輸入 → AI 消化原始指標 → 回傳 GenUI 卡片(非原始數字) | 使用者輸入 | AI 行為 | GenUI 卡片類型 | |---------|---------|--------------| | `/status all` | 查詢所有服務健康 | `SystemHealthCard` | | `/status awoooi-api` | 查 API P95 延遲 + 錯誤率 | `ServiceDetailCard` | | `/cost` | 呼叫 cost_analyzer.py | `FinOpsCard` | | `/trace 最近5分鐘` | 查詢 SigNoz slow traces | `TraceListCard` | | `/incident 今天` | 查詢今日事件 + AI 摘要 | `IncidentSummaryCard` | | `/alert 狀態` | 檢查告警鏈路 E2E | `AlertChainStatusCard` | | `/slo` | 計算 API/Web SLO 達成率 | `SLODashboardCard` | **🎯 這才是 AI 原生體驗**:使用者永遠都在跟 AI 對話,而非直接操作圖表。 --- ### 4.5 「深度調查」模式:智能跳脫 當用戶需要原始 Grafana / SigNoz 數據時,AWOOOI 提供**智能跳脫**,而非嵌入: ```tsx // 在 GenUI 卡片中,提供「深度調查」按鈕 {/* 智能跳脫按鈕 */} ``` --- ## 五、監控機制整合實施步驟 ### Wave M-1: 立即啟動(1 週) #### M-1.1 MinIO 監控整合(1h) ```bash # 在 192.168.0.188 部署 MinIO Exporter docker run -d \ --name minio-exporter \ --network momo-pro-network \ -e MINIO_URL=http://minio:9000 \ -e MINIO_ACCESS_KEY= \ -e MINIO_SECRET_KEY= \ -p 9290:9290 \ bitnami/minio-exporter:latest # 在 188:/momo-pro/monitoring/prometheus.yml 加入 scrape target: # - job_name: 'minio' # static_configs: # - targets: ['localhost:9290'] ``` #### M-1.2 Prometheus Federation 統一(2h) ```yaml # 在 188 的 Prometheus 加入聯邦查詢(抓取 .110 的 Prometheus 數據) # 188:/momo-pro/monitoring/prometheus.yml 追加: - job_name: 'federate-110' scrape_interval: 30s honor_labels: true metrics_path: '/federate' params: 'match[]': - '{job=~".+"}' # 抓取所有 .110 的 job static_configs: - targets: ['192.168.0.110:9090'] ``` #### M-1.3 建立 AI 自治率指數 Prometheus 指標(2h) ```python # apps/api/src/core/metrics.py 新增: # === AI 自治率追蹤 (The Autonomy Index) === AUTONOMY_INCIDENTS_TOTAL = Counter( 'awoooi_incidents_total', 'Total number of incidents received', ['source', 'severity'] ) AUTONOMY_AUTO_RESOLVED = Counter( 'awoooi_incidents_auto_resolved_total', 'Incidents resolved automatically by AI without human intervention', ['source', 'action_type'] ) AUTONOMY_HUMAN_RESOLVED = Counter( 'awoooi_incidents_human_resolved_total', 'Incidents requiring human approval', ['source', 'risk_level'] ) def record_incident_created(source: str, severity: str): AUTONOMY_INCIDENTS_TOTAL.labels(source=source, severity=severity).inc() def record_auto_resolution(source: str, action_type: str): AUTONOMY_AUTO_RESOLVED.labels(source=source, action_type=action_type).inc() def record_human_decision(source: str, risk_level: str): AUTONOMY_HUMAN_RESOLVED.labels(source=source, risk_level=risk_level).inc() # 自治率計算公式: # autonomy_rate = auto_resolved / (auto_resolved + human_decisions) * 100 ``` Grafana Dashboard 公式: ``` # AI 自治率(24h) sum(increase(awoooi_incidents_auto_resolved_total[24h])) / ( sum(increase(awoooi_incidents_auto_resolved_total[24h])) + sum(increase(awoooi_incidents_human_resolved_total[24h])) ) * 100 ``` ### Wave M-2: 短期啟動(2 週) #### M-2.1 FinOps API 端點建立(4h) ```python # apps/api/src/api/v1/finops.py(新建) # 暴露 cost_analyzer.py 的計算結果 @router.get("/finops/summary") async def get_finops_summary(): """ FinOps 成本摘要 Returns: { "period": "2026-03", "total_cost_usd": 12.50, "ollama_cost": 0.0, # 本地,零成本 "gemini_cost": 1.20, "claude_cost": 11.30, "realizable_savings": 3.50, # 真實可省 "freed_capacity": 8.00, # 釋放容量(非真實省錢) "top_cost_drivers": [...], "recommendations": [...] } """ cost_analyzer = get_cost_analyzer() return await cost_analyzer.monthly_summary() ``` #### M-2.2 SLO API 端點建立(2h) ```python # apps/api/src/api/v1/slo.py(新建) @router.get("/slo/status") async def get_slo_status(): """ SLO 達成狀況 Returns: { "api": { "availability_7d": 99.97, # % "latency_p95_7d": 124, # ms "target_availability": 99.9, "target_latency_p95": 500, "status": "healthy" # healthy/at_risk/breached }, "web": {...}, "overall": "healthy" } """ ``` #### M-2.3 MTTR API 端點建立(2h) ```python # apps/api/src/api/v1/stats.py 新增端點 @router.get("/stats/mttr") async def get_mttr_stats(): """ 平均修復時間 (Mean Time To Resolution) 計算邏輯: - MTTR = avg(resolved_at - created_at) for resolved incidents - 分 AI 自動修復 vs 人工審核分別計算 """ ``` #### M-2.4 Kali Scanner 整合(2h) ```python # apps/api/src/api/v1/webhooks.py 新增 Kali Scanner Webhook @router.post("/webhooks/kali/scan-result") async def handle_kali_scan_result(request: Request): """ 接收 .112 Kali 安全掃描結果 Kali 掃描腳本每週執行一次,結果發送至此 Webhook 高危漏洞 → 自動建立 CRITICAL Approval """ ``` Kali 端配置 (`192.168.0.112`): ```bash # 在 112 建立每週掃描腳本 cat > /opt/awoooi-scanner/weekly-scan.sh << 'EOF' #!/bin/bash TARGET="192.168.0.120:32334" # AWOOOI API RESULT=$(nmap -sV --script vuln $TARGET -oJ -) curl -X POST http://192.168.0.120:32334/api/v1/webhooks/kali/scan-result \ -H "Content-Type: application/json" \ -d "{\"scan_result\": $RESULT, \"target\": \"$TARGET\"}" EOF # 加入 crontab echo "0 2 * * 1 /opt/awoooi-scanner/weekly-scan.sh" | crontab - ``` ### Wave M-3: 中期啟動(3–4 週) #### M-3.1 Nexus 頁面 AI 自治率指數 UI(8h) ```tsx // apps/web/src/app/[locale]/(dashboard)/page.tsx // 新增 AutonomyIndex 組件 interface AutonomyData { rate: number; // 70.0 daily_trend: number; // +12.0 vs yesterday auto_resolved_24h: number; human_resolved_24h: number; } const AutonomyIndexPanel = ({ data }: { data: AutonomyData }) => (
{/* 大數字:自治率 */}
{data.rate.toFixed(0)} %
↗ +{data.daily_trend.toFixed(0)}% {t('nexus.vs_yesterday')}
{/* AI 自治率說明 */}

[AI_AUTONOMY_INDEX] {t('nexus.autonomy_description')}

{/* 細分:今日自動 vs 需要人工 */}

{data.auto_resolved_24h}

{t('nexus.ai_auto_resolved')}

{data.human_resolved_24h}

{t('nexus.required_approval')}

); ``` #### M-3.2 Omni-Terminal 監控指令整合(8h) 後端需要新增以下 Terminal 指令的處理器: ```python # apps/api/src/services/terminal_service.py 擴充 class TerminalCommandRouter: async def route(self, intent: str, context: dict) -> TerminalResponse: """ 監控相關指令路由 """ if intent == "/status": return await self._handle_status(context) # 服務健康狀態 elif intent == "/cost": return await self._handle_cost(context) # FinOps 成本 elif intent == "/slo": return await self._handle_slo(context) # SLO 達成率 elif intent == "/trace": return await self._handle_trace(context) # SigNoz Traces elif intent == "/alert": return await self._handle_alert_chain(context) # 告警鏈路狀態 elif intent == "/incident": return await self._handle_incident(context) # 事件查詢 elif intent == "/mttr": return await self._handle_mttr(context) # 平均修復時間 ``` #### M-3.3 監控相關 GenUI 卡片擴充(8h) ```typescript // apps/web/src/components/genui/registry.ts 新增: export const GENUI_COMPONENTS = { // 現有組件... // 新增監控類組件: 'SystemHealthCard': () => import('./monitoring/SystemHealthCard'), 'ServiceDetailCard': () => import('./monitoring/ServiceDetailCard'), 'FinOpsCard': () => import('./monitoring/FinOpsCard'), 'SLODashboardCard': () => import('./monitoring/SLODashboardCard'), 'AlertChainStatusCard': () => import('./monitoring/AlertChainStatusCard'), 'AnomalyFrequencyCard': () => import('./monitoring/AnomalyFrequencyCard'), 'MTTRCard': () => import('./monitoring/MTTRCard'), 'KaliScanResultCard': () => import('./monitoring/KaliScanResultCard'), } ``` **`SystemHealthCard` 規格**(最核心的監控 GenUI 卡片): ```tsx // SystemHealthCard 呈現邏輯: // - 25 個服務用「燈號矩陣」呈現,非圖表 // - 每個燈號 hover 顯示服務名稱 // - 有異常的燈號閃爍(animate-ping) // - 右下角「深度調查」按鈕連至 Grafana/SigNoz 新分頁 const SystemHealthCard = () => (
{services.map(svc => ( ))}
{/* 摘要行 */}

25 SERVICES | {healthy_count} HEALTHY | {warning_count} WARNING | {critical_count} CRITICAL

{/* 智能跳脫 */}
); ``` --- ## 六、監控整合路線圖與優先級 ``` 📅 Week 1 (立即,~7h): ├── M-1.1 MinIO Exporter 部署 (1h) ├── M-1.2 Prometheus Federation (2h) └── M-1.3 AI 自治率指數 Metrics 建立 (2h + 2h Config) 📅 Week 2-3 (短期,~10h): ├── M-2.1 FinOps API 端點 (4h) ├── M-2.2 SLO API 端點 (2h) ├── M-2.3 MTTR API 端點 (2h) └── M-2.4 Kali Scanner Webhook 整合 (2h) 📅 Month 2 (中期,~24h): ├── M-3.1 Nexus 頁面 AI 自治率 UI (8h) ├── M-3.2 Omni-Terminal 監控指令 (8h) └── M-3.3 監控 GenUI 卡片擴充 (8h) ``` **監控整合完成後的最终效果**: ``` 統帥打開 AWOOOI,看到: ✦ AI 自治率:今日 72%(↗ 比昨日高 8%) ✦ 系統健康:25/25 服務正常 ✦ 待決策:0(系統無需要人工干預的事件) ✦ AI 思考流在背後靜默巡邏... 這才是 AI 原生平台,不是監控工具。 SRE 只在「AI 搞不定的時候」被喚醒,其餘時間人類可以去做更有價值的事。 ``` --- ## 七、ADR 建議 本規劃建議新增以下 ADR: | ADR | 主題 | 核心決策 | |-----|------|---------| | ADR-038 | 監控 UI 三義分離原則 | 靜默消化 vs 主動浮現 vs 外部跳脫 | | ADR-039 | AI 自治率指數 (Autonomy Index) | 指標定義與計算公式 | | ADR-040 | Kali 安全掃描整合架構 | .112 → Webhook → AI 分析 | | ADR-041 | SLO 與 MTTR 業務指標架構 | 計算方法與展示標準 | --- *「監控是神經末梢,AI 是大腦。神經不思考,大腦不直接感知。這就是 AWOOOI 的監控哲學。」* 🦞