為什麼從 Metrics 談起#

監控(Monitoring)是橫跨多個世代、用來確保系統穩定運作的維運技術,而 Metrics 一直都是它的核心關注。對 Observability 來說,Metrics 同樣是不可或缺的基石。

特別是在實踐 SRE(Site Reliability Engineering)時,常見的概念都圍繞著 Metrics 在打轉:

  • SLI(Service-Level Indicator):服務水準指標。
  • SLO(Service-Level Objective):服務水準目標。
  • SLA(Service-Level Agreement):服務水準協議。

這些概念協助我們定義「什麼是重要的指標」、「指標要達到什麼水準才算合格」、「怎麼對指標做出承諾」。彼得・杜拉克的名言「If you can’t measure it, you can’t manage it」放在這裡再貼切不過。

一個指標包含哪些要素#

以「量體溫」這個動作為例,思考指標通常需要包含哪些元素:

  • 指標名稱:例如「體溫」。
  • 數值:實際量到的數字。
  • 時間:什麼時候量的;同一天可能會多次測量。
  • 補充資訊:被測量者的姓名、組別等屬性。

把多次量測串起來,就能得到「跨時間」的體溫變化。這種隨時間累積的資料就是時間序列資料(Time Series Data)。

時間序列資料通常會存放在專為它設計的時序資料庫(Time Series Database, TSDB)中。相較於一般資料庫,TSDB 針對寫入與時間範圍查詢進行了優化,因為這類資料幾乎不會被修改,主要的存取行為就是「寫入」與「依時間範圍讀取」。

Prometheus Metrics 的四個要素#

本系列在討論 Metrics 時主要以 Prometheus Metrics 為例。一筆 Prometheus 指標由四個部分組成:

  • 指標名稱:說明指標內容,常見會把單位帶進名稱中,例如 process_timememory_usage_byte
  • 時間:以 Unix timestamp 表示,單位為毫秒。
  • 數值:以 Float64 表示。
  • 補充資訊:多組 Key-Value Pair Label,例如 os=ubuntuip=1.1.1.1

應用程式可透過 Prometheus Client Library 自行生成 Metrics;對於沒辦法直接埋點的服務或機器,可以使用對應的 Exporter 採集後轉成 Prometheus 格式。

收集則分為 Pull Model(Prometheus 定期抓取 HTTP Endpoint)與 Push Model(透過 Pushgateway 中介),詳細運作與儲存、查詢部分留到下一章 Prometheus 中說明。

小結#

本章只是把 Metrics 與 Prometheus 的整體輪廓拉出來。後續章節會逐一深入:

  • Prometheus 本身的設計與 PromQL。
  • 各式 Exporter 怎麼補齊「沒辦法自己埋點」的監控對象。
  • Mimir / Cortex / Thanos 等長期儲存方案。
  • 兩個在 Metrics 領域深耕已久的工具:StatsD 與 Zabbix。

原文出處#

  • 原書/iThome:https://ithelp.ithome.com.tw/articles/10321021