Prometheus 常用 PromQL 語句
PromQL 是 Prometheus 提供的一個函數(shù)式的表達(dá)式語言,可以使用戶實時地查找和聚合時間序列數(shù)據(jù)。表達(dá)式計算結(jié)果可以在圖表中展示,也可以在 Prometheus表達(dá)式瀏覽器中以表格形式展示,或者作為數(shù)據(jù)源,以 HTTP API 的方式提供給外部系統(tǒng)使用。PromQL 雖然以 QL 結(jié)尾,但是它不是類似 SQL 的語言,因為在時間序列上執(zhí)行計算類型時,SQL 語言相對缺乏表達(dá)能力。而 PromQL 語言表達(dá)能力非常豐富,可以使用標(biāo)簽進(jìn)行任意聚合,還可以使用標(biāo)簽將不同的標(biāo)簽連接到一起進(jìn)行算術(shù)運(yùn)算操作。內(nèi)置了時間和數(shù)學(xué)等很多函數(shù)可以使用。
然而 PromQL 也是大部分使用 Prometheus 的用戶的夢魘,壓根不知道如何去編寫,很多情況下都是參考別人的來編寫,假如自己去實現(xiàn)一個需求從0寫一條 PromQL 語句還是比較費(fèi)勁。這里我們就將一些常用的 PromQL 查詢方式進(jìn)行一些簡單的說明,希望對大家有所幫助。
選擇序列
選擇指定指標(biāo)名稱的序列最新樣本:
my_metric_name選擇指定指標(biāo)名稱序列5分鐘的樣本范圍:
my_metric_name[5m]篩選給定標(biāo)簽的序列:
my_metric_name{label1="value1", label2="value2"}更復(fù)雜的標(biāo)簽匹配器:
my_metric_name{label1!="value1", label2=~"regex1", label3!~"regex2"}匹配器:
=: 等于
!=: 不等于
=~: 正則匹配
!~: 正則不匹配
Counter 的增長速率
過去5分鐘每秒平均增長速率:
rate(http_requests_total[5m])1分鐘時間窗口中最后兩個樣本計算的每秒增長速率:
irate(http_requests_total[1m]過去1小時增加的絕對數(shù)值:
increase(http_requests_total[1h])多個序列聚合
對所有序列進(jìn)行求和:
sum(my_metric_name)根據(jù)方法和路徑標(biāo)簽維度進(jìn)行求和:
sum by(method, path) (my_metric_name)without 用于從計算結(jié)果中移除列舉的標(biāo)簽,而保留其它標(biāo)簽,by 則正好相反,結(jié)果向量中只保留列出的標(biāo)簽,其余標(biāo)簽則移除:
sum without(method, path) (my_metric_name)其他常用的聚合運(yùn)算符:sum(), min(), max(), avg(), stddev(), stdvar(), count(), count_values(),bottomk(), topk(), quantile()。
序列間的數(shù)學(xué)計算
將兩個相同標(biāo)簽的序列相加:
left_metric + right_metric只將匹配 instance 和 job 標(biāo)簽的序列相加:
left_metric + on(instance, job) right_metric忽略匹配 instance 和 job 標(biāo)簽的序列相加:
left_metric + ignoring(instance, job) right_metric多對一匹配模式:
left_metric + on(instance, job) group_left right_metric在結(jié)果中包括一側(cè)(右側(cè))的 version 標(biāo)簽:
left_metric + on(instance, job) group_left(version) right_metric集合操作
包括任何左側(cè)或右側(cè)的標(biāo)簽集合:
left_metric or right_metric包括任何同時存在于左側(cè)或右側(cè)的標(biāo)簽集:
left_metric and right_metric包含任何左側(cè)的標(biāo)簽集合,但不包括右側(cè)的:
left_metric unless right_metric只在某些標(biāo)簽上匹配:
left_metric and on(job, instance) right_metric過濾
只保留大于1024樣本值的序列:
left_metric > 1024只保留左邊樣本值大于右邊樣本值的序列:
left_metric > right_metric不過濾序列,而是比較序列,然后返回0或1:
left_metric > bool right_metric在某些匹配的標(biāo)簽上操作:
left_metric > on(job, instance) right_metric其他常用的比較運(yùn)算符:==、!=、>、<、>=、≤。
直方圖分位數(shù)
過去5分鐘內(nèi),每個標(biāo)簽維度請求延遲的90%分位數(shù):
histogram_quantile(0.9, rate(my_request_durations_seconds_bucket[5m]))只針對 method 和 path 維度的90%分位數(shù):
histogram_quantile(0.9,sum by(le, path, method) (rate(my_request_durations_seconds_bucket[5m])))
Gauges 的變化
過去一小時內(nèi)的絕對值變化:
delta(my_gauge[1h])基于過去4小時的數(shù)據(jù)來預(yù)測1小時后的數(shù)據(jù):
predict_linear(my_gauge[4h], 3600)時間
獲取 Unix 時間,以秒為單位:
time()獲取最后一次成功運(yùn)行的批處理作業(yè)的年齡:
time() - my_batch_job_last_success_timestamp_seconds查找一小時內(nèi)沒有成功的批處理作業(yè):
time() - my_batch_job_last_success_timestamp_seconds > 3600缺失數(shù)據(jù)處理
當(dāng)輸入向量為空時,創(chuàng)建一個一個輸出序列:
absent(my_metric_name)當(dāng)輸入的范圍向量5分鐘內(nèi)都是空的時候,創(chuàng)建一個空的輸出序列:
absent_over_time(my_metric_name[5m])標(biāo)簽操作
用 - 分隔符連接兩個標(biāo)簽的值:
label_join(my_metric_name, "-", "label1", "label2")提取標(biāo)簽的一部分并將其存儲在新標(biāo)簽中:
label_replace(my_metric, "dest-label", "$1", "source-label", "(.*):.*")關(guān)于 PromQL 更多的使用方法,可以參考 PromQL 官方文檔:
基礎(chǔ):https://prometheus.io/docs/prometheus/latest/querying/basics/
操作符:https://prometheus.io/docs/prometheus/latest/querying/operators/
函數(shù):https://prometheus.io/docs/prometheus/latest/querying/functions/
示例:https://prometheus.io/docs/prometheus/latest/querying/examples/
此外還有一個比較友好的 PromQL Cheatsheet 文檔,如下所示:

由于微信壓縮比較嚴(yán)重,如果你想要獲取原圖可以在公眾號中回復(fù) PromQL 關(guān)鍵字獲取高清 PDF 文檔。
K8S進(jìn)階訓(xùn)練營,點(diǎn)擊下方圖片了解詳情

