PromQL 基本使用
PromQL (Prometheus Query Language) 是 Prometheus 自己開發的數據查詢 DSL 語言,語言表現力非常豐富,內置函數很多,在日常數據可視化以及rule 告警中都會使用到它。
查詢結果類型
PromQL 查詢結果主要有 3 種類型:
- 瞬時數據 (Instant vector): 包含一組時序,每個時序只有一個點,例如:
http_requests_total - 區間數據 (Range vector): 包含一組時序,每個時序有多個點,例如:
http_requests_total[5m] - 純量數據 (Scalar): 純量只有一個數字,沒有時序,例如:
count(http_requests_total)
查詢條件
Prometheus 存儲的是時序數據,而它的時序是由名字和一組標簽構成的,其實名字也可以寫出標簽的形式,例如 http_requests_total 等價於 {name=”http_requests_total”}。
一個簡單的查詢相當於是對各種標簽的篩選,例如:
http_requests_total{code="200"}// 表示查詢名字為 http_requests_total,code 為 "200" 的數據
查詢條件支持正則匹配,例如:
http_requests_total{code!="200"}// 表示查詢 code 不為 "200" 的數據http_requests_total{code=~"2.."}// 表示查詢 code 為 "2xx" 的數據http_requests_total{code!~"2.."}// 表示查詢 code 不為 "2xx" 的數據
操作符
Prometheus 查詢語句中,支持常見的各種表達式操作符,例如
算術運算符:
支持的算術運算符有 +,-,*,/,%,^, 例如 http_requests_total * 2 表示將 http_requests_total 所有數據2倍。
比較運算符:
支持的比較運算符有 ==,!=,>,<,>=,<=, 例如 http_requests_total > 100 表示 http_requests_total 結果中大於 100 的數據。
邏輯運算符:
支持的邏輯運算符有 and,or,unless, 例如 http_requests_total == 5 or http_requests_total == 2 表示 http_requests_total 結果中等於 5 或者 2 的數據。
聚合運算符:
支持的聚合運算符有 sum,min,max,avg,stddev,stdvar,count,count_values,bottomk,topk,quantile,, 例如 max(http_requests_total) 表示 http_requests_total 結果中最大的數據。
注意Prometheus 的運算符也有優先級,它們遵從(^)> (*, /, %) > (+, -) > (==, !=, <=, <, >=, >) > (and, unless) > (or) 的原則。
-
without用於從計算結果中移除列舉的標簽,而保留其它標簽。by則正好相反,結果向量中只保留列出的標簽,其余標簽則移除。通過without和by可以按照樣本的問題對數據進行聚合
-
rate()
-
此函數計算整個采樣周期內每秒的增長率。
例如:rate(http_requests_total[5m]) 得出的是HTTP在5分鍾窗口內,平均每秒的請求率。作為最常見的函數,它以可預測的每秒輸出單位產生平滑的rate。
-
-
irate()
- 即 "瞬時rate",此函數和rate()一樣,計算每秒的增長率,但只對規定采樣周期內的最后兩個樣本進行計算,而忽略前面所有樣本
-
increase()
- increase(http_requests_total[5m]) 得出的是5分鍾的采樣周期內處理完成的HTTP請求的增長量
示例
increase(flink_jobmanager_job_numberOfFailedCheckpoints{env="prod-exclusive",projectCode="platform-v4",type="Flink"}[1h]) ##flink_jobmanager_job_numberOfFailedCheckpoints 1小時的增長量
位移操作 offset
http_requests_total offset 5m 當前時間點往前5分鍾時間數據
http_requests_total[5m] offset 5m 當前時間點前的5分鍾為結束點,再往前5分鍾為開始點時間段內的數據
參考文檔
https://prometheus.io/docs/prometheus/latest/querying/functions/
