Prometheus從根本上是將所有數(shù)據(jù)存儲為時間序列(屬于同一度量的時間戳值和相同的標記維度集)奏路。除了存儲的時間序列啊研,Prometheus還可以生成臨時派生的時間序列作為查詢的結果吮铭。
數(shù)據(jù)模型
每個時間序列都由指標名稱(metric name)和一組 鍵值對(lables)來唯一標識雏门。
指標名稱(metric name)表示被測量的系統(tǒng)的某一特性(例如http_requests_total表示接收到的HTTP請求的總數(shù))伤柄。它可能包含ASCII字母和數(shù)字牧氮,以及下劃線和冒號象泵。它必須匹配正則表達式[a-zA-Z_:][a-zA-Z0-9_:]*寞秃。
標簽(lable)表示了Prometheus數(shù)據(jù)模型的維度:同一指標名稱的任何給定標簽組合都標識該度量標準的特定維度實例化(例如:使用POST方法用于/api/tracks處理程序的所有HTTP請求)。查詢語言允許基于這些維度進行過濾和聚合偶惠。更改任何標簽值(包括添加或刪除標簽)將創(chuàng)建新的時間序列春寿。
標簽名稱可以包含ASCII字母,數(shù)字以及下劃線洲鸠。他們必須匹配正則表達式[a-zA-Z_][a-zA-Z0-9_]*堂淡。其中以__作為前綴的標簽,是系統(tǒng)保留的關鍵字扒腕,只能在系統(tǒng)內(nèi)部使用绢淀。
指標
給定指標名稱和一組標簽,通常使用此表示法標識時間序列瘾腰。所有的指標(Metric)都通過如下格式標示:
<metric name>{<label name>=<label value>, ...}
例如皆的,一個時間序列指標名稱api_http_requests_total和標簽method="POST"和handler="/messages"可以這樣寫:
api_http_requests_total{method="POST", handler="/messages"}
樣本
在時間序列中的每一個點稱為一個樣本(sample),樣本形成實際的時間序列數(shù)據(jù)蹋盆。樣本由以下三部分組成:
- 指標(metric):metric name和描述當前樣本特征的labelsets;
- 時間戳(timestamp):一個精確到毫秒的時間戳;
- 樣本值(value): 一個folat64的浮點型數(shù)據(jù)表示當前樣本的值费薄。
例如:
<--------------- 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(計數(shù)器)栖雾、Gauge(儀表盤)楞抡、Histogram(直方圖)、Summary(摘要)析藕。這些目前僅在客戶端庫中區(qū)分(以區(qū)分針對特定類型的使用而定制的API)召廷。Prometheus服務器尚未使用類型信息,并將所有數(shù)據(jù)都看做是無類型區(qū)分的時間序列。這種情況可能在將來會發(fā)生變化竞慢。
Counter
Counter類型的指標其工作方式和計數(shù)器一樣先紫,只增不減(除非系統(tǒng)發(fā)生重置)。常見的監(jiān)控指標筹煮,如http_requests_total遮精,node_cpu都是Counter類型的監(jiān)控指標。 一般在定義Counter類型指標的名稱時推薦使用_total作為后綴败潦。
Counter是一個簡單但有強大的工具本冲,例如我們可以在應用程序中記錄某些事件發(fā)生的次數(shù),通過以時序的形式存儲這些數(shù)據(jù)变屁,我們可以輕松的了解該事件產(chǎn)生速率的變化眼俊。PromQL內(nèi)置的聚合操作和函數(shù)可以用戶對這些數(shù)據(jù)進行進一步的分析。
Gauge
與Counter不同粟关,Gauge類型的指標側重于反應系統(tǒng)的當前狀態(tài)。因此這類指標的樣本數(shù)據(jù)可增可減环戈。常見指標如:node_memory_MemFree(主機當前空閑的內(nèi)存大忻瓢濉)、node_memory_MemAvailable(可用內(nèi)存大性喝)都是Gauge類型的監(jiān)控指標遮晚。
Gauge通常用于測量值,如溫度或當前內(nèi)存使用情況拦止,但也可用于可以上下的“計數(shù)”县遣,例如并發(fā)請求的數(shù)量。
Histogram
Histogram主用用于統(tǒng)計和分析樣本的分布情況汹族。在大多數(shù)情況下人們都傾向于使用某些量化指標的平均值萧求,例如CPU的平均使用率、頁面的平均響應時間顶瞒。
Histogram類型的樣本會反應當前指標的記錄的總數(shù)(以_count作為后綴)以及其值的總量(以_sum作為后綴)夸政。
Summary
與Histogram類似,Summary采樣觀察數(shù)據(jù)(通常是請求持續(xù)時間和響應大小等)榴徐。雖然它還提供觀察的總數(shù)和所有觀測值的總和守问,但它在滑動時間窗口上計算可配置的分位數(shù)。
同時對于Histogram的指標坑资,我們還可以通過histogram_quantile()函數(shù)計算出其值的分位數(shù)耗帕。不同在于Histogram通過histogram_quantile函數(shù)是在服務器端計算的分位數(shù)。 而Sumamry的分位數(shù)則是直接在客戶端計算完成袱贮。因此對于分位數(shù)的計算而言仿便,Summary在通過PromQL進行查詢時有更好的性能表現(xiàn),而Histogram則會消耗更多的資源。
任務和實例
在Prometheus中探越,每一個暴露監(jiān)控樣本數(shù)據(jù)的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>"}:抓取的持續(xù)時間。
- scrape_samples_post_metric_relabeling{job="<job-name>", instance="<instance-id>"}:應用度量標準重新標記后剩余的樣本數(shù)寝并。
- scrape_samples_scraped{job="<job-name>", instance="<instance-id>"}:目標暴露的樣本數(shù)箫措。
up時間序列對實例的可用性監(jiān)控非常重要。