Prometheus PormQL語法及告警規則寫法


這個是我一直不想寫的,嫌麻煩。還有就是這么多大神,我還差得遠,不過是為了通過輸出更好的理解這些知識。

介紹

Prometheus 是一個時序數據庫,可以存儲它通過 exporters 抓取回來的監控數據。那這些數據怎么去查詢呢?比如MySQL有SQL語句,那Prometheus有啥呢? PromQL (Prometheus Query Language) ,這是Prometheus開發的數據查詢DSL語言,日常的可視化以及告警規則都要用到它。這個很重要,一定得好好學一下。

舉個例子

瀏覽器打開Prometheus的web界面,http://localhost:9090/graph。可以看到有個輸入框, 就是輸 PromQL語句的地方,下方有個 Execute 按鈕。

先拿Nginx的指標舉個例子,Nginx如何監控,請查看我之前的文章Prometheus監控nginx

查看一台Nginx的活躍連接數,即active指標,如何看呢?

在服務器上查看完整的指標語句是:

[wonders@node1 ~]$ curl http://172.18.11.192:9145/metrics
# HELP nginx_http_connections Number of HTTP connections
# TYPE nginx_http_connections gauge
nginx_http_connections{state="active"} 1349
nginx_http_connections{state="reading"} 0
nginx_http_connections{state="waiting"} 1341
nginx_http_connections{state="writing"} 5
......

那我只想看 active 怎么辦呢?在輸 PromQL 語句的地方輸入

nginx_http_connections{state="active"}

會輸出所有Nginx機器的 active

nginx_http_connections{instance="172.18.11.192:9145",job="Nginx",state="active"}	1459
nginx_http_connections{instance="172.18.11.193:9145",job="Nginx",state="active"}	1456

當我只想看其中一台比如192這台的時候呢?

nginx_http_connections{instance="172.18.11.192:9145",state="active"}

會輸出192的指標

nginx_http_connections{instance="172.18.11.192:9145",job="Nginx",state="active"}	1358

是不是有點明白了?

當然線上不可能只有一台Nginx,那我想算總和呢?就是所有Nginx的active相加,這個基本需求PromQL早已實現。

sum(nginx_http_connections{state="active"})

輸出結果如下

{}	2900

同樣的 PromQL 還有sum (求和);min (最小值);max (最大值);avg (平均值);stddev (標准差);stdvar (標准差異);count (計數);count_values (對 value 進行計數);bottomk (樣本值最小的 k 個元素);topk (樣本值最大的k個元素);quantile (分布統計),等等各種計算函數。這種在Prometheus叫做聚合操作。


這時有人說我不想看某一台機器的指標怎么辦呢?使用 !=

nginx_http_connections{instance!="172.18.11.192:9145",state="active"}

這種操作符還有算數二次元運算符(加減乘除)、布爾運算符(= ,!= ,< , > ,<= ,>= )、集合運算符(and,or,unless)、匹配模式等等

看了上面的例子,應該有同學已經開竅了,下面的都是理論知識了。

理論知識

基本上是翻譯了官方的https://prometheus.io/docs/prometheus/latest/querying/basics/

查詢結果類型

PromQL 查詢結果有下面4種類型:

  • 即時數據 (Instant vector): 一組時間序列,每個時間序列包含一個樣本,所有樣本共享相同的時間戳,例如:http_requests_total
  • 區間數據 (Range vector): 組時間序列,其中包含每個時間序列隨時間的一系列數據點,例如:http_requests_total[5m]
  • 純量數據 (Scalar): 純量只有一個數字,沒有時序,例如:count(http_requests_total)
  • String-一個簡單的字符串值;目前未使用

查詢條件

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 所有數據 double 一倍。

比較運算符:

支持的比較運算符有 ==,!=,>,<,>=,<=, 例如 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) 的原則。

內置函數

Prometheus 內置不少函數,方便查詢以及數據格式化,例如將結果由浮點數轉為整數的 floor 和 ceil,

floor(avg(http_requests_total{code="200"}))
ceil(avg(http_requests_total{code="200"}))

查看 http_requests_total 5分鍾內,平均每秒數據

rate(http_requests_total[5m])

告警規則

看了前面的知識,現在知道如何取指標了,那告警怎么做呢?還是先舉個例子

在 Zabbix上告警怎么做的?比如單台Nginx active指標超過1w就要發出告警,觸發器那里選的是Nginx active項,然后選大於10000,觸發告警。

Prometheus 也是一樣啊,你用如下語句獲取當前值

nginx_http_connections{instance="172.18.11.192:9145",state="active"}

前面說了PromQL支持比較運算符,那告警規則就這么寫

nginx_http_connections{instance="172.18.11.192:9145",state="active"} > 10000

簡單吧。。。如下為完整的告警規則

 groups:
 - name: Nginx
   rules:
   - alert: HighErrorRate
     expr: nginx_http_connections{instance="172.18.11.192:9145",state="active"} > 10000
     for: 5m
     labels:
       severity: page
     annotations:
       summary: "啊啊啊啊啊,(instance {{ $labels.instance }}) 連接數超1w了"
       description: "Nginx 連接數現在 VALUE = {{ $value }}\n  LABELS: {{ $labels }}"
  #group:定義一組相關規則
  #alert:告警規則名稱
  #expr:基於PromQL的觸發條件
  #for 等待評估時間
  #label 自定義標簽
  #annotation: 指定一組附加信息Alertmanger特性

下一篇寫 Prometheus 如何做告警。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM