Prometheus學習系列(七)之Prometheus PromQL說明


前言

本文來自Prometheus官網手冊123 和 Prometheus簡介123

PromQL操作符

一、二元操作符

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

1.1 算術二元運算符

在Prometheus支持下面的二元算術操作符:

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

二元運算操作符定義在scalar/scalar(標量/標量)vector/scalar(向量/標量)、和vector/vector(向量/向量)之間。

  • 在兩個標量之間:評估另一個標量,這是運算符應用於兩個標量操作數的結果。
  • 在瞬時向量和標量之間:將運算符應用於向量中的每個數據樣本的值。 如果時間序列即時向量乘以2,則結果是另一個向量,其中原始向量的每個樣本值乘以2。
  • 在兩個瞬時向量之間:應用於左側向量中的每個條目及其右側向量中的匹配元素。 結果將傳播到結果向量中。 右側向量中(沒有匹配條目)不是結果的一部分。

1.2 比較二元操作符

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

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

比較二元操作符定義在scalar/scalar(標量/標量)vector/scalar(向量/標量),和vector/vector(向量/向量)。默認情況下過濾。 可以通過在運算符之后提供bool來修改它們的行為,這將為值返回01而不是過濾。

  • 在兩個標量之間:必須提供bool修飾符,並且這些運算符會產生另一個標量,即0(假)或1(真),具體取決於比較結果。
  • 在瞬時向量和標量之間:將這些運算符應用於向量中的每個數據樣本的值,並且從結果向量中刪除比較結果為假的向量元素。 如果提供了bool修飾符,則將被刪除的向量元素的值為0,而將保留的向量元素的值為1。
  • 在兩個瞬時向量之間:這些運算符默認表現為過濾器,應用於匹配條目。 表達式不正確或在表達式的另一側找不到匹配項的向量元素將從結果中刪除,而其他元素將傳播到具有其原始(左側)度量標准名稱的結果向量中 標簽值。 如果提供了bool修飾符,則已經刪除的向量元素的值為0,而保留的向量元素的值為1,左側標簽值為1

 如:

3 > 2
# 報錯 "comparisons between scalars must use BOOL modifier"
 
3 > bool 2 
# 返回 scalar 1
 
1 > bool 2 

1.3 邏輯/集合二元操作符

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

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

vector1 and vector2: 得到一個由vector1元素組成的向量,其中vector2中的元素具有完全匹配的標簽集,其他元素被刪除。

vector1 or vector2:得到包含vector1的所有原始元素(標簽集+值)的向量以及vector2vector1中沒有匹配標簽集的所有元素。

vector1 unless vector2:得到一個由vector1元素組成的向量,其中vector2中沒有元素,具有完全匹配的標簽集。 兩個向量中的所有匹配元素都被刪除。

二、向量匹配

向量之間的操作嘗試在左側的每個條目的右側向量中找到匹配元素。 匹配行為有兩種基本類型:一對一和多對一/一對多。

一對一從操作的每一側找到一對唯一條目。 在默認情況下,這是格式為vector1<operator>vector2之后的操作。 如果兩個條目具有完全相同的標簽集和相應的值,則它們匹配。 忽略關鍵字允許在匹配時忽略某些標簽,而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
這將返回一個結果向量,其中包含每個方法的狀態代碼為500的HTTP請求部分,在過去的5分鍾內進行測量。 沒有ignoring(code)就沒有匹配,因為度量標准不共享同一組標簽。 方法putdel的條目沒有匹配,並且不會顯示在結果中:
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120

2.2 多對一和一對多向量匹配

多對一和一對多匹配指的是“一”側的每個向量元素可以與“多”側的多個元素匹配的情況。 必須使用group_leftgroup_right修飾符明確請求,其中left/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>

