Basics
即時矢量選擇器
=:匹配與標簽相等的內容
!=:不匹配與標簽相等的內容
=~: 根據正則表達式匹配與標簽符合的內容
!~:根據正則表達式不匹配與標簽符合的內容
示例:
http_requests_total{environment=~"staging|testing|development",method!="GET"} #這將匹配method不等於GET,environment匹配到staging,testing或development的http_requests_total請求內容。
向量選擇器必須指定一個名稱或至少一個與空字符串不匹配的標簽匹配器。以下表達式是非法的
{job=~"."} # Bad!
相反,這些表達式是有效的,因為它們都有一個與空標簽值不匹配的選擇器。
{job=~".+"} # Good!
{job=~".",method="get"} # Good!
范圍矢量選擇器
持續時間僅限於數字,接下來是以下單位之一:
s - seconds
m - minutes
h - hours
d - days
w - weeks
y - years
在此示例中,我們選擇在過去5分鍾內為度量標准名稱為http_requests_total且標簽設置為job=prometheus的所有時間序列記錄的所有值:
http_requests_total{job="prometheus"}[5m]
偏移量修改器
偏移修改器允許更改查詢中各個即時和范圍向量的時間偏移。
例如,以下表達式相對於當前查詢5分鍾前的http_requests_total值:
http_requests_total offset 5m
注意,偏移修改器需要立即跟隨選擇器,即以下內容是正確的:
sum(http_requests_total{method="GET"} offset 5m) // GOOD.
以下內容是不正確的:
sum(http_requests_total{method="GET"}) offset 5m // INVALID.
同樣適用於范圍向量。這將返回http_requests_total一周前的5分鍾增長率:
rate(http_requests_total[5m] offset 1w)
OPERATORS
二元運算符
算術二元運算符
Prometheus中存在以下二進制算術運算符:
- (addition)
- (subtraction)
- (multiplication)
/ (division)
% (modulo)
^ (power/exponentiation)
比較二元運算符
== (equal)
!= (not-equal)
(greater-than)
< (less-than)
= (greater-or-equal)
<= (less-or-equal)
邏輯/集二進制運算符
and (intersection)
or (union)
unless (complement)
一對一矢量匹配
一對一從操作的每一側找到唯一的條目對。在默認情況下,這是格式為vector1
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="500"} 6
method_code:http_errors:rate5m{method="post", code="404"} 21
method:http_requests:rate5m{method="get"} 600
method:http_requests:rate5m{method="del"} 34
method:http_requests:rate5m{method="post"} 120
Example query:
method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m
這將返回一個結果向量,其中包含每個方法的狀態代碼為500的HTTP請求部分,在過去5分鍾內測量。在不忽略(代碼)的情況下,由於度量標准不共享同一組標簽,因此不會匹配。方法put和del的條目沒有匹配,並且不會顯示在結果中:
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120
多對一和一對多矢量匹配
多對一和一對多匹配指的是"一"側的每個向量元素可以與"多"側的多個元素匹配的情況。必須使用group_left或group_right修飾符明確請求,其中left/right確定哪個向量具有更高的基數。
Example query:
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
在這種情況下,左向量每個方法標簽值包含多個條目。因此,我們使用group_left表明這一點。右側的元素現在與多個元素匹配,左側具有相同的方法標簽:
{method="get", code="500"} 0.04 // 24 / 600
{method="get", code="404"} 0.05 // 30 / 600
{method="post", code="500"} 0.05 // 6 / 120
{method="post", code="404"} 0.175 // 21 / 120
多對一和一對多匹配是高級用例,應該仔細考慮。通常正確使用忽略(
聚合運算符
Prometheus支持以下內置聚合運算符,這些運算符可用於聚合單個即時向量的元素,從而生成具有聚合值的較少元素的新向量:
sum (calculate sum over dimensions) #范圍內求和
min (select minimum over dimensions) #范圍內求最小值
max (select maximum over dimensions) #范圍內求最大值
avg (calculate the average over dimensions) #范圍內求最大值
stddev (calculate population standard deviation over dimensions) #計算標准偏差
stdvar (calculate population standard variance over dimensions) #計算標准方差
count (count number of elements in the vector) #計算向量中的元素數量
count_values (count number of elements with the same value) #計算向量中相同元素的數量
bottomk (smallest k elements by sample value)#樣本中最小的元素值
topk (largest k elements by sample value)#樣本中最大的元素值
quantile (calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions) #計算 0-1 之間的百分比數量的樣本的最大值
這些運算符可以用於聚合所有標簽維度,也可以通過包含without或by子句來保留不同的維度。
parameter僅用於count_values,quantile,topk和bottomk。without從結果向量中刪除列出的標簽,而所有其他標簽都保留輸出。 by相反並刪除未在by子句中列出的標簽,即使它們的標簽值在向量的所有元素之間是相同的
例:如果http_requests_total具有按application,instance和group標簽列出的時間序列,我們可以通過以下方式計算每個應用程序和組在所有實例上看到的HTTP請求總數:
sum(http_requests_total) without (instance)
等於:
sum(http_requests_total) by (application, group)
如果我們只對我們在所有應用程序中看到的HTTP請求總數感興趣,我們可以簡單地寫:
sum(http_requests_total)
要計算運行每個構建版本的二進制文件的數量,我們可以編寫:
count_values("version", build_version)
要在所有實例中獲取5個最大的HTTP請求計數,我們可以編寫:
topk(5, http_requests_total)
FUNCTIONS
abs(v instant-vector) #返回其絕對值
absent() # 如果傳遞給它的向量具有該元素,則返回空向量;如果傳遞給它的向量沒有元素,則返回傳入的元素。
Example query:
nginx_server_connections
nginx_server_connections{endpoint="metrics",instance="192.168.43.5:9913",job="nginx-vts",namespace="dev",pod="nginx-vts-9fcd4d45b-sdqds",service="nginx-vts",status="accepted"} 89061
nginx_server_connections{endpoint="metrics",instance="192.168.43.5:9913",job="nginx-vts",namespace="dev",pod="nginx-vts-9fcd4d45b-sdqds",service="nginx-vts",status="handled"} 2
absent(nginx_server_connections{job="nginx-vts"}) => {}
absent(nginx_server_connections{job="nginx-vts123"}) => {job="nginx-vts123"}
ceil(v instant-vector) #返回向量中所有樣本值(向上取整數)
round(v instant-vector, to_nearest=1 scalar) #返回向量中所有樣本值的最接近的整數,to_nearest是可選的,默認為1,表示樣本返回的是最接近1的整數倍的值, 可以指定任意的值(也可以是小數),表示樣本返回的是最接近它的整數倍的值
floor(v instant-vector) #返回向量中所有樣本值(向下取整數)
changes(v range-vector) #對於每個輸入時間序列,返回其在時間范圍內(v range-vector)更改的次數
clamp_max(v instant-vector, max scalar) #限制v中所有元素的樣本值,使其上限為max
clamp_min(v instant-vector, min scalar) #限制v中所有元素的樣本值,使其下限為min
year(v=vector(time()) instant-vector) #返回UTC中給定時間的年份
day_of_month(v=vector(time()) instant-vector) #返回UTC中給定時間的月中的某一天,返回值為1到31
day_of_week(v=vector(time()) instant-vector) #返回UTC中給定時間的當周中的某一天,返回值為0到6
days_in_month(v=vector(time()) instant-vector) #返回UTC中給定時間的一個月的天數,返回值28到31
hour(v=vector(time()) instant-vector) #返回UTC中給定時間的當天中的某一小時,返回值為0到23
minute(v=vector(time()) instant-vector) #返回UTC中給定時間的小時中的某分鍾,返回值為0到59
delta(v range-vector) #返回一個即時向量,它計算每個time series中的第一個值和最后一個值的差別
deriv(v range-vector) #計算每個time series的每秒的導數(derivative)
exp(v instant-vector) #計算v中所有元素的指數函數
histogram_quantile(φ float, b instant-vector) #從buckets類型的向量中計算φ(0 ≤ φ ≤ 1)百分比的樣本的最大值
holt_winters(v range-vector, sf scalar, tf scalar) #根據范圍向量中的范圍產生一個平滑的值
idelta(v range-vector) #計算最新的2個樣本值之間的差別
increase(v range-vector) #計算指定范圍內的增長值, 它會在單調性發生變化時(如由於目標重啟引起的計數器復位)自動中斷
irate(v range-vector) #計算每秒的平均增長值, 基於的是最新的2個數據點
rate(v range-vector) #計算每秒的平均增長值
resets(v range-vector) #對於每個 time series , 它都返回一個 counter resets的次數
sort(v instant-vector) #對向量按元素的值進行升序排序
sort_desc(v instant-vector) #對向量按元素的值進行降序排序
sqrt(v instant-vector) #返回v中所有向量的平方根
time() #返回從1970-1-1起至今的秒數,UTC時間
參考鏈接:https://prometheus.io/docs/prometheus/latest/querying/basics/