Prometheus監控教程:使用PromQL查詢監控數據(上篇)

轉載:https://blog.csdn.net/guting18893110463/article/details/129656289?spm=1001.2014.3001.5502

PromQL是Prometheus提供的一個函數式的表達式語言,可以使用戶實時地查找和聚合時間序列數據。表達式計算結果可以在圖表中展示,也可以在 Prometheus表達式瀏覽器中以表格形式展示,或者作爲數據源以HTTP API的方式提供給外部系統使用。PromQL雖然以QL結尾,但是它不是類似SQL的語言,因爲在時間序列上執行計算類型時,SQL語言相對缺乏表達能力。而PromQL語言表達能力非常豐富,可以使用標籤進行任意聚合,還可以使用標籤將不同的標籤連接到一起進行算術運算操作。內置了時間和數學等很多函數可以使用。

一、PromQL表達式
1.1、語言數據類型

PromQL表達式語言中,一個表達式或者子表達式可以表示以下4種類型之一:

Instant vector:瞬時向量,一組time series(時間序列),每個time series包括了一個時間戳的數據點,所有time series數據點擁有相同的時間戳。

Range vector:範圍向量,一組time series包含一個時間範圍內的一組數據點。

Scalar:標量,爲一個浮點數值。

String:字符串,爲一個字符串數值。當前未使用。

1.2、Literals數據格式

1.2.1 String literals

 字符串可以用單引號(‘’)、雙引號(“”)或反引號(``)指定爲文字。

1.2.2 Float literals

 浮點類型數值的格式爲:-[.(digits)]
 如:-2.43

1.3、Time series(時間序列)選擇器

1.3.1 Instant vector selectors(即時矢量選擇器)

 瞬時向量選擇器用於選擇一組time series和每個time series對應的某一個時間戳數據點,唯一的要求是必須指定metric指標名。

例:查詢指標名http_requests_total對應的所有time series表達式:

http_requests_total
可以通過在花括號 ( {}) 中附加一個逗號分隔的標籤匹配器列表來進一步過濾這些時間序列。

例:僅選擇具有http_requests_total 度量名稱且job標籤設置爲prometheus且其 group標籤設置爲的時間序列canary:

http_requests_total{job="prometheus",group="canary"}
通過負匹配或正則表達式匹配tag選擇時間序列,支持如下匹配運算符:

= 等於

!= 不等於

=~ 選擇與提供的字符串進行正則表達式匹配的標籤

!~ 選擇與提供的字符串不匹配的標籤

1.3.2 Range vector selectors(範圍矢量選擇器)

範圍向量字面量的工作方式類似於即時向量字面量,唯一區別是選擇的時間序列是一個時間範圍內的時序數據。從語法上講,持續時間附加在[]向量選擇器末尾的方括號 ( ) 中,以指定應該爲每個結果範圍向量元素獲取多遠的時間值

例:爲所有時間序列選擇了過去 5 分鐘內記錄的所有值,這些時間序列的指標名稱http_requests_total和job標籤設置爲prometheus:

http_requests_total{job="prometheus"}[5m]
1.3.3 Offset modifier(偏移修改器)

 Offset修改器允許修改查詢中瞬時向量和範圍向量的時間偏移。

 例:返回 http_requests_total 相對於當前查詢評估時間過去 5 分鐘的值

http_requests_total offset 5m
注:offset修飾符總是需要立即跟隨選擇器

1.4、Subquery(子查詢)

 子查詢允許針對給定的範圍和分辨率運行即時查詢。子查詢的結果是一個範圍向量。

<instant_query> [ <range> : [<resolution>]] [offset <duration>]
注:<resolution>是可選的,默認爲全局評估間隔
例:回過去30分鐘CpuPercent 5m統計的rate(平均增長速率)值,精度是1分鐘。

rate(CpuPercent{}[5m])[30m:1m]
二、PromQL運算符
 PromQL支持基本的邏輯和算術運算。對於兩個瞬時向量的運算,其結果可能影響匹配行爲。

2.1、算數運算符

+(加法)

- (減法)

* (乘法)

/ (除法)

%(模數)

^(冪)

2.2、比較運算符

== (等於)

!= (不等於)

> (大於)

< (小於)

>=(大於或等於)

<=(小於或等於)

