prometheus學(xué)習(xí)筆記之PromQL
一、PromQL語(yǔ)句簡(jiǎn)介
官方文檔:https://prometheus.io/docs/prometheus/latest/querying/basics/
Prometheus提供?個(gè)函數(shù)式的表達(dá)式語(yǔ)?PromQL (Prometheus Query Language),可以使?戶實(shí)時(shí)
地查找和聚合時(shí)間序列數(shù)據(jù),表達(dá)式計(jì)算結(jié)果可以在圖表中展示,也可以在Prometheus表達(dá)式瀏覽器
中以表格形式展示,或者作為數(shù)據(jù)源, 以HTTP API的?式提供給外部系統(tǒng)使?。
二、PromQL 的數(shù)據(jù)類型

1.即時(shí)向量 (vector)
即時(shí)向量 (Instant vector): 特定或全部的時(shí)間序列集合上,具有相同時(shí)間戳的一組樣本值,說人話就是一個(gè)時(shí)間點(diǎn)的結(jié)果
?如node_memory_MemFree_bytes查詢當(dāng)前剩余內(nèi)存就是?個(gè)瞬時(shí)向量,該表達(dá)式的返回值中只會(huì)包含該時(shí)間序列中的最新的?個(gè)樣本值,?相應(yīng)的這樣的表達(dá)式稱之為瞬時(shí)向量表達(dá)式,
例如:prometheus_http_requests_total


2.區(qū)間向量 (matrix)
區(qū)間向量 (Range vector): 特定或全部的時(shí)間序列集合上,在指定的同一時(shí)間范圍內(nèi)的所有樣本值
區(qū)間向量選擇器可以返回 0 個(gè)、1 個(gè)或多個(gè)時(shí)間序列上在給定時(shí)間范值圍內(nèi)的各自的一組樣本。
區(qū)間向量選擇器的不同之處在于,需要通過在瞬時(shí)向量選擇器表達(dá)式后面添加包含在 [] 里的時(shí)長(zhǎng)來表達(dá)需在時(shí)間時(shí)序上返回的樣本所處的時(shí)間范圍。
說人話就是一段時(shí)間內(nèi)的結(jié)果
時(shí)間范圍:以當(dāng)前時(shí)間為基準(zhǔn)時(shí)間點(diǎn),指向過去一個(gè)特定的時(shí)間長(zhǎng)度;例如,[5m] 是指過去 5 分鐘之內(nèi)。
◆可用的時(shí)間單位有 ms(毫秒)、s(秒)、m(分鐘)、h(小時(shí))、d(天)、w(周)和 y(年)
◆必須使用整數(shù)時(shí)間,且能夠?qū)⒍鄠€(gè)不同級(jí)別的單位進(jìn)行串聯(lián)組合,以時(shí)間單位由大到小為順序,例如 1h30m,但不能使用 1.5h
?如最近?天的?卡流量趨勢(shì)圖,
例如: prometheus_http_requests_total[5m]
偏移向量選擇器
選擇器默認(rèn)都是以當(dāng)前時(shí)間為基準(zhǔn)時(shí)間,偏移修飾器用來調(diào)整基準(zhǔn)時(shí)間,使其往前偏移一段時(shí)間。偏移修飾器緊跟在選擇器后面,使用關(guān)鍵字 offset 來指定要偏移的量
例如,prometheus_http_requests_total offset 5m ,表示獲取以 prometheus_http_requests_total 為指標(biāo)名稱的所有時(shí)間序列在過去 5 分鐘之時(shí)的即時(shí)樣本;
prometheus_http_requests_total[5m] offset 1d ,表示獲取距此刻 1 天時(shí)間之前的 5 分鐘之內(nèi)的所有樣本偏移向量選擇器可以做環(huán)比、同比的筆記


3.標(biāo)量數(shù)據(jù) (Scalar)
標(biāo)量、純量數(shù)據(jù)(scalar):是?個(gè)浮點(diǎn)數(shù)類型的數(shù)據(jù)值,使?node_load1獲取到時(shí)?個(gè)瞬時(shí)向量,但是可?使?內(nèi)置函數(shù)scalar()將瞬時(shí)向量轉(zhuǎn)換為標(biāo)量,例如: scalar(sum(node_load1))