分組修飾符提供的標簽列表包含來自“一”側的其他標簽,以包含在結果度量標准中。 對於標簽,只能出現在其中一個列表中。 每次結果向量的序列必須是唯一可識別的。分組修飾符只能用於比較和算術。 默認情況下,操作as和除非和或操作與右向量中的所有可能條目匹配。示例查詢:

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

在這種情況下,左向量每個method標簽值包含多個條目。 因此,我們使用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 (統計分位數)

這些運算符可以用於聚合所有標簽維度,也可以通過包含withoutby子句來保留不同的維度。

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

parameter僅用於count_valuesquantiletopkbottomk。不從結果向量中刪除列出的標簽,而所有其他標簽都保留輸出。 by相反並刪除未在by子句中列出的標簽,即使它們的標簽值在向量的所有元素之間是相同的。

count_values輸出每個唯一樣本值的一個時間序列。每個序列都有一個額外的標簽。該標簽的名稱由聚合參數給出,標簽值是唯一的樣本值。每個時間序列的值是樣本值存在的次數。

topkbottomk與其他聚合器的不同之處在於,輸入樣本的子集(包括原始標簽)在結果向量中返回。 bywithout僅用於存儲輸入向量。

例:如果度量標准http_requests_total具有按應用程序,實例和組標簽扇出的時間序列,我們可以通過以下方式計算每個應用程序和組在所有實例上看到的HTTP請求總數:

sum(http_requests_total) without (instance)

等價於:

sum(http_requests_total)

要計算運行每個構建版本的二進制文件的數量,我們可以編寫:

count_values("version", build_version)

要在所有實例中獲取5個最大的HTTP請求計數,我們可以編寫:

topk(5, http_requests_total)

四、二元運算符優先級

以下列表顯示了Prometheus中二進制運算符的優先級,從最高到最低。

  • ^
  • *, /, %
  • +, -
  • ==, !=, <=, <, >=, >
  • and, unless
  • or

具有相同優先級的運算符是左關聯的。 例如,2 * 3%2相當於(2 * 3)%2。但是^是右關聯的,因此2 ^ 3 ^ 2相當於2 ^(3 ^ 2)

PromQL函數

一些函數有默認的參數,例如:year(v=vector(time()) instant-vector)。意思是有一個參數v是一個瞬時向量,如果沒有提供,它將默認為表達式vector(time())的值。可參考: Prometheus監控學習筆記之PromQL 內置函數

一、abs()

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

二、absent()

absent(v instant-vector)如果傳遞給它的向量具有任何元素,則返回空向量;如果傳遞給它的向量沒有元素,則返回為1的值。這對於在給定度量標准名稱和標簽組合不存在時間序列時發出警報非常有用。

absent(nonexistent{job="myjob"})  
# => {job="myjob"}
absent(nonexistent{job="myjob", instance=~".*"}) 
# => {job="myjob"}
absent(sum(nonexistent{job="myjob"})) 
# => {}

在第二個例子中,absent()試圖從輸入向量中導出1元素輸出向量的標簽。

三、ceil()

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

node_load5{instance="192.168.1.75:9100"} # 結果為 2.79
ceil(node_load5{instance="192.168.1.75:9100"}) # 結果為 3

四、changes()

輸入一個區間向量, 返回這個區間向量內每個樣本數據值變化的次數(瞬時向量)。如:

如果樣本數據值沒有發生變化,則返回結果為 1
changes(node_load5{instance="192.168.1.75:9100"}[1m]) # 結果為 1 

五、clamp_max()

clamp_max(v instant-vector, max scalar) 函數,輸入一個瞬時向量和最大值,樣本數據值若大於 max,則改為 max,否則不變。如:

node_load5{instance="192.168.1.75:9100"} # 結果為 2.79
clamp_max(node_load5{instance="192.168.1.75:9100"}, 2) # 結果為 2

六、clamp_min()

clamp_min(v instant-vector, min scalar) 函數,輸入一個瞬時向量和最小值,樣本數據值若小於 min,則改為 min,否則不變。如: 

