Prometheus 操做符

操做符


二元操做符

Prometheus的查詢語言支持基本的邏輯運算和算術運算。對於兩個瞬時向量, 匹配行爲能夠被改變。app

算術二元運算符

在Prometheus系統中支持下面的二元算術操做符:less

  • + 加法
  • - 減法
  • * 乘法
  • / 除法
  • % 模
  • ^ 冪等

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

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

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

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

比較二元操做符

在Prometheus系統中,比較二元操做符有:get

  • == 等於
  • != 不等於
  • > 大於
  • < 小於
  • >= 大於等於
  • <= 小於等於

比較二元操做符被應用於scalar/scalar(標量/標量)vector/scalar(向量/標量),和vector/vector(向量/向量)。比較操做符獲得的結果是bool布爾類型值,返回1或者0值。requests

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

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

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

邏輯/集合二元操做符

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

  • and 交集
  • or 並集
  • unless 補集

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_code:http_errors:rate5m{method="get", code="500"} 24
 method_code:http_errors:rate5m{method="get", code="404"} 30
 method_code:http_errors:rate5m{method="put", code="501"} 3
 method_code:http_errors:rate5m{method="post", code="404"} 21

 method:http_requests:rate5m{method="get"} 600
 method:http_requests:rate5m{method="delete"} 34
 method:http_requests:rate5m{method="post"} 120

查詢例子:

method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m

兩個向量之間的除法操做運算的向量結果是,每個向量樣本http請求方法標籤值是500,且在過去5分鐘的運算值。若是沒有忽略code="500"的標籤,這裏不能匹配到向量樣本數據。兩個向量的請求方法是putdelete的樣本數據不會出如今結果列表中

{method="get"} 0.04 // 24 / 600 {method="post"} 0.05 // 6 / 120

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

<vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr>

<vector expr> <bin-op> ignoring(<label list>) group_right(<label list>) <vector expr>

<vector expr> <bin-op> on(<label list>) group_left(<label list>) <vector expr>

<vector expr> <bin-op> on(<label list>) group_right(<label list>) <vector expr>

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

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

查詢例子:

method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m

在這個例子中,左向量的標籤數量多於左邊向量的標籤數量,因此咱們使用group_left。右邊向量的時間序列元素匹配左邊的全部相同method標籤:

{method="get", code="500"} 0.04 // 24 /600

{method="get", code="404"} 0.05 // 30 /600

{method="post", code="500"} 0.05 // 6 /600

{method="post", code="404"} 0.175 // 21 /600

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

聚合操做符

Prometheus支持下面的內置聚合操做符。這些聚合操做符被用於聚合單個即時向量的全部時間序列列表,把聚合的結果值存入到新的向量中。

  • sum (在維度上求和)
  • max (在維度上求最大值)
  • min (在維度上求最小值)
  • avg (在維度上求平均值)
  • stddev (求標準差)
  • stdvar (求方差)
  • count (統計向量元素的個數)
  • count_values (統計相同數據值的元素數量)
  • bottomk (樣本值第k個最小值)
  • topk (樣本值第k個最大值)
  • quantile (統計分位數)

這些操做符被用於聚合全部標籤維度,或者經過without或者by子句來保留不一樣的維度。

<aggr-op>([parameter,] <vector expr>) [without | by (<label list>)] [keep_common]

parameter只能用於count_valuesquantiletopkbottomkwithout移除結果向量中的標籤集合,其餘標籤被保留輸出。by關鍵字的做用正好相反,即便它們的標籤值在向量的全部元素之間。keep_common子句容許保留額外的標籤(在元素之間相同,但不在by子句中的標籤)

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

topkbottomk與其餘輸入樣本子集聚合不一樣,返回的結果中包括原始標籤。bywithout僅僅用在輸入向量的桶中

例如: 若是度量指標名稱http_requests_total包含由groupapplicationinstance的標籤組成的時間序列數據,咱們能夠經過如下方式計算去除instance標籤的http請求總數:

sum(http_requests_total) without (instance)

若是咱們對全部應用程序的http請求總數,咱們能夠簡單地寫下:

sum(http_requests_total)

統計每一個編譯版本的二進制文件數量,咱們能夠以下寫:

count_values("version", build_version)

經過全部實例,獲取http請求第5個最大值,咱們能夠簡單地寫下:

topk(5, http_requests_total)

二元運算符優先級

在Prometheus系統中,二元運算符優先級從高到低:

  1. ^
  2. *, /, %
  3. +, -
  4. ==, !=, <=, <, >=, >
  5. and, unless
  6. or

 

摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!

相關文章
相關標籤/搜索