開源監控系統Prometheus中的一些概念

Prometheus從根本上是將所有數據存儲爲時間序列(屬於同一度量的時間戳值和相同的標記維度集)。除了存儲的時間序列,Prometheus還可以生成臨時派生的時間序列作爲查詢的結果。

數據模型

每個時間序列都由指標名稱(metric name)和一組 鍵值對(lables)來唯一標識。

指標名稱(metric name)表示被測量的系統的某一特性(例如http_requests_total表示接收到的HTTP請求的總數)。它可能包含ASCII字母和數字,以及下劃線和冒號。它必須匹配正則表達式[a-zA-Z_:][a-zA-Z0-9_:]*。

標籤(lable)表示了Prometheus數據模型的維度:同一指標名稱的任何給定標籤組合都標識該度量標準的特定維度實例化(例如:使用POST方法用於/api/tracks處理程序的所有HTTP請求)。查詢語言允許基於這些維度進行過濾和聚合。更改任何標籤值(包括添加或刪除標籤)將創建新的時間序列。

標籤名稱可以包含ASCII字母,數字以及下劃線。他們必須匹配正則表達式[a-zA-Z_][a-zA-Z0-9_]*。其中以__作爲前綴的標籤,是系統保留的關鍵字,只能在系統內部使用。

指標

給定指標名稱和一組標籤,通常使用此表示法標識時間序列。所有的指標(Metric)都通過如下格式標示:

<metric name>{<label name>=<label value>, ...}

例如,一個時間序列指標名稱api_http_requests_total和標籤method="POST"和handler="/messages"可以這樣寫:

api_http_requests_total{method="POST", handler="/messages"}

樣本

在時間序列中的每一個點稱爲一個樣本(sample),樣本形成實際的時間序列數據。樣本由以下三部分組成:

  • 指標(metric):metric name和描述當前樣本特徵的labelsets;
  • 時間戳(timestamp):一個精確到毫秒的時間戳;
  • 樣本值(value): 一個folat64的浮點型數據表示當前樣本的值。

例如:

<--------------- metric ---------------------><-timestamp -><-value->
http_request_total{status="200", method="GET"}@1434417560938 => 94355
http_request_total{status="200", method="GET"}@1434417561287 => 94334
​
http_request_total{status="404", method="GET"}@1434417560938 => 38473
http_request_total{status="404", method="GET"}@1434417561287 => 38544
​
http_request_total{status="200", method="POST"}@1434417560938 => 4748
http_request_total{status="200", method="POST"}@1434417561287 => 4785

指標類型

Prometheus在客戶端庫提供了四種不同的指標類型(metric type)。Counter(計數器)、Gauge(儀表盤)、Histogram(直方圖)、Summary(摘要)。這些目前僅在客戶端庫中區分(以區分針對特定類型的使用而定製的API)。Prometheus服務器尚未使用類型信息,並將所有數據都看做是無類型區分的時間序列。這種情況可能在將來會發生變化。

Counter

Counter類型的指標其工作方式和計數器一樣,只增不減(除非系統發生重置)。常見的監控指標,如http_requests_total,node_cpu都是Counter類型的監控指標。 一般在定義Counter類型指標的名稱時推薦使用_total作爲後綴。

Counter是一個簡單但有強大的工具,例如我們可以在應用程序中記錄某些事件發生的次數,通過以時序的形式存儲這些數據,我們可以輕鬆的瞭解該事件產生速率的變化。PromQL內置的聚合操作和函數可以用戶對這些數據進行進一步的分析。

Gauge

與Counter不同,Gauge類型的指標側重於反應系統的當前狀態。因此這類指標的樣本數據可增可減。常見指標如:node_memory_MemFree(主機當前空閒的內存大小)、node_memory_MemAvailable(可用內存大小)都是Gauge類型的監控指標。

Gauge通常用於測量值,如溫度或當前內存使用情況,但也可用於可以上下的“計數”,例如併發請求的數量。

Histogram

Histogram主用用於統計和分析樣本的分佈情況。在大多數情況下人們都傾向於使用某些量化指標的平均值,例如CPU的平均使用率、頁面的平均響應時間。

Histogram類型的樣本會反應當前指標的記錄的總數(以_count作爲後綴)以及其值的總量(以_sum作爲後綴)。

Summary

與Histogram類似,Summary採樣觀察數據(通常是請求持續時間和響應大小等)。雖然它還提供觀察的總數和所有觀測值的總和,但它在滑動時間窗口上計算可配置的分位數。

同時對於Histogram的指標,我們還可以通過histogram_quantile()函數計算出其值的分位數。不同在於Histogram通過histogram_quantile函數是在服務器端計算的分位數。 而Sumamry的分位數則是直接在客戶端計算完成。因此對於分位數的計算而言,Summary在通過PromQL進行查詢時有更好的性能表現,而Histogram則會消耗更多的資源。

任務和實例

在Prometheus中,每一個暴露監控樣本數據的HTTP服務稱爲一個實例。例如在當前主機上運行的node exporter可以被稱爲一個實例(Instance)。

而一組用於相同採集目的的實例,或者同一個採集進程的多個副本則通過一個一個任務(Job)進行管理。

例如,具有四個複製實例的API服務器任務:

job: api-server
instance 1: 1.2.3.4:5670
instance 2: 1.2.3.4:5671
instance 3: 5.6.7.8:5670
instance 4: 5.6.7.8:5671

當Prometheus抓取目標時,它會自動將一些標籤附加到抓取的時間序列中,用於識別被抓取的目標:

  • job:目標所屬的已配置任務名稱。
  • instance:<host>:<port>已抓取的目標URL 的一部分。

對於每次實例抓取,Prometheus都會在以下時間序列中存儲樣本:

  • up{job="<job-name>", instance="<instance-id>"}:1代表實例是健康的,即可達,0代表抓取失敗。
  • scrape_duration_seconds{job="<job-name>", instance="<instance-id>"}:抓取的持續時間。
  • scrape_samples_post_metric_relabeling{job="<job-name>", instance="<instance-id>"}:應用度量標準重新標記後剩餘的樣本數。
  • scrape_samples_scraped{job="<job-name>", instance="<instance-id>"}:目標暴露的樣本數。

up時間序列對實例的可用性監控非常重要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章