4.字符串(string)
字符串(string):簡(jiǎn)單的字符串類型的數(shù)據(jù),?前未使?,(a simple string value; currentlyunused)
三、指標(biāo)類型
1.Counter
Counter:計(jì)數(shù)器,Counter類型代表?個(gè)累積的指標(biāo)數(shù)據(jù),在沒有被重置的前提下只增不減,?如磁盤I/O總數(shù)、 nginx的請(qǐng)求總數(shù)、?卡流經(jīng)的報(bào)?總數(shù)等。如下圖

2.Gauge
Gauge類型代表?個(gè)可以任意變化的指標(biāo)數(shù)據(jù),值可以隨時(shí)增?或減少,如帶寬速錄、CPU負(fù)載、內(nèi)存利?率、 nginx 活動(dòng)連接數(shù)等。如下圖

3.Histogram
累積直?圖, Histogram會(huì)在?段時(shí)間范圍內(nèi)對(duì)數(shù)據(jù)進(jìn)?采樣(通常是請(qǐng)求持續(xù)時(shí)間或響應(yīng)??等),假如每分鐘產(chǎn)??個(gè)當(dāng)前的活躍連接數(shù),那么?天就會(huì)產(chǎn)?1440個(gè)數(shù)據(jù),查看數(shù)據(jù)的每間隔的繪圖跨
度為2?時(shí),那么2點(diǎn)的柱狀圖(bucket)會(huì)包含0點(diǎn)到2點(diǎn)即兩個(gè)?時(shí)的數(shù)據(jù),?4點(diǎn)的柱狀圖(bucket)則會(huì)包含0點(diǎn)到4點(diǎn)的數(shù)據(jù),?6點(diǎn)的柱狀圖(bucket)則會(huì)包含0點(diǎn)到6點(diǎn)的數(shù)據(jù)。

4.Summary
Summary 是一種類似于 Histogram 的指標(biāo)類型,但它在客戶端于一段時(shí)間內(nèi)(默認(rèn)為 10 分鐘)的每個(gè)采樣點(diǎn)進(jìn)行統(tǒng)計(jì),計(jì)算并存儲(chǔ)了分位數(shù)數(shù)值,Server 端直接抓取相應(yīng)值即可。

5.學(xué)習(xí)參考
訪問prometheus的/metrics接口,通過注釋確認(rèn)數(shù)據(jù)的類型

