PromQL

PromQL

PromeQL是prometheus內置的數據查詢語言,其提供對時間序列數據豐富的查詢,聚合以及邏輯運算能力的支持。而且被普遍應用在prometheus的平常應用當中,包括數據查詢,可視化,告警處理當中,grafana繪圖就是利用了prometheus裏面的PromQL的功能node

查詢時間序列

當prometheus經過exporter採集到相對應的監控指標樣本數據後,咱們就能夠經過promQL對監控樣本數據進行查詢,
當咱們直接使用監控指標名稱查詢是,能夠查詢該指標下面的全部時間序列,例如正則表達式

prometheus_http_requests_total  #等同於prometheus_http_requests_total{}
#獲得的就是countr類型

image.png
image.png

PromQL還支持用戶根據時間序列的標籤匹配模式來對時間序列進行過濾,目前主要支持兩種匹配模式:徹底匹配正則匹配api

徹底匹配

PromeQL支持使用=!=兩種徹底匹配模式
咱們先過濾出請求頭爲/status的次數:bash

prometheus_http_requests_total{handler="/status"}

image.png

而後在過濾請求頭不包含/status/apiless

prometheus_http_requests_total{handler!="/status",handle!="/api"}

image.png

正則表表達式做爲過濾條件

PromQL還能夠支持使用正則表達式做爲匹配條件,多個表達式之間使用 進行分離:ide

  • 使用 label=~regx 表示選擇那些標籤符合正則表達式定義的時間序列
  • 反之使用label!~regx進行排除

注意
當咱們使用正則表達式的時候,表達式裏面必須指定一個能被徹底匹配的值,和一個正則表達式;函數

prometheus_http_requests_total{handler=~"/api/v1/.*"} #不合法
prometheus_http_requests_total{handler=~"/api/v1/.*",job="prometheus"} # 合法

image.png

範圍查詢

直接經過相似於PromQL表達式prometheus_http_requests_total查詢時間序列時,返回值中只會包含該時間序列中的最新的一個樣本值,這樣的返回結果咱們稱之爲瞬時向量,而相應的這樣的表達式稱之爲瞬時向量表達式
而咱們若是想獲得過去一段時間範圍內的樣本數據時,咱們則須要使用區間向量表達式,區間向量表達式和瞬時向量表達式之間的差別在於區間向量表達式中咱們須要定義時間選擇的範圍,是假範圍經過時間範圍選擇器[] 來定義。code

prometheus_http_requests_total{code="200"}[5m]

該表達式將會返回查詢到的時間序列中最近5分鐘的全部樣本數據
image.pngblog

經過區間向量表達式查詢到的結果咱們成爲區間向量
支持的單位:requests

  • s 秒
  • m 分鐘
  • h 小時
  • d 天
  • w 周
  • y 年

時間位移操做

在瞬間向量表達式或者區間向量表達式中,都是以當前時間爲基準的:

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

PromQL函數

sum求和函數

通常來講,若是描述樣本特徵的標籤(label)在並不是惟一的狀況下,經過PromQL查詢數據,會返回多條知足這些特徵維度的時間序列。而PromQL提供的聚合操做能夠用來對這些時間序列進行處理,造成一條新的時間序列:

sum(prometheus_http_requests_total{code=~"400|200",instance="192.168.1.56:9090"}) by (code)

說明:by關鍵字按照什麼什麼分組
image.png

min 求最小值

min(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))

在上述求和的過程過選擇出最小的值
image.png

max 求最大值

max(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))

image.png

avg 求平均值

avg(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))

image.png

count 記數

count(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))

獲得當前統計的值的數值

increase(v range-vector)增加率

其中參數v 是一個區間向量,increase函數獲取區間向量中的第一個和最後一個樣本並返回其增加量。

increase(node_cpu_seconds_total{cpu="0"}[2m])/120

這個經過node_cpu_seconds_total獲取時間序列cpu總使用時間內進兩分鐘的全部樣本,increase計算出近兩分鐘的增加量,最後除以時間120s 獲得node_cpu_seconds_total的平均增加率。

rate 求平均增加率

rate函數能夠直接計算區間向量v在時間窗口內平均增加速率。所以,經過如下表達式能夠獲得與increase函數相同的結

rate(node_cpu_seconds_total{cpu="0"}[2m])

image.png

須要注意的是使用rate或者increase函數去計算樣本的平均增加速率,容易陷入「長尾問題」當中,其沒法反應在時間窗口內樣本數據的突發變化。 例如,對於主機而言在2分鐘的時間窗口內,可能在某一個因爲訪問量或者其它問題致使CPU佔用100%的狀況,可是經過計算在時間窗口內的平均增加率卻沒法反應出該問題。

irate 求平均值

爲了解決上述問題,PromQL提供了另一個靈敏度更高的函數irate(v range-vector)。irate一樣用於計算區間向量的計算率,可是其反應出的是瞬時增加率。irate函數是經過區間向量中最後兩個兩本數據來計算區間向量的增加速率。這種方式能夠避免在時間窗口範圍內的「長尾問題」,而且體現出更好的靈敏度,經過irate函數繪製的圖標可以更好的反應樣本數據的瞬時變化狀態。
image.png

irate函數相比於rate函數提供了更高的靈敏度,不過當須要分析長期趨勢或者在告警規則中,irate的這種靈敏度反而容易形成干擾。所以在長期趨勢分析或者告警中更推薦使用rate函數。

數學運算符

基本運算符

  • / 除
  • % 求餘
  • ^ 冪運算

布爾運算符

  • == (相等)
  • != (不相等)
  • > (大於)
  • < (小於)
  • >= (大於等於)
  • <= (小於等於)

集合運算符

  • and (而且)
  • or (或者)
  • unless (排除)

操做符優先級

PromQL操做運算符優先級從高到低

  1. ^
  2. *, /, %
  3. +, -
  4. ==, !=, <=, <, >=, >
  5. and, unless
  6. or
相關文章
相關標籤/搜索