Pages - Menu

2021年9月8日 星期三

[Prometheus]Prometheus的專用語言promQL

前言

在寫監控告警的時候,看別人寫好的dashboard裡面有一堆函數,
但卻偏偏不知道該怎麼使用,後來才知道這是 Prometheus的語言 PromQL,
這邊會將寫監控時用到的東西記下,基本上都是針對metrics做的處理。


正文

聚合函數

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

聚合函數可與by 或 without共同使用 ,可取得metrics裡的欄位名稱
例:

sum(rate(istio_requests_total{reporter=“destination”}[1m])) by (destination_workload)

內建函數

  • abs(絕對值)
  • absent(判斷指標名稱或標籤是否有值)
  • absent_over_time(同上,多了時間範圍)
  • ceil(四捨五入)
  • changes(返回區間變數每個樣本值變化的次數)
  • delta(計算區間向量第一個值和最後一個值的差值)
  • floor(取整數)
  • increase(返回區間向量第一個和最後一個樣本的增加值)
  • rate(計算區間向量 v 在時間視窗內平均每時間增長速率)
    rate(prometheus_http_requests_total[5m]) : HTTP請求量的增長率
  • irate(計算區間向量的增長率,但是它反應的是瞬時增長率)
  • deriv(計算樣本的線性回歸模型)
  • predict_linear(預測時間序列在n秒後的值)
  • sort(對向量按元素的值進行升序排序)
  • sort_desc(對向量按元素的值進行降序排序)

實際演練

可以先在prometheus上面測試語法,當測試完成後,再放到grafana上面看實際的圖表。
也可透過現有的grafana的dashboard裡面的Query Inspect 將Metric撈出來(這邊可以直接將變數取出)(fig.1)
撈出來的資料要再經過 urldecode 將符號轉成正常的符號


(fig.1)

所有的Metric格式如下,
指標名稱只能由ASCII字符、數字、下劃線以及冒號組成並必須符合正則表達式[a-zA-Z_:][a-zA-Z0-9_:]*

<metric name>{<label name>=<label value>, ...}

匹配函數

  • = 等於
  • != 不等於
  • =~ 開頭等於
  • !~ 開頭不等於

有時也會在label name上面使用 正規表示法,這邊使用的是RE2語法

例如,我們要取得memory的資料,其中的image的開頭只要包含 gcr.io 跟 istio。

  container_memory_working_set_bytes{id!="/",pod=~".*",image=~"[gcr.io | istio].*"}

變數設定

在grafana上面通常會設定一些參數,這是為了看指定的指標
有四種可選,

  • label_values(label) :
    返回Promthues所有監控指標中,標籤稱為label的所有可選值
  • label_values(metric, label) :
    返回Promthues所有監控指標metric中,標籤稱為label的所有可選值
  • metrics(metric) :
    返回所有指標名稱滿足metric定義正則表達式的指標名稱
  • query_result(query) :
    返回prometheus查詢語句的查詢結果

常用的label_value

  $Node       label_values(kubernetes_io_hostname)
  $Pod        label_values(kube_pod_info, pod)
  $Pod_ip     label_values(kube_pod_info, pod_ip)
  $phase      label_values(kube_pod_status_phase, phase)
  $container  label_values(kube_pod_container_info, container)

query_result範例,

query_result(kube_deployment_status_replicas{namespace !~ "istio-system|kube-system"}>0)

解釋:排除Deployment裡面的namespace 不是 istio-system或 kube-system,並且value>0的metrics。
這邊會顯示全部的資料,故在regex要再指定抓取 deployment的資料

/.*deployment="(.*?)".*/

ref.
Grafana templating with Prometheus labels
模板化Dashboard
PromQL的簡單使用

ref.
Prometheus-基礎系列-(四)-PromQL語句實踐-2
PromQL 內置函數
PromQL操作符

沒有留言:

張貼留言