前言
在寫監控告警的時候,看別人寫好的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的簡單使用
0 意見:
張貼留言