四、PromQL-常見指標(biāo)數(shù)據(jù)
CPU相關(guān)指標(biāo):
node_cpu_seconds_total{mode="idle"}:CPU空閑時(shí)間(秒)的總和。這是評(píng)估CPU使用率的重要指標(biāo)之一。
node_cpu_seconds_total{mode="system"}、node_cpu_seconds_total{mode="user"}等:分別表示CPU在內(nèi)核態(tài)和用戶態(tài)的運(yùn)行時(shí)間。
內(nèi)存相關(guān)指標(biāo):
node_memory_MemTotal_bytes:內(nèi)存總量(以字節(jié)為單位)。
node_memory_MemFree_bytes:空閑內(nèi)存大?。ㄒ宰止?jié)為單位)。
node_memory_Buffers_bytes和node_memory_Cached_bytes:分別表示被內(nèi)核用作緩沖和緩存的內(nèi)存大小。
node_memory_SwapTotal_bytes和node_memory_SwapFree_bytes:分別表示交換空間的總大小和空閑大小。
磁盤相關(guān)指標(biāo):
node_filesystem_size_bytes:文件系統(tǒng)的大?。ㄒ宰止?jié)為單位)。
node_filesystem_free_bytes和node_filesystem_avail_bytes:分別表示文件系統(tǒng)的空閑空間和非root用戶可用的空間大小。
node_disk_io_now、node_disk_io_time_seconds_total等:與磁盤I/O操作相關(guān)的指標(biāo),如當(dāng)前正在進(jìn)行的I/O操作數(shù)以及花費(fèi)在I/O操作上的總時(shí)間。
網(wǎng)絡(luò)相關(guān)指標(biāo):
node_network_receive_bytes_total和node_network_transmit_bytes_total:分別表示網(wǎng)絡(luò)接口接收和發(fā)送的總字節(jié)數(shù)。這些指標(biāo)對(duì)于評(píng)估網(wǎng)絡(luò)流量和帶寬使用情況非常重要。
系統(tǒng)負(fù)載相關(guān)指標(biāo):
node_load1、node_load5、node_load15:分別表示系統(tǒng)在過去1分鐘、5分鐘和15分鐘的平均負(fù)載。這些指標(biāo)有助于了解系統(tǒng)的整體忙碌程度和性能表現(xiàn)。
要獲取完整的指標(biāo)列表,可以訪問 exporter 的 metrics 端點(diǎn)(通常是 /metrics)
五、PromQL-匹配器
#標(biāo)簽選擇器用于定義標(biāo)簽過濾條件,目前支持如下4種匹配操作符:
= :完全相等
!= : 不相等
=~ : 正則表達(dá)式匹配
!~ : 正則表達(dá)式不匹配
#查詢格式<metric name>{<label name>=<label value>, ...}
node_load1{instance="172.31.7.111:9100"}
node_load1{job="promethues-node"}
node_load1{job="promethues-node",instance="172.31.7.111:9100"} #精確匹配
node_load1{job="promethues-node",instance!="172.31.7.111:9100"} #取反
node_load1{instance=~"172.31.7.11.*:9100$"} #包含正則且匹配
node_load1{instance!~"172.31.7.111:9100"} #包含正則且取反
注意事項(xiàng):
1.匹配到空標(biāo)簽值的標(biāo)簽選擇器時(shí),所有未定義該標(biāo)簽的時(shí)間序列同樣符合條件。例如
prometheus_http_requests_total{handler= ""},則該指標(biāo)名稱上所有未使用該標(biāo)簽(handler)的時(shí)間序列也符合條件
2.正則表達(dá)式將執(zhí)行完全錨定機(jī)制,它需要匹配指定的標(biāo)簽的整個(gè)值
3.向量選擇器至少要包含一個(gè)指標(biāo)名稱,或者至少有一個(gè)不會(huì)匹配到空字符串的標(biāo)簽選擇器,例如
{ job=""} 為非法的向量選擇器
4.使用 __name__ 做為標(biāo)簽名稱,還能夠?qū)χ笜?biāo)名稱進(jìn)行過濾。例如
{__name__=~".*http_requests_total"} 能夠匹配所有以 http_requests_total 為后綴的所有指標(biāo)
六、PromQL-時(shí)間范圍
s - 秒
m - 分鐘
h - ?時(shí)
d - 天
w - 周
y - 年
#瞬時(shí)向量表達(dá)式,選擇當(dāng)前最新的數(shù)據(jù)
node_memory_MemTotal_bytes{}
#區(qū)間向量表達(dá)式,選擇以當(dāng)前時(shí)間為基準(zhǔn),查詢所有節(jié)點(diǎn)node_memory_MemTotal_bytes指標(biāo)5分鐘內(nèi)
的數(shù)據(jù)
node_memory_MemTotal_bytes{}[5m]
#區(qū)間向量表達(dá)式,選擇以當(dāng)前時(shí)間為基準(zhǔn),查詢指定節(jié)點(diǎn)node_memory_MemTotal_bytes指標(biāo)5分鐘內(nèi)
的數(shù)據(jù)
node_memory_MemTotal_bytes{instance="172.31.7.111:9100"}[5m]
七、PromQL-運(yùn)算符
+ 加法
- 減法
* 乘法
/ 除法
% 模
^ 冪等
node_memory_MemFree_bytes/1024/1024 #將內(nèi)存進(jìn)?單位從字節(jié)轉(zhuǎn)?為兆
node_disk_read_bytes_total{device="sda"} +
node_disk_written_bytes_total{device="sda"} #計(jì)算磁盤讀寫數(shù)據(jù)量
八、PromQL-聚合運(yùn)算符
#Prometheus 內(nèi)置提供如下聚合函數(shù),也稱為聚合運(yùn)算符:
●sum():對(duì)樣本值求和
●min() :求取樣本值中的最小者
●max() :求取樣本值中的最大者
●avg() :對(duì)樣本值求平均值
●count() :對(duì)分組內(nèi)的時(shí)間序列進(jìn)行數(shù)量統(tǒng)計(jì)
●stddev() :對(duì)樣本值求標(biāo)準(zhǔn)差,以幫助用戶了解數(shù)據(jù)的波動(dòng)大小(或稱之為波動(dòng)程度),如CPU、內(nèi)存、流量波動(dòng)
●stdvar() :對(duì)樣本值求方差,它是求取標(biāo)準(zhǔn)差過程中的中間狀態(tài)
●topk() :逆序返回分組內(nèi)的樣本值最大的前 k 個(gè)時(shí)間序列及其值,即最大的 k 個(gè)樣本值
●bottomk() :順序返回分組內(nèi)的樣本值最小的前 k 個(gè)時(shí)間序列及其值,即最小的 k 個(gè)樣本值
●quantile() :分位數(shù),用于評(píng)估數(shù)據(jù)的分布狀態(tài),該函數(shù)會(huì)返回分組內(nèi)指定的分位數(shù)的值,即數(shù)值落在小于等于指定的分位區(qū)間的比例
●count_values() :對(duì)分組內(nèi)的時(shí)間序列的樣本值進(jìn)行數(shù)量統(tǒng)計(jì),即等于某值的樣本個(gè)數(shù)
●rate():函數(shù)是專?搭配counter數(shù)據(jù)類型使?函數(shù),功能是取counter數(shù)據(jù)類型在這個(gè)時(shí)間段中平均每秒的增量平均數(shù),適合?于計(jì)算數(shù)據(jù)相對(duì)平穩(wěn)的數(shù)據(jù)
●irate ():專?搭配counter數(shù)據(jù)類型使?函數(shù), irate獲取的是指定時(shí)間范圍內(nèi)最近的兩個(gè)數(shù)據(jù)來計(jì)算數(shù)據(jù)的速率,適合計(jì)算數(shù)據(jù)變化?較?的數(shù)據(jù),顯示的數(shù)據(jù)相對(duì)?較準(zhǔn)確
●abs():返回指標(biāo)數(shù)據(jù)的值
●absent():如果監(jiān)指標(biāo)有數(shù)據(jù)就返回空,如果監(jiān)控項(xiàng)沒有數(shù)據(jù)就返回1
計(jì)算每個(gè)節(jié)點(diǎn)的最?的流量值: max(node_network_receive_bytes_total) by (instance) 計(jì)算每個(gè)節(jié)點(diǎn)最近五分鐘每個(gè)device的最?流量 max(rate(node_network_receive_bytes_total[5m])) by (device) 最近總共請(qǐng)求數(shù) sum(prometheus_http_requests_total) 統(tǒng)計(jì)返回值的條數(shù) count(node_os_version)取從?到?的前6個(gè) topk(6, prometheus_http_requests_total) 樣本值排名最?的N個(gè)數(shù)據(jù) bottomk(6, prometheus_http_requests_total) rate(prometheus_http_requests_total[5m]) rate(node_network_receive_bytes_total[5m]) irate(prometheus_http_requests_total[5m]) irate(node_network_receive_bytes_total[5m])
abs(sum(prometheus_http_requests_total{handler="/metrics"}))
absent(sum(prometheus_http_requests_total{handler="/metrics"})) 如果有值則返回空,否則1
九、PromQL-聚合表達(dá)式
PromQL 中的聚合操作語(yǔ)法格式可采用如下面兩種格式之一:
<聚合函數(shù)>(向量表達(dá)式) by|without (標(biāo)簽)
<聚合函數(shù)> by|without (標(biāo)簽) (向量表達(dá)式)
by :僅使用by子句中指定的標(biāo)簽進(jìn)行聚合,結(jié)果向量中出現(xiàn)但未被 by 指定的標(biāo)簽則會(huì)被忽略;為了保留上下文信息,使用 by 子句時(shí)需要顯式指定其結(jié)果中原本出現(xiàn)的 job、instance 等一類的標(biāo)簽。
without:從結(jié)果向量中刪除由 without 指定的標(biāo)簽,未指定的那部分標(biāo)簽則用作分組標(biāo)準(zhǔn)示例:
(1)每臺(tái)主機(jī) CPU 在最近 5 分鐘內(nèi)的平均使用率
(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) * 100
(2)查詢 1 分鐘的 load average 的時(shí)間序列是否超過主機(jī) CPU 數(shù)量 2 倍
node_load1 > on (instance) 2 * count (node_cpu_seconds_total{mode="idle"}) by (instance)
(3)計(jì)算主機(jī)內(nèi)存使用率
可用內(nèi)存空間:空閑內(nèi)存、buffer、cache 指標(biāo)之和
node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes
已用內(nèi)存空間:總內(nèi)存空間減去可用空間
node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)
使用率:已用空間除以總空間
(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100
(4)計(jì)算所有 node 節(jié)點(diǎn)所有容器總計(jì)內(nèi)存:
sum by (instance) (container_memory_usage_bytes{instance=~"node*"})/1024/1024/1024
(5)計(jì)算 node01 節(jié)點(diǎn)最近 1m 所有容器 cpu 使用率:
sum (rate(container_cpu_usage_seconds_total{instance="node01"}[1m])) / sum (machine_cpu_cores{instance="node01"}) * 100
#container_cpu_usage_seconds_total 代表容器占用CPU的時(shí)間總和
(6)計(jì)算最近 5m 每個(gè)容器 cpu 使用情況變化率
sum (rate(container_cpu_usage_seconds_total[5m])) by (container_name)
(7)查詢 K8S 集群中最近 1m 每個(gè) Pod 的 CPU 使用情況變化率
sum (rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m])) by (pod_name)
#由于查詢到的數(shù)據(jù)都是容器相關(guān)的,所以最好按照 Pod 分組聚合
(8)查詢10分鐘內(nèi)每個(gè)api接口的狀態(tài)個(gè)數(shù)
sum without(job,instance) (rate(prometheus_http_requests_total[10m])) #等同于 sun by(code,handler)
參考文檔:https://prometheus.io/docs/prometheus/latest/querying/basics/
十、時(shí)間聚合函數(shù)
avg_over_time(range-vector):指定區(qū)間內(nèi)所有點(diǎn)的平均值。
min_over_time(range-vector):指定區(qū)間內(nèi)所有點(diǎn)的最小值。
max_over_time(range-vector):指定區(qū)間內(nèi)所有點(diǎn)的最大值。
sum_over_time(range-vector):指定區(qū)間內(nèi)所有值的總和。sum_over_time(prometheus_http_requests_total[5m]) #每個(gè)接口5分鐘內(nèi)請(qǐng)求的總和
count_over_time(range-vector):指定區(qū)間內(nèi)所有值的計(jì)數(shù)。
quantile_over_time(scalar, range-vector):指定區(qū)間內(nèi)的值的 φ 分位數(shù)(0 ≤ φ ≤ 1)。
stddev_over_time(range-vector):指定區(qū)間內(nèi)值的總體標(biāo)準(zhǔn)差。
stdvar_over_time(range-vector):指定區(qū)間內(nèi)值的總體標(biāo)準(zhǔn)方差。
last_over_time(range-vector):指定間隔內(nèi)最近的點(diǎn)值。
present_over_time(range-vector):指定間隔內(nèi)任意系列的值 1。
參考文檔:https://prometheus.io/docs/prometheus/latest/querying/functions/
寫在最后
編程精選網(wǎng)(www.codehuber.com),程序員的終身學(xué)習(xí)網(wǎng)站已上線!
如果這篇【文章】有幫助到你,希望可以給【JavaGPT】點(diǎn)個(gè)贊??,創(chuàng)作不易,如果有對(duì)【后端技術(shù)】、【前端領(lǐng)域】感興趣的小可愛,也歡迎關(guān)注?????? 【JavaGPT】??????,我將會(huì)給你帶來巨大的【收獲與驚喜】??????!
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!