2.3、邏輯/集合運算符

 邏輯/集合二元運算符僅在即時向量之間定義:

and  過濾出兩個向量裏都有的時間序列

or   過濾出兩個向量裏所有的時間序列

unless 過濾出左邊向量裏,右邊沒有的時間序列

2.4、聚合運算符

 Prometheus 支持以下內置聚合運算符,可用於聚合單個即時向量的元素,從而生成具有聚合值的元素更少的新向量

sum   (總和)

min   (最小值)

max (最大值)

avg (平均值)

group (結果向量中的所有值都是1)

stddev (計算維度上的總體標準偏差)

stdvar (計算維度上的總體標準方差)

count (計算向量中的元素個數)

count_values(計算具有相同值的元素個數)

bottomk (樣本值的最小k個元素)

topk (按樣本值計算的最大k個元素)

quantile (在維度上計算 φ-quantile (0 ≤ φ ≤ 1))

 注:這些運算符既可以用於聚合所有標籤維度,也可以通過包含withoutorby子句來保留不同的維度;這些子句可以在表達式之前或之後使用。

2.5、運算符優先級

^

*,/,%

+,-

==,!=,>,<,>=,<=

and,unless

or

三、PromQL內置函數
 一些函數有默認參數,例如year(v=vector(time()) instant-vector). 這意味着有一個參數v是一個即時向量,如果沒有提供,它將默認爲表達式的值 vector(time())。

abs()

  abs(v instant-vector) 返回輸入向量,其中所有樣本值都轉換爲其絕對值。

absent()

  absent(v instant-vector) 如果傳遞給它的瞬時向量有任何元素,則返回一個空向量;如果傳遞給它的向量沒有元素,則返回一個值爲 1 的 1 元素向量

 通常用於設置告警,判斷給定的指標和標籤沒有數據時產生告警。

absent_over_time()

  absent_over_time(v range-vector) 如果傳遞給它的範圍向量有任何元素,則返回一個空向量;如果傳遞給它的範圍向量沒有元素,則返回一個值爲 1 的 1 元素向量。

 同absent(),常用於判斷指標與標籤組合,不存在於時間序列時報警。

ceil()

  ceil(v instant-vector) 將所有元素的樣本值四捨五入到最接近的整數。

changes()

  changes(v range-vector) 計算給出的時間範圍內,value是否發生變化,將發生變化時的條目作爲即時向量返回

clamp()

  clamp(v instant-vector, min scalar, max scalar) 設定所有元素的樣本值的上限與下限

 注:當min>max時,返回一個空向量:NaN if min or max is NaN

day_of_month()

 day_of_month(v=vector(time()) instant-vector) 以 UTC 格式返回每個給定時間的月份日期,返回值從 1 到 31。

day_of_week()

day_of_week(v=vector(time()) instant-vector) 以 UTC 格式返回每個給定時間的星期幾,返回值從 0 到 6,其中 0 表示星期日。

days_in_month()

  days_in_month(v=vector(time()) instant-vector) 以 UTC 格式返回每個給定時間該月的天數,返回值從 28 到 31。

delta()

  delta(v range-vector) 計算範圍向量中每個時間序列元素的第一個值和最後一個值之間的差,返回具有給定增量和等效標籤的即時向量。增量被外推以覆蓋範圍向量選擇器中指定的整個時間範圍,因此即使樣本值都是整數,也可以獲得非整數結果。

 例:返回現在和 2 小時前 CPU 溫度的差異:

delta(cpu_temp_celsius{host="zeus"}[2h])
deriv()

  deriv(v range-vector) 使用簡單線性迴歸的方法計算時間序列在範圍向量 中的每秒導數

 注:deriv()函數在可視化頁面上只能用於儀表盤

exp()

  exp(v instant-vector) 計算v中所有元素的指數函數

histogram_quantile() 分位直方圖

  histogram_quantile(φ scalar, b instant-vector) 從instant vector中獲取數據計算q分位(0<= q <=1)。b裏的樣本是每個桶的計數。每個樣本必須具有標籤le,表示桶的上限。直方圖指標類型會自動提供了_bucket後綴和相應tags的time series。

 使用rate()函數指定分位計算的時間窗口。

 例1:一個直方圖指標名:http_request_duration_seconds。計算其對應所有time series過去10分鐘90分位數,使用如下表達式:

