PromeQL是prometheus內置的數據查詢語言,其提供對時間序列數據豐富的查詢,聚合以及邏輯運算能力的支持。而且被普遍應用在prometheus的平常應用當中,包括數據查詢,可視化,告警處理當中,grafana繪圖就是利用了prometheus裏面的PromQL
的功能node
當prometheus經過exporter採集到相對應的監控指標樣本數據後,咱們就能夠經過promQL對監控樣本數據進行查詢,
當咱們直接使用監控指標名稱查詢是,能夠查詢該指標下面的全部時間序列,例如正則表達式
prometheus_http_requests_total #等同於prometheus_http_requests_total{} #獲得的就是countr類型
PromQL還支持用戶根據時間序列的標籤匹配模式來對時間序列進行過濾,目前主要支持兩種匹配模式:徹底匹配
和正則匹配
。api
PromeQL支持使用=
和!=
兩種徹底匹配模式
咱們先過濾出請求頭爲/status
的次數:bash
prometheus_http_requests_total{handler="/status"}
而後在過濾請求頭不包含/status
和/api
的less
prometheus_http_requests_total{handler!="/status",handle!="/api"}
PromQL還能夠支持使用正則表達式做爲匹配條件,多個表達式之間使用|
進行分離:ide
label=~regx
表示選擇那些標籤符合正則表達式定義的時間序列label!~regx
進行排除注意
當咱們使用正則表達式的時候,表達式裏面必須指定一個能被徹底匹配的值,和一個正則表達式;函數
prometheus_http_requests_total{handler=~"/api/v1/.*"} #不合法 prometheus_http_requests_total{handler=~"/api/v1/.*",job="prometheus"} # 合法
直接經過相似於PromQL表達式prometheus_http_requests_total
查詢時間序列時,返回值中只會包含該時間序列中的最新的一個樣本值,這樣的返回結果咱們稱之爲瞬時向量,而相應的這樣的表達式稱之爲瞬時向量表達式
。
而咱們若是想獲得過去一段時間範圍內的樣本數據時,咱們則須要使用區間向量表達式,區間向量表達式和瞬時向量表達式之間的差別在於區間向量表達式中咱們須要定義時間選擇的範圍,是假範圍經過時間範圍選擇器[] 來定義。code
prometheus_http_requests_total{code="200"}[5m]
該表達式將會返回查詢到的時間序列中最近5分鐘的全部樣本數據blog
經過區間向量表達式查詢到的結果咱們成爲區間向量
支持的單位:requests
在瞬間向量表達式或者區間向量表達式中,都是以當前時間爲基準的:
prometheus_http_requests_total{} #瞬間向量表達式,選擇當前最新的數據 prometheus_http_requests_total{}[5m] #區間向量表達式,選擇以當前時間爲基準,5分鐘內的數據
而若是咱們想查詢,5分鐘前的瞬時樣本數據,或昨天一天的區間內的樣本數據呢? 這個時候咱們就可使用位移操做,位移操做的關鍵字爲offset。
可使用offset時間位移操做:
prometheus_http_requests_total{} offset 5m prometheus_http_requests_total{}[1d] offset 1d
通常來講,若是描述樣本特徵的標籤(label)在並不是惟一的狀況下,經過PromQL查詢數據,會返回多條知足這些特徵維度的時間序列。而PromQL提供的聚合操做能夠用來對這些時間序列進行處理,造成一條新的時間序列:
sum(prometheus_http_requests_total{code=~"400|200",instance="192.168.1.56:9090"}) by (code)
說明:by關鍵字按照什麼什麼分組
min(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))
在上述求和的過程過選擇出最小的值
max(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))
avg(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))
count(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))
獲得當前統計的值的數值
其中參數v 是一個區間向量,increase函數獲取區間向量中的第一個和最後一個樣本並返回其增加量。
increase(node_cpu_seconds_total{cpu="0"}[2m])/120
這個經過node_cpu_seconds_total
獲取時間序列cpu總使用時間內進兩分鐘的全部樣本,increase計算出近兩分鐘的增加量,最後除以時間120s 獲得node_cpu_seconds_total
的平均增加率。
rate函數能夠直接計算區間向量v在時間窗口內平均增加速率。所以,經過如下表達式能夠獲得與increase函數相同的結
rate(node_cpu_seconds_total{cpu="0"}[2m])
須要注意的是使用rate或者increase函數去計算樣本的平均增加速率,容易陷入「長尾問題」當中,其沒法反應在時間窗口內樣本數據的突發變化。 例如,對於主機而言在2分鐘的時間窗口內,可能在某一個因爲訪問量或者其它問題致使CPU佔用100%的狀況,可是經過計算在時間窗口內的平均增加率卻沒法反應出該問題。
爲了解決上述問題,PromQL提供了另一個靈敏度更高的函數irate(v range-vector)。irate一樣用於計算區間向量的計算率,可是其反應出的是瞬時增加率。irate函數是經過區間向量中最後兩個兩本數據來計算區間向量的增加速率。這種方式能夠避免在時間窗口範圍內的「長尾問題」,而且體現出更好的靈敏度,經過irate函數繪製的圖標可以更好的反應樣本數據的瞬時變化狀態。
irate函數相比於rate函數提供了更高的靈敏度,不過當須要分析長期趨勢或者在告警規則中,irate的這種靈敏度反而容易形成干擾。所以在長期趨勢分析或者告警中更推薦使用rate函數。
PromQL操做運算符優先級從高到低