node_load5{instance="192.168.1.75:9100"} # 結果為 2.79
clamp_min(node_load5{instance="192.168.1.75:9100"}, 3) # 結果為 3

 七、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) 的參數是一個區間向量,返回一個瞬時向量。它計算一個區間向量 v 的第一個元素和最后一個元素之間的差值。由於這個值被外推到指定的整個時間范圍,所以即使樣本值都是整數,你仍然可能會得到一個非整數值。 如以下示例表達式返回現在和2小時之前CPU溫度的差異:

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

這個函數一般只用在 Gauge 類型的時間序列上。

十一、deriv()

deriv(v range-vector) 的參數是一個區間向量,返回一個瞬時向量。它使用簡單的線性回歸計算區間向量 v 中各個時間序列的導數。這個函數一般只用在 Gauge 類型的時間序列上。

十二、exp()

exp(v instant-vector) 函數,輸入一個瞬時向量,返回各個樣本值的 e 的指數值,即 e 的 N 次方。當 N 的值足夠大時會返回 +Inf。特殊情況為:

  • Exp(+inf) = +Inf
  • Exp(NaN) = NaN

十三、floor()

floor(v instant-vector)函數與 ceil() 函數相反,將 v 中所有元素的樣本值向下四舍五入到最接近的整數。

十四、histogram_quantile()

histogram_quatile(φ float, b instant-vector) 計算b向量的φ-直方圖 (0 ≤ φ ≤ 1) 。(有關φ-分位數的詳細解釋和直方圖度量類型的使用,請參見直方圖和摘要。)b中的樣本是每個桶中的觀察計數。 每個樣本必須具有標簽le,其中標簽值表示桶的包含上限。 (沒有這種標簽的樣本會被忽略。)直方圖度量標准類型自動提供帶有_bucket后綴和相應標簽的時間序列。使用rate()函數指定分位數計算的時間窗口。

示例:直方圖度量標准稱為http_request_duration_seconds。 要計算過去10m內請求持續時間的第90個百分位數,請使用以下表達式:

histogram_quantile(0.9, rate(http_request_duration_seconds_bucket[10m]))
http_request_duration_seconds中為每個標簽組合計算分位數。 要聚合,請在rate()函數周圍使用sum()聚合器。 由於histogram_quantile()需要le標簽,因此必須將其包含在by子句中。 以下表達式按作業聚合第90個百分點:
histogram_quantile(0.9, sum(rate(http_request_duration_seconds_bucket[10m])) by (job, le))

要聚合所有內容,請僅指定le標簽:

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

histogram_quantile()函數通過假設桶內的線性分布來插值分位數值。 最高桶必須具有+Inf的上限。 (否則,返回NaN。)如果分位數位於最高桶中,則返回第二個最高桶的上限。 如果該桶的上限大於0,則假設最低桶的下限為0.在這種情況下,在該桶內應用通常的線性插值。 否則,對於位於最低桶中的分位數,返回最低桶的上限。

如果b包含少於兩個桶,則返回NaN。 對於φ<0,返回-Inf。 對於φ> 1,返回+Inf

十五、holt_winters()

holt_winters(v range-vector, sf scalar, tf scalar) 函數基於區間向量 v,生成時間序列數據平滑值。平滑因子 sf 越低, 對舊數據的重視程度越高。趨勢因子 tf 越高,對數據的趨勢的考慮就越多。其中,0< sf, tf <=1僅適用於 Gauge 類型的時間序列。

十六、hour()

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

十七、idelta()

idelta(v range-vector) 的參數是一個區間向量, 返回一個瞬時向量。它計算最新的 2 個樣本值之間的差值。這個函數一般只用在 Gauge 類型的時間序列上。

十八、increase()

