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"
的標籤,這裏不能匹配到向量樣本數據。兩個向量的請求方法是put
和delete
的樣本數據不會出如今結果列表中
{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_values
, quantile
, topk
和bottomk
。without
移除結果向量中的標籤集合,其餘標籤被保留輸出。by
關鍵字的做用正好相反,即便它們的標籤值在向量的全部元素之間。keep_common
子句容許保留額外的標籤(在元素之間相同,但不在by子句中的標籤)
count_values
對每一個惟一的樣本值輸出一個時間序列。每一個時間序列都附加一個標籤。這個標籤的名字有聚合參數指定,同時這個標籤值是惟一的樣本值。每個時間序列值是結果樣本值出現的次數。
topk
和bottomk
與其餘輸入樣本子集聚合不一樣,返回的結果中包括原始標籤。by
和without
僅僅用在輸入向量的桶中
例如: 若是度量指標名稱http_requests_total
包含由group
, application
, instance
的標籤組成的時間序列數據,咱們能夠經過如下方式計算去除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系統中,二元運算符優先級從高到低:
摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!摘取來自Github 權侵刪!