prometheus 之 查詢語法(操作符)

2021-09-02 00:16:06 字數 3875 閱讀 8829

二元操作符

prometheus的查詢語言支援基本的邏輯運算和算術運算。對於兩個瞬時向量, 匹配行為可以被改變。

算術二元運算子

在prometheus系統中支援下面的二元算術操作符:

二元運算操作符支援scalar/scalar(標量/標量)、vector/scalar(向量/標量)、和vector/vector(向量/向量)之間的操作。

在兩個標量之間進行操作符運算,得到的結果也是標量

在向量和標量之間,這個操作符會作用於這個向量的每個樣本值上。例如:如果乙個時間序列瞬時向量除以2,操作結果也是乙個新的瞬時向量,且度量指標名稱不變, 它是原度量指標瞬時向量的每個樣本值除以2.

在兩個向量之間,乙個二元算術操作符作用在左邊瞬時向量的每個樣本值,且該樣本值與操作符右邊能匹配上的樣本值計算,向量匹配。結果寫入到乙個沒有度量指標名稱的瞬時向量。

比較二元操作符

在prometheus系統中,比較二元操作符有:

比較二元操作符被應用於scalar/scalar(標量/標量)、vector/scalar(向量/標量),和vector/vector(向量/向量)。比較操作符得到的結果是bool布林型別值,返回1或者0值。

在兩個標量之間的比較運算,bool結果寫入到另乙個結果標量中。

瞬時向量和標量之間的比較運算,這個操作符會應用到某個當前時刻的每個時間序列資料上,如果乙個時間序列資料值與這個標量比較結果是false,則這個時間序列資料被丟棄掉,如果是true, 則這個時間序列資料被保留在結果中。

在兩個瞬時向量之間的比較運算,左邊度量指標資料中的每個時間序列資料,與右邊度量指標中的每個時間序列資料匹配,沒有匹配上的,或者計算結果為false的,都被丟棄,不在結果中顯示。否則將保留左邊的度量指標和標籤的樣本資料寫入瞬時向量。

邏輯/集合二元操作符

邏輯/集合二元操作符只能作用在即時向量, 包括:

vector1 and vector2 的邏輯/集合二元操作符,規則:vector1瞬時向量中的每個樣本資料與vector2向量中的所有樣本資料進行標籤匹配,不匹配的,全部丟棄。運算結果是保留左邊的度量指標名稱和值。

vector1 or vector2的邏輯/集合二元操作符,規則: 保留vector1向量中的每乙個元素,對於vector2向量元素,則不匹配vector1向量的任何元素,則追加到結果元素中。

vector1 unless vector2的邏輯/集合二元操作符,又稱差積。規則:包含在vector1中的元素,但是該元素不在vector2向量所有元素列表中,則寫入到結果集中。

向量匹配

向量之間的匹配是指右邊向量中的每乙個元素,在左邊向量中也存在。這裡有兩種基本匹配行為特徵:

一對一,找到這個操作符的兩邊向量元素的相同元素。預設情況下,操作符的格式是vector1 [operate] vector2。如果它們有相同的標籤和值,則表示相匹配。ingoring關鍵字是指,向量匹配時,可以忽略指定標籤。on關鍵字是指,在指定標籤上進行匹配。格式如下所示:

[vector expr] [bin-op] ignoring([label list]) [vector expr]

[vector expr] [bin-op] on([lable list]) [vector expr]

例如樣本資料:

method:http_requests:rate5m 120查詢例子:

method_code:http_errors:rate5m / ignoring(code) method:http_requests:rate5m
兩個向量之間的除法操作運算的向量結果是,每乙個向量樣本http請求方法標籤值是500,且在過去5分鐘的運算值。如果沒有忽略code="500"的標籤,這裡不能匹配到向量樣本資料。兩個向量的請求方法是put和delete的樣本資料不會出現在結果列表中

0.04 // 24 / 600

0.05 // 6 / 120

多對一和一對多的匹配,是指向量元素中的乙個樣本資料匹配標籤到了多個樣本資料標籤。這裡必須直接指定兩個修飾符group_left或者group_right, 左或者右決定了哪邊的向量具有較高的子集。

ignoring(

) group_left(

) ignoring(

) group_right(

) on(

) group_left(

) on(

) group_right(

)

這個group帶標籤的修飾符標籤列表包含了「一對多」中的「一」一側的額外標籤。對於on標籤只能是這些列表中的乙個。結果向量中的每乙個時間序列資料都是唯一的。

group修飾符只能被用在比較操作符和算術運算子。

查詢例子:

method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
在這個例子中,左向量的標籤數量多於左邊向量的標籤數量,所以我們使用group_left。右邊向量的時間序列元素匹配左邊的所有相同method標籤:

0.04 // 24 /600

0.05 // 30 /600

0.05 // 6 /600

0.175 // 21 /600

多對一和一對多匹配應該更多地被謹慎使用。經常使用ignoring()輸出想要的結果。

聚合操作符

prometheus支援下面的內建聚合操作符。這些聚合操作符被用於聚合單個即時向量的所有時間序列列表,把聚合的結果值存入到新的向量中。

([parameter,]

)[without | by (

)][keep_common]

parameter只能用於count_values, quantile, topk和bottomk。without移除結果向量中的標籤集合,其他標籤被保留輸出。by關鍵字的作用正好相反,即使它們的標籤值在向量的所有元素之間。keep_common子句允許保留額外的標籤(在元素之間相同,但不在by子句中的標籤)

count_values對每個唯一的樣本值輸出乙個時間序列。每個時間序列都附加乙個標籤。這個標籤的名字有聚合引數指定,同時這個標籤值是唯一的樣本值。每乙個時間序列值是結果樣本值出現的次數。

topk和bottomk與其他輸入樣本子集聚合不同,返回的結果中包括原始標籤。by和without僅僅用在輸入向量的桶中

sum(http_requests_total) without (instance)
如果我們對所有應用程式的http請求總數,我們可以簡單地寫下:

sum(http_requests_total)
統計每個編譯版本的二進位制檔案數量,我們可以如下寫:

count_values(

"version", build_version)

通過所有例項,獲取http請求第5個最大值,我們可以簡單地寫下:

二元運算子優先順序

在prometheus系統中,二元運算子優先順序從高到低:

Prometheus 查詢 常用函式

原文 1 rate函式是專門搭配 counter型別資料使用的函式。它的功能是按照設定乙個時間段,取 counter在該時間段中的平均每秒的增量 rate v range vector 計算範圍向量中時間序列的每秒平均增加速率。單調性中斷 例如由於目標重啟而導致的計數器重置 會自動調整。同樣,計算會...

非原創 Prometheus 查詢語言

promql prometheus query language 是 prometheus 自己開發的表示式語言,語言表現力很豐富,內建函式也很多。使用它可以對時序資料進行篩選和聚合。1.1 資料型別 promql 表示式計算出來的值有以下幾種型別 1.2 時序選擇器 1.2.1 瞬時向量選擇器 瞬...

Prometheus之配置詳解

prometheus的配置檔案prometheus.yml,它主要分以下幾個配置塊 全域性配置 global 告警配置 alerting 規則檔案配置 rule files 拉取配置 scrape configs 遠端讀寫配置 remote read remote write 全域性配置 globa...