increase(v range-vector) 函數獲取區間向量中的第一個和最后一個樣本並返回其增長量, 它會在單調性發生變化時(如由於采樣目標重啟引起的計數器復位)自動中斷。由於這個值被外推到指定的整個時間范圍,所以即使樣本值都是整數,你仍然可能會得到一個非整數值。如以下表達式返回區間向量中每個時間序列過去 5 分鍾內 HTTP 請求數的增長數

increase(http_requests_total{job="api-server"}[5m])

increase 的返回值類型只能是計數器類型,主要作用是增加圖表和數據的可讀性。使用 rate 函數記錄規則的使用率,以便持續跟蹤數據樣本值的變化。

十九、irate

irate(v range-vector) 函數用於計算區間向量的增長率,但是其反應出的是瞬時增長率。irate 函數是通過區間向量中最后兩個樣本數據來計算區間向量的增長速率,它會在單調性發生變化時(如由於采樣目標重啟引起的計數器復位)自動中斷。這種方式可以避免在時間窗口范圍內的“長尾問題”,並且體現出更好的靈敏度,通過irate函數繪制的圖標能夠更好的反應樣本數據的瞬時變化狀態。如,以下表達式返回區間向量中每個時間序列過去 5 分鍾內最后兩個樣本數據的 HTTP 請求數的增長率:

irate(http_requests_total{job="api-server"}[5m])

irate 只能用於繪制快速變化的計數器,在長期趨勢分析或者告警中更推薦使用 rate 函數。因為使用 irate 函數時,速率的簡短變化會重置 FOR 語句,形成的圖形有很多波峰,難以閱讀。

注意,當將irate()與聚合運算符(例如sum())或隨時間聚合的函數(任何以_over_time結尾的函數)組合時,請始終首先采用irate(),然后進行聚合。 否則,當目標重新啟動時,irate()無法檢測計數器重置。

二十、label_join()

函數可以將時間序列 v 中多個標簽 src_label 的值,通過 separator 作為連接符寫入到一個新的標簽 dst_label 中。可以有多個 src_label 標簽。如,以下表達式返回的時間序列多了一個 foo 標簽,標簽值為 etcd,etcd-k8s

