Prometheus 語法初探
概述
Prometheus 是一套使用 Go 語言進行編寫的監控工具,專注於基礎監控,默認僅保留 15 天的監控數據,15 天的監控數據,已經足夠運維人員去排查和分析運維故障。Prometheus 有專門的 PQL 語言,可以對採集上來的指標進行多維度、函數分析,具有高度的指標定製化能力。本文將同大家一起學習 Prometheus 的 PQL 語法,驗證並記錄下過程。
PQL 重要概念
即時向量
一個時間點某指標的值,如:
node_cpu_seconds_total{mode="idle"}
區間向量
指的是在某段時間內 metric 的取值,每個時間點都包含一系列的值,如:
node_cpu_seconds_total{mode="idle"}[5m]
指標類型
-
Gauge,度量值,這個值是有變化的,如 CPU 使用率,有高有低
-
Counter,累計值,從程序開始,只增不減,如開機運行時長
標籤
一個指標,可以包括多個標籤(label),用來指示這個指標的具體表示信息,起到對一個指標的修飾作用,標籤可使用正則表達式進行匹配。
如 node_cpu_seconds_total 指標,直接查詢該指標,會打印出該指標的全部標籤數據。
拿關係型數據比較,可以這麼類似比喻,node_cpu_seconds_total 爲表,cpu,instance,job,mode,value 爲其字段,表數據總爲最新的數據,數據量總數等於各個字段的枚舉值相乘。
當我們給這個 Metric 指標做了標籤過濾時,相當於執行了 where 限制性語句,如 node_cpu_seconds_total{mode="idle"},只過濾出包含 mode 字段,並且其值爲 idle,類似於 SQL 語句。
select * from node_cpu_seconds_total where mode = 'idle'
標籤支持正則表達式,使用 =~(Rexp),如 node_cpu_seconds_total{mode=~"idle|iowait"},類似於 SQL 語句。
select * from node_cpu_seconds_total where mode = 'idle' or mode = 'iowait'
標籤過濾器可以有多個,用逗號進行隔開,相當於執行了 where … and … 語句,如 node_cpu_seconds_total{mode="idle",cpu='0'},類似於 SQL 語句。
select * from node_cpu_seconds_total where mode = 'idle' and cpu = '0'
配合標籤,我們可以精確的找到我們需要用於展示或者計算的指標值。
偏移量 offset
指標通過偏移量 offset 關鍵字,可以查詢相對於當前時間點之前的數據,默認獲取當前最新數據,如 node_cpu_seconds_total offset 5m,獲取 5 分鐘前該指標的數據。
註釋
PQL 使用 "#" 對語法進行註釋。
函數
sum
-
sum 函數可以對瞬時向量進行求和,如 sum(node_cpu_seconds_total),將統計所有值的總和。類似於 select sum(value) from node_cpu_seconds_total
-
sum 後面可以加 by 關鍵字,表示通過那個維度進行數據統計求和,如 sum by (mode) (node_cpu_seconds_total) 類似於 select sum(vaule) from node_cpu_seconds_total group by mode
min
-
min 函數可以對瞬時向量進行求最小值,min(node_cpu_seconds_total)。類似於 select min(value) from node_cpu_seconds_total
-
同樣,也支持 by 關鍵字,進行某個維度的求最小值
max
-
max 函數可以對瞬時向量進行求最大值,max(node_cpu_seconds_total)。類似於 select max(value) from node_cpu_seconds_total
-
同樣,也支持 by 關鍵字,進行某個維度的求最大值
avg
-
avg 函數可以對瞬時向量進行求平均 avg(node_cpu_seconds_total)。類似於 select avg(value) from node_cpu_seconds_total
-
同樣,也支持 by 關鍵字,進行某個維度的求最均值
count
-
count 函數可以對瞬時向量個數求總數,如 count(node_cpu_seconds_total) 類似於 select count(*) from node_cpu_seconds_total
-
同樣,也支持 by 關鍵字,進行某個維度的求最總個數
topk
-
topk 函數可以對瞬時向量的值從大到小進行排列,並獲取前 N 個值,需要傳入兩個參數,一個是 N,一個是指標,如 topk(5,node_cpu_seconds_total),類似於 select * from (select * from node_cpu_seconds_total order by value desc) where rownum<=5
-
同樣,也支持 by 關鍵字,進行某個維度進行計算
bottomk
- 同 topk 相反,這裏不再贅述。
計算
+ 加法運算
-
指標支持加法運算,一個即時向量,由於標籤值不一致,所以會有多個值,這些值可以跟另外一個即時向量進行相加,這裏的相加要保持一個原則,那就是需要具有同一個標籤值的纔會相加。node_cpu_seconds_total + node_cpu_seconds_total,這相當於所有值都多加一個原來的值,總體的值的數量是保持不變的。
-
相加的兩個瞬時向量個數不一致情況:node_cpu_seconds_total 和 node_cpu_seconds_total{mode="idle"},後者經過過濾後,數量上明顯比第一個少,此時輸出的結果個數同過濾後數量少的個數一致。
-
兩個即時向量都不具備有同樣的標籤值情況:如 node_cpu_seconds_total + node_memory_Active_bytes,此時由於沒有任何一個值具有相同的標籤值,所以結果爲 nodata,此時我們可以用 ignoring 關鍵字,對標籤值進行忽略,使他們可以進行相加。由於 node_cpu_seconds_total 比 node_memory_Active_bytes 多了 cpu 和 mode 標籤,所以 node_cpu_seconds_total 數量個數一般大於 node_memory_Active_bytes 個數,所以需要使用 group_left,node_cpu_seconds_total + ignoring(cpu,mode) group_left node_memory_Active_bytes,結果集以左邊的 node_cpu_seconds_total 個數爲準,如果加號兩個即時向量位置相反,則可以使用 group_right,如 node_memory_Active_bytes + ignoring(cpu,mode) group_right node_cpu_seconds_total
- 減法運算
- 類似加法運算
*** 乘法運算**
- 類似加法運算
/ 除法運算
- 類似加法運算
邏輯比較
== 判斷是否相等
- == 用於判斷左右兩邊的值是否相等,如果相等則爲 1(true),如果不等則爲 0(false),如 node_cpu_seconds_total ==BOOL 0 判斷是否有存在 0 值
!= 判斷是否不等
- 類似 ==
>= 大於等於
-
= 用於判斷左邊的值是否大於或等於右邊的值,如果滿足,則爲 1(true),如果不滿足則爲 0(false)
<= 小於等於
- 類似大於等於
> 大於
- 類似大於等於
< 小於
- 類似大於等於
數據集操作
and
- 對多個指標的數據集進行標籤判斷,獲取兩個指標集具有共同的標籤的值 node_cpu_seconds_total and node_cpu_guest_seconds_total,類似 sql select * from node_cpu_seconds_total a,node_cpu_guest_seconds_total b where a.cpu = b.cpu and a.instance = b.instance and a.job=b.job and a.mode = b.mode
or
- 對多個指標集數據進行展示,如果有標籤重複,則僅顯示其中一個標籤的值。
unless
- 對多個指標的數據集進行標籤判斷,獲取兩個指標集不具有共同的標籤的值,結果集以最左邊爲準,如 node_memory_Active_bytes unless node_cpu_seconds_total 和 node_cpu_seconds_total unless node_memory_Active_bytes 結果是不一樣的。
函數
用於即時向量的函數
abs
- abs 返回即時向量的絕對值
absent
-
absent 用於檢測即時向量中,某個標籤是否存在,如果不存在,則 value 爲 1,如檢查標籤爲 node_arp_entries{instance=“localhost:9100”} 是否存在有元素,如果存在則返回 nodata,如果不存在 value 則爲 1
-
常用於檢測指標是否丟失。
ceil
- 用於將浮點數向上化爲最接近的一個整數,如值爲 0.1,則爲向上取整,成爲 1。
floor
- 用於將浮點數向下化爲最接近的一個整數,如值爲 0.1,則爲向下取整,成爲 0。
clamp_max
- 該函數需要兩個參數,一個是向量,另外一個是封頂值,如果一個向量的值超過該封頂值,該向量的值則爲封頂值。
clamp_min
該函數需要兩個參數,一個是向量,另外一個是觸底值,如果一個向量的值超過該觸底值,該向量的值則爲觸底值。
用於區間向量的函數
區間向量的函數執行完成後,便成爲了即時向量。
absent_over_time
- absent_over_time 用於檢測在給定的區間向量中,是否存在有元素,如果沒有則 value 爲 1。
changes
- 返回給定的區間向量中,對比於當前值,發生變化的元素的數量。
delta
-
返回區間向量中,第一個元素和最後一個元素之間的變化值,時間區間也參與算法計算,所以即時第一個元素和最後一個元素均爲整數,該值也未必是整數。
-
須作用在 gauge 類型的指標
deriv
-
返回區間向量中,滿足線性規律的每秒變化值
-
須作用在 gauge 類型的指標
idelta
-
該函數計算區間向量間,最後兩個元素的差值,如果區間內沒有兩個元素,則返回 nodata
-
須作用在 gauge 類型的指標
irate
- 該函數計算區間向量間,最後兩個元素的差值,並且除以區間的秒數,如果區間內沒有兩個元素,則返回 nodata。
_over_time
- 該函數技術按區間向量的最大(max)、最小(min)、平均(avg)、求和(sum)、求總數()等匯聚值。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/kqCvOEnmB3CoqJqi75WbyA