甚麼是 Prometheus?
Prometheus 是一套開源的監控與警訊系統,最初由 SoundCloud 開發,現在是雲端原生運算基金會 (CNCF) 的一部分。
主要用途:
- 收集各種系統與應用程式的指標資料 (Metrics)
- 提供強大的查詢語言 PromQL
- 根據條件觸發警報 (Alerting)
基本架構
Prometheus 由以下幾個核心組件組成:
- Server(主服務)
- 負責定期抓取監控目標的數據,存儲時序 (times series) 數據,並提供查詢功能。
- 內建時間序列資料庫(TSDB),不依賴外部資料庫。
- 可透過
PromQL
查詢監控數據。
- Exporter(數據暴露器)
- 負責將目標系統的數據轉換為 Prometheus 可讀格式 - 指標 (metric)(
/metrics
端點)。 - 例如:
node_exporter
:監控主機 CPU、記憶體、磁碟等。blackbox_exporter
:監控 HTTP、DNS、TCP 等服務的可用性。mysqld_exporter
:監控 MySQL 資料庫指標。
- Pushgateway(數據推送網關,可選)
- 一般情況下,Prometheus 採用「拉取」(Pull)模式,但對於短生命週期的任務(如 CI/CD Job),可以用 Pushgateway 來讓 Exporter 暫存指標
- Alertmanager(告警管理器)
- 處理 Prometheus 發送的告警,並支援:
- 去重(Deduplication):避免相同告警重複發送。
- 分組(Grouping):將相關告警整合。
- 抑制(Silencing):設定某些告警在特定時間內不觸發(如維護期間)。
- 通知(Notification):支援 Email、Slack、PagerDuty、Webhook 等。
- Grafana(可選,可視化工具)
- 提供更直觀的數據儀表板,支援 PromQL 查詢。
運作原理
Prometheus 主要採取 拉取式架構(Pull-based Architecture),會定期從監控目標抓取數據,並將其存入時序數據庫(TSDB)。
步驟 1:數據抓取(Scraping)
- Prometheus 透過
scrape_configs
內的設定,定期訪問目標的/metrics
端點。
- 目標服務(如
node_exporter
、Kubernetes Pod)返回 基於文本的時序數據,格式如下: http_requests_total
是指標名稱,代表 HTTP 請求總數。{method="GET", status="200"}
是標籤(Label),用於區分不同類型的請求。1027
是數據值,表示 GET 200 的請求數量。
步驟 2:數據存儲(Time-Series Database, TSDB)
- Prometheus 內建 TSDB,會將數據存入以時間戳記(Timestamp)為基礎的時序資料庫:
- 數據存放在
/data
目錄內,Prometheus 會自動進行 壓縮與滾動存儲,例如: - 小於 2 小時的數據存於 WAL(Write-Ahead Log)。
- 超過 2 小時 的數據則會封存成 TSDB Block(存放壓縮數據)。
步驟 3:數據查詢(PromQL)
- PromQL(Prometheus Query Language)是 Prometheus 的查詢語言,可用於分析時序數據。例如:
- 查詢某個指標的當前值:
- 查詢 5 分鐘內 HTTP 請求的變化率:
- 查詢 CPU 使用率前 5 名的 Pod:
步驟 4:告警機制(Alerting)
- Prometheus 設定告警規則,如:
expr: up == 0
:表示監控目標宕機時觸發告警。for: 5m
:若該狀態持續 5 分鐘才觸發告警,避免短暫波動。severity: critical
:標記告警的嚴重程度。
- Alertmanager 接收告警,並根據設定發送通知,例如:
步驟 5:視覺化(Grafana)
- 設定 Prometheus 為數據來源
- 建立儀表板(Dashboard)
- 可使用內建面板或官方模板,將數據以圖表方式呈現。