Prometheus 介紹與基礎入門 (上)

Prometheus 介紹與基礎入門 (上)

Prometheus 是一套開放式原始碼的系統監控警報框架TSDB(Time Series Database),該專案是由 SoundCloud 的工程師(前 Google 工程師)建立,Prometheus 啟發於 Google 的 Borgmon 監控系統。目前 Prometheus 已貢獻到 CNCF 成為孵化專案(2016-),其受歡迎程度僅次於 Kubernetes。

Prometheus Introduction 簡報

Prometheus 具備了以下特性:

  • 多維度資料模型
  1. 時間序列資料透過 Metric 名稱與鍵值(Key-value)來區分。
  2. 所有 Metrics 可以設定任意的多維標籤。
  3. 資料模型彈性度高,不需要刻意設定為以特定符號(ex: ,)分割。
  4. 可對資料模型進行聚合、切割與切片操作。
  5. 支援雙精度浮點數類型,標籤可以設定成 Unicode。
  • 靈活的查詢語言(PromQL),如可進行加減乘除等。
  • 不依賴分散式儲存,因為 Prometheus Server 是一個二進制檔,可在單個服務節點自主運行。
  • 基於 HTTP 的 Pull 方式收集時序資料。
  • 可以透過 Push Gateway 進行資料推送。
  • 支援多種視覺化儀表板呈現,如 Grafana。
  • 能透過服務發現(Service discovery)或靜態組態去獲取監控的 Targets。

Prometheus 生態圈中是由多個元件組成,其中有些是選擇性的元件:

  • Prometheus Server:收集與儲存時間序列資料,並提供 PromQL 查詢語言支援。
  • Client Library:客戶端函式庫,提供語言開發來開發產生 Metrics 並曝露 Prometheus Server。當 Prometheus Server 來 Pull 時,直接返回即時狀態的 Metrics。
  • Pushgateway:主要用於臨時性 Job 推送。這類 Job 存在期間較短,有可能 Prometheus 來 Pull 時就消失,因此透過一個閘道來推送。適合用於服務層面的 Metrics。
  • Exporter:用來曝露已有第三方服務的 Metrics 給 Prometheus Server,即以 Client Library 開發的 HTTP server。一個簡單範例 OpenStack Exporter,或是參考官方 Exporters and integrations
  • AlertManager:接收來至 Prometheus Server 的 Alert event,並依據定義的 Notification 組態發送警報,ex: E-mail、Pagerduty、OpenGenie 與 Webhook 等等。

Prometheus 運作流程

  1. Prometheus Server 定期從組態好的 Jobs 或者 Exporters 中拉取 Metrics,或者接收來自 Pushgateway 發送的 Metrics,又或者從其他的 Prometheus Server 中拉取 Metrics。
  2. Prometheus Server 在 Local 儲存收集到的 Metrics,並運行已定義好的 alert.rules,然後紀錄新時間序列或者像 AlertManager 發送警報。
  3. AlertManager 根據組態檔案來對接受到的 Alert event 進行處理,然後發送警報。
  4. 在視覺化介面呈現採集資料。

Prometheus Server 拉取 Exporter 資料,然後透過 PromQL 語法進行查詢,再將資料給 Web UI or Dashboard。

Prometheus Server 觸發 Alert Definition 定義的事件,並發送給 AelertManager。

AlertManager 依據設定發送警報給 E-mail、Slack 等等。

Prometheus 資料模型與 Metric 類型

本節將介紹 Prometheus 的資料模型與 Metrics 類型。

資料模型

Prometheus 儲存的資料為時間序列,主要以 Metrics name 以及一系列的唯一標籤(key-value)組成,不同標籤表示不同時間序列。模型資訊如下:

  • Metrics Name:該名稱通常用來表示 Metric 功能,例如 http_requests_total,即表示 HTTP 請求的總數。而 Metrics Name 是以 ASCII 字元、數字、英文、底線與冒號組成,並且要滿足[a-zA-Z_:][a-zA-Z0-9_:]* 正規表示法。
  • 標籤:用來識別同一個時間序列不同維度。如 http_request_total{method=”Get”}表示所有 HTTP 的 Get Request 數量,因此當 method=”Post” 時又是另一個新的 Metric。標籤也需要滿足[a-zA-Z_:][a-zA-Z0-9_:]* 正規表示法。
  • 樣本:實際的時間序列,每個序列包含一個 float64 值與一個毫秒的時間戳。
  • 格式:一般為<metric name>{<label name>=<label value>,…},例如:http_requests_total{method=”POST”,endpoint=”/api/tracks”}

Metrics 類型

Prometheus Client 函式庫支援了四種主要 Metric 類型:

  • Counter: 可被累加的 Metric,該 Metrics 不是累加就是重設為 0。比如一個 HTTP Get 錯誤的出現次數。
  • Gauge: 屬於瞬時、與時間無關的任意更動 Metric,如記憶體使用率。
  • Histogram: 主要使用在表示一段時間範圍內的資料採樣,可想像是柱狀圖。
  • Summary: 類似 Histogram,用來表示一端時間範圍內的資料採樣總結。

未完待續

撰文:白凱仁 迎棧科技資深工程師

訂閱電子報

Select list(s)*

 

Loading