fix(awooop): align console with flywheel execution metrics

This commit is contained in:
Your Name
2026-05-06 00:44:53 +08:00
parent 894174da5b
commit 1b4a6c1e8c
17 changed files with 667 additions and 208 deletions

View File

@@ -3137,3 +3137,91 @@ bash scripts/reboot-recovery/full-stack-cold-start-check.sh --send-alert-test
- 110 actions runner units 仍按策略最後放行guardrail 已套用,`CPUQuota=200%``MemoryMax=2G``WatchdogUSec=0`;需在 load/core 穩定後逐步開啟。
- `Bad message` / `Structure needs cleaning` 是 host filesystem 層訊號;線上 clean-clone 已恢復服務,但完整歷史資料追溯需安排離線 `fsck` 或備份驗證。
- `drift-scanner-29633040-qrf8w` 為單次 CronJob Error不阻斷主服務後續可清理或調查。
---
## 2026-05-05台北— GCP Ollama 告警路徑止血與內網化決策
**觸發**:告警卡仍顯示 `Router: Gemini`,且 GCP-A / GCP-B Ollama 先前在告警 JSON prompt 上連續 504導致 Gemini 備援產生費用。
### 已執行
| 範圍 | 結果 |
|------|------|
| 告警模型 | 將告警專用 Ollama 模型固定為 `gemma3:4b`,避免 `qwen3:14b` / `qwen2.5-coder:32b` 冷啟動拖入 Gemini |
| Production image | `awoooi-api` / `awoooi-worker` 已手動切到 `192.168.0.110:5000/awoooi/api:787acd3bda918f53b977f37133e0b5c73558033e` |
| Production env | 已明確設定 `ALERT_AI_ENFORCE_OLLAMA_FIRST=true``ALERT_AI_ALLOW_CLOUD_FALLBACK=true``ALERT_OLLAMA_MODEL=gemma3:4b` |
| GCP Ollama 保溫 | GCP-A / GCP-B 已卸載 14B / 32B 重模型,並以 `keep_alive=8h` 保溫 `gemma3:4b` |
| Meta W-6 降噪 | Trust Drift 未達 20% 時不再升級為 Meta System現場 Redis 已加 6h dedup 防止重複通知 |
### 現場驗證
```bash
kubectl -n awoooi-prod get deploy awoooi-api awoooi-worker -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range .spec.template.spec.containers[*]}{.name}={.image}{" "}{end}{"\n"}{end}'
# awoooi-api api=192.168.0.110:5000/awoooi/api:787acd3bda918f53b977f37133e0b5c73558033e
# awoooi-worker worker=192.168.0.110:5000/awoooi/api:787acd3bda918f53b977f37133e0b5c73558033e
kubectl -n awoooi-prod exec deploy/awoooi-api -- printenv | grep -E 'ALERT_OLLAMA_MODEL|ALERT_AI_|OLLAMA_.*URL'
# ALERT_OLLAMA_MODEL=gemma3:4b
# ALERT_AI_ALLOW_CLOUD_FALLBACK=true
# ALERT_AI_ENFORCE_OLLAMA_FIRST=true
# OLLAMA_URL=http://192.168.0.110:11435
# OLLAMA_SECONDARY_URL=http://192.168.0.110:11436
# OLLAMA_FALLBACK_URL=http://192.168.0.111:11434
```
### 架構決策
- 目前 `192.168.0.110:11435/11436` 是經由 110 nginx 轉發到 GCP 公網 IP屬於過渡方案不應作為長期 primary Ollama lane。
- 建議建立 WireGuard site-to-site private mesh讓 K3s / 110 / 111 / GCP-A / GCP-B 以私網 IP 互連Ollama 僅綁定 mesh interface並由 AwoooP Inference Gateway 統一路由、熔斷、佇列與模型保溫。
- 注意:目前 GCP-A / GCP-B `/api/ps` 顯示 `size_vram: 0`,內網化可解決連線與安全問題,但無法讓 CPU-only GCP 等同 111 的 VRAM/GPU 效能;大模型應留在 111 或改用 GPU 型 GCP 節點。
---
## 2026-05-06台北— AwoooP Operator Console 與飛輪 KPI 對齊
**觸發**00:30 系統報告顯示「全系統正常」,但飛輪狀態為 `修復 0/15 (0%)`,使用者指出 AI 自動化幾乎沒有做;同步要求 AwoooP 工作項目必須與前端頁面、邏輯、操作面對齊。
### 已修正
| 範圍 | 結果 |
|------|------|
| 心跳報告 | `HeartbeatReportService._get_flywheel_stats()` 改讀 `auto_repair_executions`,不再用已失準的 `incidents.outcome` 推估修復率 |
| 飛輪 Prometheus KPI | `FlywheelStatsService._playbook_stats()` 優先以 `auto_repair_executions` 計算 24h execution success rateRedis playbook counter 僅作 fallback |
| AI Success | `MetricsDBRepository` 改用 `UPPER(status::text)` 對齊實際 `APPROVED / EXECUTION_SUCCESS / EXECUTION_FAILED` 狀態值 |
| Auto-repair metric | `AutoRepairService.execute_auto_repair()` 成功/失敗都呼叫 `record_auto_repair()`,修正 Prometheus 指標零 caller 問題 |
| K8s Pod 報告 | Completed/Succeeded CronJob pod 不再顯示為紅色失敗Telegram 報告會顯示 phase |
| AwoooP 前端 | `/zh-TW/awooop` redirect 修正Console 接入主 `AppLayout` 與 sidebar新增 `工作鏈路` 頁映射 P0/P1/P2 工作項目、source of truth、gate 與操作面 |
| AwoooP API | `GET /api/v1/platform/approvals?run_id=` 支援 M8 詳情頁查單筆 waiting approval |
### 驗證
```bash
DATABASE_URL='postgresql+asyncpg://test:test@localhost:5432/test' \
apps/api/.venv/bin/python -m py_compile \
apps/api/src/repositories/metrics_repository.py \
apps/api/src/services/heartbeat_report_service.py \
apps/api/src/services/auto_repair_service.py \
apps/api/src/services/flywheel_stats_service.py \
apps/api/src/api/v1/platform/operator_runs.py \
apps/api/src/services/platform_operator_service.py
DATABASE_URL='postgresql+asyncpg://test:test@localhost:5432/test' \
apps/api/.venv/bin/python -m ruff check --select E9,F401,F821 \
apps/api/src/repositories/metrics_repository.py \
apps/api/src/services/heartbeat_report_service.py \
apps/api/src/services/auto_repair_service.py \
apps/api/src/services/flywheel_stats_service.py \
apps/api/src/api/v1/platform/operator_runs.py \
apps/api/src/services/platform_operator_service.py
# All checks passed!
pnpm --filter @awoooi/web typecheck
# tsc --noEmit passed
```
### 後續
- 仍需處理 `approval_records.matched_playbook_id = NULL` 問題,否則執行結果無法完整回寫 Playbook trust。
- 仍需攔截 AI action hallucinationalertname 被當 deployment/host、namespace 亂填)進入 approval 前的路徑。
- AwoooP Console 下一步應接入真實 run step journal / trace view而不是只列 run state。