SystemController Monitor 模組技術說明
SystemController 的 Monitor 模組是 Skalds 分散式任務調度系統的核心監控組件,負責即時追蹤 Skalds(Task Generator)與 TaskWorker 的狀態、心跳、任務執行狀態、資源使用率等,並透過 Dashboard 與 SSE(Server-Sent Events)提供全方位的系統可觀測性。Monitor 模組可獨立運作(monitor mode),也可作為 Dispatcher 的基礎,支援高可用、可擴展的分散式任務管理。
1. 架構定位與核心職責
Monitor 模組在 Skalds 架構中的定位如下:
- 即時監控:持續監聽 Redis 中 Skalds 與 TaskWorker 的所有訊息(心跳、狀態、錯誤、異常)。
- 狀態同步:將即時監控資訊同步至內部記憶體 Store,供 API、Dashboard、SSE 查詢。
- 指標收集:統計 Skalds/TaskWorker 數量、狀態分布、任務分配、資源利用率等。
- 異常偵測:自動判斷離線、失敗、異常任務,並觸發狀態更新。
- Dashboard 與 SSE:提供前端 Dashboard 及 SSE 事件流,支援即時監控與通知。
Monitor 是 SystemController 的子模組,與 Dispatcher、API 服務協同運作,確保系統穩定與高可用。
2. 架構與資料流
Monitor 模組的架構設計如下:
- 資料來源:
- Redis:所有 Skalds/TaskWorker 的心跳、狀態、錯誤、異常訊息。
- MongoDB:任務詳細資料(TaskMonitor 需用於任務狀態比對)。
- 核心組件:
- SkaldMonitor:定期(預設每 5 秒)從 Redis 取得所有 Skalds 狀態、心跳、任務分配資訊,判斷線上/離線、類型(node/edge)、支援任務等。
- TaskMonitor:定期(預設每 3 秒)從 MongoDB 取得需監控任務,查詢 Redis 心跳、錯誤、異常,判斷任務狀態(Running/Failed/Cancelled/Finished)。
- Store(SkaldStore/TaskStore):記憶體快取所有監控資訊,供 API/Dashboard 查詢。
- 資料流:
- SkaldMonitor 與 TaskMonitor 持續從 Redis/MongoDB 拉取狀態資訊。
- 監控結果同步至內部 Store,API 與 Dashboard 直接查詢 Store 取得即時資料。
- 異常/中斷任務自動更新狀態,必要時透過 Kafka 發送取消事件。
3. 監控內容與指標
3.1 Skalds 監控
- 線上/離線判斷:根據心跳時間與 Redis 資料,超過閾值視為離線。
- 類型分辨:node/edge 分類,僅 node 可被指派任務。
- 支援任務類型:每個 Skalds 支援的任務類型列表。
- 當前任務:每個 Skalds 正在執行的任務 ID 與類型。

3.2 TaskWorker 監控
- 心跳狀態:0~199 為正常,-1 為異常,-2 為取消,200 為完成。
- 錯誤訊息:運行時錯誤(不會中斷任務)。
- 異常訊息:致命例外,會中斷任務並標記為 Failed。
- 自動狀態更新:連續多次心跳不變自動判斷中斷,更新任務狀態。

3.3 任務詳細監控
- 任務基本資訊:ID、類型、執行者、建立/更新時間、優先權等。
- 即時心跳與狀態:歷史心跳、當前狀態、錯誤/異常訊息。
- Attachments:任務參數內容。
- 狀態控制:可透過 API 取消/恢復任務,或更新參數。

4. Dashboard 與 API 功能
4.1 Dashboard 特色
- 即時總覽:顯示 Skalds/TaskWorker 數量、線上/離線分布、任務狀態統計。
- Skalds 列表:查詢所有 Skalds 節點、狀態、支援任務、當前任務。
- TaskWorker 列表:查詢所有任務、狀態、執行者、心跳、錯誤/異常。
- 任務詳細:檢視單一任務詳細資訊、心跳歷史、Attachments、錯誤/異常。
- 即時刷新:所有資料自動輪詢或透過 SSE 即時更新。
首頁畫面如下(Dashboard 主要入口):

4.2 主要 API 端點
Monitor 模式下,API 服務會自動啟用,常用端點如下:
GET /api/system/health:系統健康檢查GET /api/system/status:系統狀態GET /api/system/dashboard/summary:Dashboard 統計摘要GET /api/system/metrics:詳細系統指標GET /api/skalds:Skalds 節點列表GET /api/skalds/{skald_id}:單一 Skalds 詳細GET /api/tasks:任務列表GET /api/tasks/{task_id}:任務詳細GET /api/tasks/{task_id}/heartbeat:任務心跳資訊
4.3 SSE 事件流
Monitor 提供 Server-Sent Events(SSE)即時推播,支援前端即時監控:
GET /api/events/skalds:Skalds 狀態/心跳事件GET /api/events/tasks:TaskWorker 心跳、錯誤、異常事件GET /api/events/status:SSE 連線狀態
事件格式範例:
data: {"type":"skald_status","skaldId":"skalds-001","data":{"status":"online","taskCount":2},"timestamp":1640995260000}
data: {"type":"task_heartbeat","taskId":"task-001","data":{"heartbeat":151,"status":"Running"},"timestamp":1640995261000}
5. 配置與部署
5.1 啟動 Monitor 模式
Monitor 可獨立運作或作為 Dispatcher 的基礎,啟動方式如下:
1. 設定環境變數
參考 .env.example,設定以下主要參數於 .env:
# System Controller 設定
SYSTEM_CONTROLLER_MODE=MONITOR
# 基本設定
LOG_LEVEL=DEBUG
LOG_RETENTION=3
LOG_ROTATION_MB=10
# Redis 設定
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_SYNC_PERIOD=3
# Kafka 設定
KAFKA_HOST=localhost
KAFKA_PORT=9092
# Mongo 設定
MONGO_HOST=mongodb://root:root@localhost:27017/
2. 啟動服務
python -m skalds.system_controller.main
啟動後可於瀏覽器開啟 http://127.0.0.1:8000/dashboard 進行監控。
6. 進階特性與最佳實踐
- 高可用設計:支援多副本部署,Redis/MongoDB 建議採用叢集或副本集。
- 監控間隔可調:可透過
MONITOR_SKALD_INTERVAL、MONITOR_TASK_INTERVAL調整監控頻率。(目前版本建議不更動) - 自動異常處理:心跳異常、任務中斷自動標記狀態,減少人工介入。
- 日誌與指標收集:所有監控事件皆有詳細日誌,便於追蹤與除錯。
- SSE 實時推播:前端可直接監聽 SSE 端點,實現無縫即時監控。
7. 參考文件與延伸閱讀
Monitor 模組是 Skalds 系統的可觀測性核心,正確配置與善用可大幅提升系統的穩定性、即時性與維運效率。