promql(prometheus query language)是 prometheus 自己開發的表示式語言,語言表現力很豐富,內建函式也很多。使用它可以對時序資料進行篩選和聚合。
1.1 資料型別
promql 表示式計算出來的值有以下幾種型別:
1.2 時序選擇器
1.2.1 瞬時向量選擇器
瞬時向量選擇器用來選擇一組時序在某個取樣點的取樣值。
最簡單的情況就是指定乙個度量指標,選擇出所有屬於該度量指標的時序的當前取樣值。比如下面的表示式:
可以通過在後面新增用大括號包圍起來的一組標籤鍵值對來對時序進行過濾。比如下面的表示式篩選出了job
為prometheus
,並且group
為canary
的時序:
匹配標籤值時可以是等於,也可以使用正規表示式。總共有下面幾種匹配操作符:
下面的表示式篩選出了 environment 為 staging 或 testing 或 development,並且 method 不是 get 的時序:
度量指標名可以使用內部標籤__name__
來匹配,表示式http_requests_total
也可以寫成。表示式
匹配所有度量指標名稱以
job:
打頭的時序。
1.2.2 區間向量選擇器
區間向量選擇器類似於瞬時向量選擇器,不同的是它選擇的是過去一段時間的取樣值。可以通過在瞬時向量選擇器後面新增包含在裡的時長來得到區間向量選擇器。比如下面的表示式選出了所有度量指標為
http_requests_total
且job
為prometheus
的時序在過去 5 分鐘的取樣值。
說明:時長的單位可以是下面幾種之一:
1.2.3 偏移修飾器
前面介紹的選擇器預設都是以當前時間為基準時間,偏移修飾器用來調整基準時間,使其往前偏移一段時間。偏移修飾器緊跟在選擇器後面,使用 offset 來指定要偏移的量。比如下面的表示式選擇度量名稱為http_requests_total
的所有時序在5
分鐘前的取樣值。
下面的表示式選擇http_requests_total
度量指標在1
週前的這個時間點過去 5 分鐘的取樣值。
2.1 二元操作符
promql 的二元操作符支援基本的邏輯和算術運算,包含算術類、比較類和邏輯類三大類。
2.1.1 算術類二元操作符
算術類二元操作符有以下幾種:
算術類二元操作符可以使用在標量與標量、向量與標量,以及向量與向量之間。
二元操作符上下文裡的向量特指瞬時向量,不包括區間向量。
2.1.2 比較類二元操作符
比較類二元操作符有以下幾種:
比較類二元操作符同樣可以使用在標量與標量、向量與標量,以及向量與向量之間。預設執行的是過濾,也就是保留值。
也可以通過在運算子後面跟 bool 修飾符來使得返回值 0 和 1,而不是過濾。
2.1.3 邏輯類二元操作符
邏輯操作符僅用於向量與向量之間。
具體運算規則如下:
2.1.4 二元操作符優先順序
promql 的各類二元操作符運算優先順序如下:
^
*, /, %
+, -
==, !=, <=, <, >=, >
and, unless
or
2.2 向量匹配
前面算術類和比較類操作符都需要在向量之間進行匹配。共有兩種匹配型別,one-to-one
和many-to-one
/one-to-many
。
2.2.1 one-to-one 向量匹配
expr> > ignoring(list>) expr>
expr> > on(list>) expr>
比如對於下面的輸入:
執行下面的查詢:
得到的結果為:
0.04 // 24 / 600
0.05 // 6 / 120
也就是每一種 method 裡 code 為 500 的請求數占總數的百分比。由於 method 為 put 和 del 的沒有匹配元素所以沒有出現在結果裡。
2.2.2 many-to-one / one-to-many 向量匹配
這種匹配模式下,某一邊會有多個元素跟另一邊的元素匹配。這時就需要使用group_left
或group_right
組修飾符來指明哪邊匹配元素較多,左邊多則用group_left
,右邊多則用group_right
。其語法如下:
expr> > ignoring(list>) group_left(list>) expr>
expr> > ignoring(list>) group_right(list>) expr>
expr> > on(list>) group_left(list>) expr>
expr> > on(list>) group_right(list>) expr>
組修飾符只適用於算術類和比較類操作符。
對於前面的輸入,執行下面的查詢:
將得到下面的結果:
0.04 // 24 / 600
0.05 // 30 / 600
0.05 // 6 / 120
0.175 // 21 / 120
也就是每種 method 的每種 code 錯誤次數佔每種 method 請求數的比例。這裡匹配的時候 ignoring 了 code,才使得兩邊可以形成 many-to-one 形式的匹配。由於左邊多,所以需要使用 group_left 來指明。
many-to-one / one-to-many 過於高階和複雜,要盡量避免使用。很多時候通過 ignoring 就可以解決問題。
2.3 聚合操作符
promql 的聚合操作符用來將向量裡的元素聚合得更少。總共有下面這些聚合操作符:
聚合操作符語法如下:
>([parameter,] expression>) [without|by (list>)]
其中without
用來指定不需要保留的標籤(也就是這些標籤的多個值會被聚合),而by
正好相反,用來指定需要保留的標籤(也就是按這些標籤來聚合)。
下面來看幾個示例:
prometheus 內建了一些函式來輔助計算,下面介紹一些典型的。
原創 prometheus報警規則
需要將prometheus的報警規則存放在 etc rules裡面的yml檔案中 同時prometheus的yaml檔案需要開啟alertmanager,通過alertmanager觸發告警到各個平台,例如釘釘。rules.yml檔案 groups name api server 報警名 rules...
Prometheus 查詢 常用函式
原文 1 rate函式是專門搭配 counter型別資料使用的函式。它的功能是按照設定乙個時間段,取 counter在該時間段中的平均每秒的增量 rate v range vector 計算範圍向量中時間序列的每秒平均增加速率。單調性中斷 例如由於目標重啟而導致的計數器重置 會自動調整。同樣,計算會...
dos cd命令(非原創)
當我們需要處理不同路徑下的檔案的時候,很可能需要切換目錄,這個時候,可以考慮使用目錄跳轉命令cd。例如,我們開啟命令列視窗的時候,一般是這樣操作的 在桌面左下角找到 開始 選單,開啟 執行 輸入 cmd 回車。這個時候,命令列視窗預設的當前目錄位於當前使用者所在的路徑下,比如 c documents...