histogram_quantile(0.9, rate(http_request_duration_seconds_bucket[10m]))
 例2:爲指標名http_request_duration_seconds對應的每個tags組合(每個time series)計算90分位數。爲了聚合數據,比如使用sum()進行聚合,需要通過by子句包含le標籤

histogram_quantile(0.9, sum(rate(http_request_duration_seconds_bucket[10m])) by (job, le))
hour()

  hour(v=vector(time()) instant-vector) 以 UTC 格式返回每個給定時間的一天中的小時,返回值從 0 到 23。

increase()

  increase(v range-vector) 計算範圍向量中時間序列的增量。單調性的中斷(例如由於目標重新啓動而導致的計數器重置)會自動調整。該增加被外推以覆蓋範圍向量選擇器中指定的整個時間範圍,因此即使計數器僅增加整數增量,也可以獲得非整數結果。

 例:返回範圍向量中每個時間序列在過去 5 分鐘內測量的 HTTP 請求數:

increase(http_requests_total{job="api-server"}[5m])
注:increase只能與counter類型指標(按增長率展示,即相鄰兩個時間點的差值除以時間差)一起使用。它是rate(v)乘以指定時間範圍窗口下的秒數(相當於rate()乘以秒數),更易於人類理解。在記錄規則中使用rate,以便每秒一致地跟蹤增長。
irate()

  irate(v range-vector) 計算範圍向量中時間序列的每秒瞬時增長率。這是基於最後兩個數據點。單調性的中斷(例如由於目標重新啓動而導致的計數器重置)會自動調整。

 例:返回針對範圍向量中每個時間序列的兩個最近數據點的 HTTP 請求的每秒速率,最多可追溯 5 分鐘:

irate(http_requests_total{job="api-server"}[5m])
 注:irate僅應在繪製易失性、快速移動的計數器時使用。用於rate警報和緩慢移動的計數器,因爲速率的短暫變化可以重置FOR子句,並且完全由罕見峯值組成的圖形難以閱讀。

ln()

  ln(v instant-vector) 計算v中所有元素的自然對數

log2()

  log2(v instant-vector) 計算v中所有元素的二進制對數

rate()

  rate(v range-vector) 計算範圍向量中時間序列的每秒平均增長率。單調性的中斷(例如由於目標重新啓動而導致的計數器重置)會自動調整。此外,計算推斷到時間範圍的末端,允許錯過刮擦或刮擦週期與該範圍的時間段的不完美對齊。

 例:返回在過去 5 分鐘內測量的每秒 HTTP 請求速率,範圍向量中的每個時間序列:

rate(http_requests_total{job="api-server"}[5m])
 注:rate()只能與counter類型指標一起使用。它最適合警報和緩慢移動計數器的圖形。

resets()

  resets(v range-vector) 對於每個輸入時間序列,resets(v range-vector)將提供的時間範圍內的計數器重置次數作爲即時向量返回。兩個連續樣本之間值的任何減少都被解釋爲計數器復位。

 注:resets()只能作用於counter類型指標

round()

  round(v instant-vector, to_nearest=1 scalar) 將所有元素的樣本值四捨五入爲v最接近的整數。平局通過四捨五入解決。可選to_nearest參數允許指定樣本值應該四捨五入的最接近的倍數。這個倍數也可以是分數。默認爲1。

scalar()

  scalar(v instant-vector) 給定一個單元素輸入向量,scalar(v instant-vector)以標量形式返回該單元素的樣本值。如果輸入向量沒有恰好一個元素,scalar將返回NaN

sort()

  sort(v instant-vector) 返回按樣本值升序排序的向量元素。

time()

  time() 返回自 1970 年 1 月 1 日 UTC 以來的秒數。請注意,這實際上並不返回當前時間,而是要計算表達式的時間。

timestamp()

 timestamp(v instant-vector) 返回給定向量的每個樣本的時間戳,作爲自 1970 年 1 月 1 日 UTC 以來的秒數(Prometheus 2.0+)

year()

  year(v=vector(time()) instant-vector) 以 UTC 格式返回每個給定時間的年份。
————————————————
版權聲明:本文爲CSDN博主「IT運維先森」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/guting18893110463/article/details/129656289

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章