參考連接:https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/promqlnode
探索PromQL git
經過PromQL用戶能夠很是方便地對監控樣本數據進行統計分析,PromQL支持常見的運算操做符,同時PromQL中還提供了大量的內置函數能夠實現對數據的高級處理。固然在學習PromQL以前,用戶還須要瞭解Prometheus的樣本數據模型。PromQL做爲Prometheus的核心能力除了實現數據的對外查詢和展示,同時告警監控也是依賴PromQL實現。正則表達式
Metrics類型express
Prometheus定義了4中不一樣的指標類型:bash
初識PromQL服務器
Prometheus經過指標名稱(metrics name)以及對應的一組標籤(labelset)惟必定義一條時間序列。指標名稱反映了監控樣本的基本標識,而label則在這個基本特徵上爲採集到的數據提供了多種特徵維度。用戶能夠基於這些特徵維度過濾,聚合,統計從而產生新的計算後的一條時間序列。less
查詢時間序列函數
PromQL還支持用戶根據時間序列的標籤匹配模式來對時間序列進行過濾,目前主要支持兩種匹配模式:徹底匹配和正則匹配。學習
PromQL支持使用=和!=兩種徹底匹配模式:spa
PromQL還能夠支持使用正則表達式做爲匹配條件,多個表達式之間使用 | 進行分離
例如:若是想查詢多個環節下的時間序列可使用以下表達式:
http_requests_total{environment=~"staging|testing|development",method!="GET"}
範圍查詢
直接經過相似於PromQL表達式httprequeststotal查詢時間序列時,返回值中只會包含時間序列中的最新的一個樣本值,這樣的返回結果咱們稱之爲瞬時向量。而相應的這樣的表達式稱之爲瞬時向量表達式。
而若是咱們想要過去一段時間範圍內的樣本數據時,咱們則須要使用區間向量表達式。區間向量表達式和瞬時向量表達式之間的差別在於在區間向量表達式中咱們須要定義時間選擇的範圍,時間範圍經過時間範圍選擇器 [] 進行定義。
例如:經過如下表達式能夠選擇最近5分鐘內的全部樣本數據:
http_request_total{}[5m]
除了使用m表示分鐘之外,PromQL的時間範圍選擇器支持其餘時間單位:
時間位移操做
在瞬時向量表達式或者區間向量表達式中,都是以當前時間爲基準:
http_request_total{} # 瞬時向量表達式,選擇當前最新的數據 http_request_total{}[5m] # 區間向量表達式,選擇以當前時間爲基準,5分鐘內的數據
而若是咱們想查詢,5分鐘前的瞬時樣本數據,或昨天一天的區間內的樣本數據呢?這個時候咱們就可使用位移操做,位移操做的關鍵字爲offset。
例如:
http_request_total{} offset 5m http_request_total{}[1d] offset 1d
使用聚合操做
通常來講,若是描述樣本特徵的標籤(label)在並不是惟一的狀況下,經過PromQL查詢數據,會返回多條知足這些特徵維度的時間序列。而PromQL提供的聚合操做能夠用來對這些時間序列進行處理,造成一條新的時間序列:
# 查詢系統全部http請求的總量 sum(http_request_total) # 按照mode計算主機CPU的平均使用時間 avg(node_cpu) by (mode) # 按照主機查詢各個主機的CPU使用率 sum(sum(irate(node_cpu{mode!='idle'}[5m])) / sum(irate(node_cpu[5m]))) by (instance)
PromQL操做符
使用PromQL除了可以方便的按照查詢和過濾時間序列之外,PromQL還支持豐富的操做符,用戶可使用這些操做符進一步對事件序列進行二次加工,這些操做符包括:數學運算符,邏輯運算符,布爾運算等。
數學運算
PromQL支持的全部數學運算符以下所示:
使用布爾運算過濾時間序列
使用bool修飾符改變布爾運算符的行爲
布爾運算符的默認行爲是對時序數據進行過濾。而在其它的狀況下咱們可能須要的是真正的布爾結果。例如,只須要知道當前模塊的HTTP請求量是否>=1000,若是大於等於1000則返回1(true)不然返回0(false)。這時可使用bool修飾符改變布爾運算的默認行爲。 例如:
http_requests_total > bool 1000
使用bool修改符後,布爾運算不會對時間序列進行過濾,而是直接依次瞬時向量中的各個樣本數據與標量的比較結果0或者1。從而造成一條新的時間序列。
使用集合運算符
使用瞬時向量表達式可以獲取到一個包含多個時間序列的集合,咱們稱爲瞬時向量。 經過集合運算,能夠在兩個瞬時向量與瞬時向量之間進行相應的集合操做。目前,Prometheus支持如下集合運算符:
vector1 and vector2 會產生一個由vector1的元素組成的新的向量。該向量包含vector1中徹底匹配vector2中的元素組成。
vector1 or vector2 會產生一個新的向量,該向量包含vector1中全部的樣本數據,以及vector2中沒有與vector1匹配到的樣本數據。
vector1 unless vector2 會產生一個新的向量,新向量中的元素由vector1中沒有與vector2匹配的元素組成。
操做符優先級
PromQL聚合操做
Prometheus還提供了下列內置的聚合操做符,這些操做符做用域瞬時向量。能夠將瞬時表達式返回的樣本數據進行聚合,造成一個新的時間序列。
使用聚合操做的語法以下:
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
其中只有count_values, quantile, topk, bottomk支持參數(parameter)。 without用於從計算結果中移除列舉的標籤,而保留其它標籤。by則正好相反,結果向量中只保留列出的標籤,其他標籤則移除。經過without和by能夠按照樣本的問題對數據進行聚合。