監控工具之---Prometheus探索PromQL(二)

參考連接: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

  • Counter(計數器):只增不減的計數器,常見的監控指標,如http_requests_total,node_cpu都是Counter類型的監控指標
  • Gauge(儀表盤):可增可減的儀表盤,Gauge類型的指標側重於反應系統的當前狀態。所以這類指標的樣本數據可增可減。常見指標如:node_memory_MemFree(主機當前空閒的內容大小)、node_memory_MemAvailable(可用內存大小)都是Gauge類型的監控指標。
  • Histogram(直方圖):主要用於統計和分享樣本的分佈狀況。Histogram經過histogram_quantile函數是在服務器端計算的分位數
  • Summary(摘要):主要用於統計和分享樣本的分佈狀況。Sumamry的分位數則是直接在客戶端計算完成

初識PromQL服務器

   Prometheus經過指標名稱(metrics name)以及對應的一組標籤(labelset)惟必定義一條時間序列。指標名稱反映了監控樣本的基本標識,而label則在這個基本特徵上爲採集到的數據提供了多種特徵維度。用戶能夠基於這些特徵維度過濾,聚合,統計從而產生新的計算後的一條時間序列。less

  查詢時間序列函數

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

  PromQL支持使用=!=兩種徹底匹配模式:spa

  • 經過使用label=value能夠選擇那些標籤知足表達式定義的時間序列
  • 反之使用label!=value則能夠根據標籤匹配排除時間序列

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

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

例如:若是想查詢多個環節下的時間序列可使用以下表達式:

http_requests_total{environment=~"staging|testing|development",method!="GET"}

   範圍查詢

  直接經過相似於PromQL表達式httprequeststotal查詢時間序列時,返回值中只會包含時間序列中的最新的一個樣本值,這樣的返回結果咱們稱之爲瞬時向量。而相應的這樣的表達式稱之爲瞬時向量表達式。

  而若是咱們想要過去一段時間範圍內的樣本數據時,咱們則須要使用區間向量表達式。區間向量表達式和瞬時向量表達式之間的差別在於在區間向量表達式中咱們須要定義時間選擇的範圍,時間範圍經過時間範圍選擇器 [] 進行定義。

  例如:經過如下表達式能夠選擇最近5分鐘內的全部樣本數據:

http_request_total{}[5m]

   除了使用m表示分鐘之外,PromQL的時間範圍選擇器支持其餘時間單位:

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

  時間位移操做

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

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支持如下集合運算符:

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

  vector1 and vector2 會產生一個由vector1的元素組成的新的向量。該向量包含vector1中徹底匹配vector2中的元素組成。
  vector1 or vector2 會產生一個新的向量,該向量包含vector1中全部的樣本數據,以及vector2中沒有與vector1匹配到的樣本數據。
  vector1 unless vector2 會產生一個新的向量,新向量中的元素由vector1中沒有與vector2匹配的元素組成。

  操做符優先級

  1. ^
  2. * / %
  3. + -
  4. == != <= < >= >
  5. and unless
  6. or

PromQL聚合操做

  Prometheus還提供了下列內置的聚合操做符,這些操做符做用域瞬時向量。能夠將瞬時表達式返回的樣本數據進行聚合,造成一個新的時間序列。

  • sum(求和)
  • min(最小值)
  • max(最大值)
  • avg(平均值)
  • stddev(標準差)
  • stdvar(標準差別)
  • count(計數)
  • count_values(對value進行計數)
  • bottomk(後n條時序)
  • topk(前n條時序)
  • quantile(分佈統計)

  使用聚合操做的語法以下:

<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]

   其中只有count_values, quantile, topk, bottomk支持參數(parameter)。  without用於從計算結果中移除列舉的標籤,而保留其它標籤。by則正好相反,結果向量中只保留列出的標籤,其他標籤則移除。經過without和by能夠按照樣本的問題對數據進行聚合。

相關文章
相關標籤/搜索