up{endpoint="api",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"}
=> up{endpoint="api",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"} 1
 
label_join(up{endpoint="api",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"}, "foo", ",", "job", "service")
=> up{endpoint="api",foo="etcd,etcd-k8s",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"} 1
label_replace()

二十一、label_replace()

為了能夠讓客戶端的圖標更具有可讀性,可以通過 label_replace 函數為時間序列添加額外的標簽。label_replace 的具體參數如下:

label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)

該函數會依次對 v 中的每一條時間序列進行處理,通過 regex 匹配 src_label 的值,並將匹配部分 relacement 寫入到 dst_label 標簽中。如下所示:

label_replace(up, "host", "$1", "instance", "(.*):.*")

函數處理后,時間序列將包含一個 host 標簽,host 標簽的值為 Exporter 實例的 IP 地址:

up{host="localhost",instance="localhost:8080",job="cadvisor"} 1
up{host="localhost",instance="localhost:9090",job="prometheus"} 1 up{host="localhost",instance="localhost:9100",job="node"} 1

二十二、ln()

計算瞬時向量 v 中所有樣本數據的自然對數。特殊情況:

ln(+Inf) = +Inf
ln(0) = -Inf
ln(x<0) = NaN
ln(NaN) = NaN

二十三、log2()

log2(v instant-vector)計算v中所有元素的二進制對數。特殊情況等同於ln中的特殊情況。

二十四、log10()

log10(v instant-vector)計算v中所有元素的10進制對數。特殊情況等同於ln中的特殊情況。

二十五、minute()

minute(v=vector(time()) instant-vector)以UTC為單位返回每個給定時間的分鍾。 返回值為0到59。

二十六、month()

month(v=vector(time()) instant-vector)返回UTC中每個給定時間的一年中的月份。 返回值為1到12,其中1表示1月等。

二十七、predict_linear()

predict_linear(v range-vector, t scalar) 函數可以預測時間序列 v 在 t 秒后的值。它基於簡單線性回歸的方式,對時間窗口內的樣本數據進行統計,從而可以對時間序列的變化趨勢做出預測。該函數的返回結果不帶有度量指標,只有標簽列表。如,基於 2 小時的樣本數據,來預測主機可用磁盤空間的是否在 4 個小時候被占滿,可以使用如下表達式:

predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0

通過下面的例子來觀察返回值:

predict_linear(http_requests_total{code="200",instance="120.77.65.193:9090",job="prometheus",method="get"}[5m], 5)
結果:
{code="200",handler="query_range",instance="120.77.65.193:9090",job="prometheus",method="get"} 1
{code="200",handler="prometheus",instance="120.77.65.193:9090",job="prometheus",method="get"} 4283.449995397104
{code="200",handler="static",instance="120.77.65.193:9090",job="prometheus",method="get"} 22.99999999999999
...

二十八、rate()

rate(v range-vector) 函數可以直接計算區間向量 v 在時間窗口內平均增長速率,它會在單調性發生變化時(如由於采樣目標重啟引起的計數器復位)自動中斷。該函數的返回結果不帶有度量指標,只有標簽列表。

例如,以下表達式返回區間向量中每個時間序列過去 5 分鍾內 HTTP 請求數的每秒增長率:

rate(http_requests_total{job="api-server"}[5m])

rate() 函數返回值類型只能用計數器,在長期趨勢分析或者告警中推薦使用這個函數。

注意,當將 rate() 函數與聚合運算符(例如 sum())或隨時間聚合的函數(任何以 _over_time 結尾的函數)一起使用時,必須先執行 rate 函數,然后再進行聚合操作,否則當采樣目標重新啟動時 rate() 無法檢測到計數器是否被重置。

二十九、resets()

resets(v range-vector) 的參數是一個區間向量。對於每個時間序列,它都返回一個計數器重置的次數。兩個連續樣本之間的值的減少被認為是一次計數器重置。

這個函數一般只用在計數器類型的時間序列上。

三十、round()

round(v instant-vector, to_nearest=1 scalar) 函數與 ceil 和 floor 函數類似,返回向量中所有樣本值的最接近的整數。to_nearest 參數是可選的,默認為 1,表示樣本返回的是最接近 1 的整數倍的值。你也可以將該參數指定為任意值(也可以是小數),表示樣本返回的是最接近它的整數倍的值。

三十一、scalar()

scalar(v instant-vector) 函數的參數是一個單元素的瞬時向量,它返回其唯一的時間序列的值作為一個標量。如果度量指標的樣本數量大於 1 或者等於 0, 則返回 NaN

三十二、sort()

sort(v instant-vector) 函數對向量按元素的值進行升序排序,返回結果:key: value = 度量指標:樣本值[升序排列]。

三十三、sort_desc()

sort(v instant-vector) 函數對向量按元素的值進行降序排序,返回結果:key: value = 度量指標:樣本值[降序排列]。

三十四、sqrt()

sqrt(v instant-vector) 函數計算向量 v 中所有元素的平方根。

三十五、time()

time() 函數返回從 1970-01-01 到現在的秒數。注意:它不是直接返回當前時間,而是時間戳三十六、timestamp()

三十七、vector()

vector(s scalar) 函數將標量 s 作為沒有標簽的向量返回,即返回結果為:key: value= {}, s。

三十八、year()

year(v=vector(time()) instant-vector)以UTC格式返回每個給定時間的年份。

三十九、<aggregation>_over_time()

year(v=vector(time()) instant-vector) 函數返回被給定 UTC 時間的當前年份。

<aggregation>_over_time()

下面的函數列表允許傳入一個區間向量,它們會聚合每個時間序列的范圍,並返回一個瞬時向量:

  • avg_over_time(range-vector) : 區間向量內每個度量指標的平均值。

  • min_over_time(range-vector) : 區間向量內每個度量指標的最小值。

  • max_over_time(range-vector) : 區間向量內每個度量指標的最大值。

  • sum_over_time(range-vector) : 區間向量內每個度量指標的求和。

  • count_over_time(range-vector) : 區間向量內每個度量指標的樣本數據個數。

  • quantile_over_time(scalar, range-vector) : 區間向量內每個度量指標的樣本數據值分位數,φ-quantile (0 ≤ φ ≤ 1)。

  • stddev_over_time(range-vector) : 區間向量內每個度量指標的總體標准差。

  • stdvar_over_time(range-vector) : 區間向量內每個度量指標的總體標准方差。

請注意,即使值在整個時間間隔內的間隔不均勻,指定時間間隔內的所有值在聚合中都具有相同的權重。注意:即使區間向量內的值分布不均勻,它們在聚合時的權重也是相同的。

PromQL例子

一、簡單的時間序列選擇

使用度量標准http_requests_total返回所有時間序列: 

http_requests_total

使用度量標准http_requests_total以及給定的jobhandler標簽返回所有時間系列:

http_requests_total{job="apiserver", handler="/api/comments"}

返回相同向量的整個時間范圍(在本例中為5分鍾),使其成為范圍向量:

http_requests_total{job="apiserver", handler="/api/comments"}[5m]

請注意,導致范圍向量的表達式不能直接繪制,而是在表達式瀏覽器的表格("Console")視圖中查看。

使用正則表達式,您只能為名稱與特定模式匹配的作業選擇時間序列,在本例中為所有以server結尾的作業。 請注意,這會進行子字符串匹配,而不是完整的字符串匹配:

http_requests_total{job=~"server$"}

要選擇除4xx之外的所有HTTP狀態代碼,您可以運行:

http_requests_total{status!~"^4..$"}

二、子查詢

此查詢返回過去30分鍾的5分鍾http_requests_total指標率,分辨率為1分鍾:
rate(http_requests_total[5m])[30m:1m]

這是嵌套子查詢的示例。 deri函數的子查詢使用默認分辨率。 請注意,不必要地使用子查詢是不明智的。

max_over_time(deriv(rate(distance_covered_total[5s])[30s:5s])[10m:])

三、使用函數,操作符等

使用http_requests_total指標名稱返回所有時間序列的每秒速率,在過去5分鍾內的增長率:

rate(http_requests_total[5m])
假設http_requests_total時間序列都有標簽job(按作業名稱扇出)和instance(按作業實例扇出),我們可能想要總結所有實例的速率,因此我們得到的輸出時間序列更少,但仍然 保留job維度
sum(rate(http_requests_total)[5m]) by (job)
如果我們有兩個具有相同維度標簽的不同指標,我們可以對它們應用二元運算符,並且兩側具有相同標簽集的元素將匹配並傳播到輸出。 例如,此表達式為每個實例返回MiB中未使用的內存(在虛構的群集調度程序上公開它運行的實例的這些度量標准):
(instance_memory_limit_byte - instant_memory_usage_bytes) / 1024 / 1024

相同的表達式,但由應用程序總結,可以這樣寫:

sum( instance_memory_limit_bytes - instance_memory_usage_bytes) by (app, proc) / 1024 / 1024

如果相同的虛構集群調度程序為每個實例公開了如下所示的CPU使用率指標:

instance_cpu_time_ns{app="lion", pro="web", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="elephant", proc="worker", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="turtle", proc="api", rev="4d3a513", env="prod", job="cluster-manager"}
...

我們可以按應用程序(app)和進程類型(proc)分組排名前3位的CPU用戶:

topk(3, sum(rate(instance_cpu_time_ns[5m])) by(app, proc))

假設此度量標准包含每個運行實例的一個時間系列,您可以計算每個應用程序運行實例的數量,如下所示:

count(instance_cpu_time_ns) by (app)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM