完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-26
在前 25 天,我們的系統已能從訓練到部署完整運作,但如果某個 Worker 異常、任務延遲或 Redis 塞滿,開發者往往要「猜」問題在哪。
要讓平台真正具備「產品級穩定性」,就必須能 觀測 — 讓系統的健康狀態被看見、被量化、被預警。
今天,我們導入 Prometheus + Grafana,建立平台的可觀測性基礎,讓系統從「能跑起來」進化成「能自己報警」。
| 功能面向 | MLflow Tracking | Prometheus + Grafana | 
|---|---|---|
| 目的 | 追蹤訓練實驗與模型表現 | 監控系統運作與任務狀態 | 
| 資料性質 | 離線紀錄(每次實驗結束) | 即時監控(每幾秒抓取一次) | 
| 資料儲存 | SQLite / S3 | 時序資料庫(TSDB) | 
| 典型指標 | accuracy、loss、lr | CPU、Mem、queue length、任務成功率 | 
| 呈現介面 | MLflow UI | Grafana Dashboard | 
| 決策用途 | 模型好不好 | 系統穩不穩 | 
兩者並行使用:
FastAPI / Worker → /metrics (Prometheus Client)
     │
     ▼
 Prometheus (pull metrics every 5s)
     │
     ▼
 Grafana (visualize dashboards)
Exporter 會定期輸出最新指標,Prometheus 抓取後儲存成時序資料,Grafana 再將結果轉為圖表與趨勢。
這樣你不需 SSH 登伺服器看 log,就能知道整個平台的運行健康度。
| 指標名稱 | 說明 | 主要用途 | 
|---|---|---|
| Task Success / Total Count | 累計成功任務(task_success_total)與總任務數(task_success_total + task_failure_total) | 
評估任務成功率與可靠性 | 
| Task Queue Length | 目前待處理任務數(task_queue_length) | 
反映 Celery/Redis 佇列壅塞情況 | 
| Average Task Duration | 由 task_duration_seconds 直方圖計算的平均耗時 | 
分析任務效能與延遲趨勢 | 
| System Resource Usage | CPU 百分比(system_cpu_percent)、記憶體用量(system_memory_usage_gigabytes) | 
評估 API / Worker 負載 | 
這四類指標覆蓋了 任務層(Task) 與 系統層(System) 的觀測需求。
它們共同回答:「任務順不順?系統撐不撐?」
record_task_success() / record_task_failure() 累積到 Redis。/metrics 端點被 Prometheus 抓取時,會讀取 Redis 中的統計值。task_queue_length 則直接使用 Redis 的 LLEN,即時反映排隊情況。這樣能在任務量激增時即時看到 queue 堆積,及早調整 Worker 數量。
每次任務完成時,系統會記錄其耗時(秒)並更新直方圖 task_duration_seconds。
Grafana 查詢:
rate(task_duration_seconds_sum[5m]) / rate(task_duration_seconds_count[5m])
即「過去 5 分鐘內的耗時增量 ÷ 任務數增量」= 平均任務耗時。
這樣可平滑掉突發尖峰,只要有新任務完成,數據就會更新。
psutil.cpu_percent(interval=1),直接輸出 0–100%。psutil.Process().memory_info().rss / 1024**3,轉為 GB。max without(pid) 聚合,顯示整體使用情況。這讓你能清楚觀察 API/Worker 是否出現過載、記憶體外洩等現象。

我建立了一份「最小監控儀表板」,以 3–5 張圖呈現系統核心指標,聚焦在任務執行狀態與系統資源負載:
| 圖表名稱 | 查詢公式 | 監控目的 | 
|---|---|---|
| 任務成功 / 失敗計數 | task_success_total、task_success_total + task_failure_total | 
觀察任務執行結果是否穩定、有無異常 spike | 
| 任務佇列長度 | task_queue_length | 
即時反映 Celery/Redis 是否壅塞 | 
| 平均任務耗時 | rate(task_duration_seconds_sum[5m]) / rate(task_duration_seconds_count[5m]) | 
監控任務效能與延遲變化趨勢 | 
| CPU 使用率 | max without(pid)(system_cpu_percent) | 
評估系統整體負載 | 
| 記憶體使用量 (GB) | max without(pid)(system_memory_usage_gigabytes) | 
追蹤 API / Worker 的記憶體健康狀態 | 
當「任務失敗數」上升且「佇列長度」持續攀升、同時「CPU 使用率」偏高,
通常代表 Worker 過載或 Redis 延遲。
反之,如果成功數穩定上升且平均耗時下降,代表系統效能逐步優化。
導入 Prometheus + Grafana 之後,我們終於能回答:
「系統現在健康嗎?」、「任務在塞哪裡?」、「是否該擴容?」
MLflow 管實驗,Prometheus 管生命體徵,兩者一靜一動,共同構成平台的「腦」與「神經」。
從今天起,我們不再只關注模型效能,而是 全面掌握平台健康狀態,
讓整個微調平台正式具備 自我觀測與診斷能力(self-observability)。
📎 AI 協作記錄:今日開發指令
# Day 26: 可觀測性實作
請在專案中完成以下任務:
1. 建立 src/metrics/exporter.py
   - 使用 prometheus_client
   - 指標包含:
     - task_success_total, task_failure_total, task_queue_length
     - task_duration_seconds (Histogram)
     - system_cpu_percent, system_memory_usage_gigabytes
   - 新增 /metrics 端點供 Prometheus 抓取
2. 整合 FastAPI
   - 在 main.py 中引入 exporter
   - 確保 /metrics 可被 Prometheus 收集
3. 建立 grafana/dashboard.json
   - 含 Task Success Rate、Queue Length、Average Duration、System Usage 四張圖
   - 使用 rate() 與 max without(pid) 聚合查詢
4. 測試驗證
   - curl localhost:8000/metrics
   - 驗證 Prometheus 指標更新
   - 匯入 dashboard.json 到 Grafana 驗證可視化結果