前言
本文來自Prometheus官網手冊和 Prometheus簡介
Prothetheus查詢
一、例子
本文檔僅供參考, 對於學習,從幾個例子開始可能更容易。
二、表達式語言數據類型
在Prometheus的表達式語言中,任何表達式或者子表達式都可以歸為四種類型:
instant vector
瞬時向量:它是指在同一時刻,抓取的所有度量指標數據。這些度量指標數據的key都是相同的,也即相同的時間戳range vector
范圍向量:它是指在任何一個時間范圍內,抓取的所有度量指標數據scalar
標量:一個簡單的浮點值string
字符串:一個當前沒有被使用的簡單字符串
三、字面量
3.1 字符串字面量
字符串可以用單引號,雙引號或反引號指定為文字。PromQL遵循與Go相同的轉義規則。在單引號,雙引號中,反斜杠成為了轉義字符,后面可以跟着a
,b
, f
, n
, r
, t
, v
或者\
。 可以使用八進制(\nnn
)或者十六進制(\xnn
, \unnnn
和\Unnnnnnnn
)提供特定字符。在反引號內不處理轉義字符。與Go不同,Prometheus不會丟棄反引號中的換行符。例如:
"this is a string" 'these are unescaped: \n \\ \t' `these are not unescaped: \n ' " \t"'`
3.2 浮點數字面量
標量浮點值可以直接寫成形式[-](digits)[.(digits)]
。
-2.43
四、時間序列選擇器
4.1 瞬時向量選擇器
瞬時向量選擇器允許在給定時間戳(即時)為每個選擇一組時間序列和單個樣本值:在最簡單的形式中,僅指定度量名稱。 這會生成包含具有此度量標准名稱的所有時間序列的元素的即時向量。
下面這個例子選擇所有時間序列度量名稱為http_requests_total
的樣本數據:
http_requests_total
通過在度量指標后面增加{}一組標簽可以進一步地過濾這些時間序列數據。
此示例僅選擇具有http_requests_total
度量標准名稱的時間系列,該名稱也將job標簽設置為prometheus
,並將其group
標簽設置為canary
:
http_requests_total{job="prometheus",group="canary"}
可以采用不匹配的標簽值也是可以的,或者用正則表達式不匹配標簽。標簽匹配操作如下所示:
=
: 精確地匹配標簽給定的值!=
: 不等於給定的標簽值=~
: 正則表達匹配給定的標簽值!~
: 給定的標簽值不符合正則表達式
例如:度量指標名稱為http_requests_total
,正則表達式匹配標簽environment
為staging, testing, development
的值,且http請求方法不等於GET
。
http_requests_total{environment=~"staging|testing|development",method!="GET"}
匹配空標簽值的標簽匹配器也可以選擇沒有設置任何標簽的所有時間序列數據。正則表達式完全匹配。 可以為同一標簽名稱提供多個匹配器。
向量選擇器必須指定一個名稱或至少一個與空字符串不匹配的標簽匹配器。 以下表達式是非法的:
{job=~".*"} # Bad!
相反,這些表達式是有效的,因為它們都有一個與空標簽值不匹配的選擇器。
{job=~".+"} # Good! {job=~".*",method="get"} # Good!
__name__
標簽篩選度量指標名稱。例如:表達式http_requests_total
等價於{__name__="http_requests_total"}
。 其他的匹配器,如:= ( !=, =~, !~)
都可以使用。下面的表達式選擇了度量指標名稱以job:
開頭的時間序列數據:
{__name__=~"job:.*"}
Prometheus中的所有正則表達式都使用RE2語法。
4.2 范圍向量選擇器
范圍向量的工作方式與即時向量相同,不同之處在於它們從當前即時選擇回采樣范圍。 在語法上,范圍持續時間附加在向量選擇器末尾的方括號([]
)中,指定為每個結果范圍向量元素提取多長時間值。持續時間指定為數字,單位為:
s
- secondsm
- minutesh
- hoursd
- daysw
- weeksy
- years
在此示例中,我們選擇在過去5分鍾內為度量標准名稱為http_requests_total
且job
標簽設置為prometheus
的所有時間序列記錄的所有值:
http_requests_total{job="prometheus"}[5m]
4.3 偏移修飾符
這個offset
偏移修飾符允許在查詢中改變單個瞬時向量和范圍向量中的時間偏移。例如,以下表達式返回過去相對於當前查詢評估時間5分鍾的http_requests_total
值:
http_requests_total offset 5m
注意:offset
偏移修飾符必須直接跟在選擇器后面,例如:以下是正確的:
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)
五、子查詢
子查詢允許針對給定范圍和分辨率運行即時查詢。 子查詢的結果是范圍向量。
語法:<instant_query>'['<range>':'[<resolution>]']'[offset <duration>]
<resolution>
是可選的。 默認值是全局評估間隔。
六、操作符
Prometheus支持二元和聚合操作符。詳見表達式語言操作符
七、函數
Prometheus提供了一些函數列表操作時間序列數據。詳見表達式語言函數
八、注釋
PromQL支持以#開頭的行注釋。 如:
#這是一條評論
九、陷阱
9.1 舊數據
運行查詢時,獨立於當前時間序列的數據選擇采樣數據的時間戳。這主要是為了支持聚合(總和,平均等)這樣的情況,其中多個聚合時間序列在時間上不完全對齊。由於它們的獨立性,Prometheus需要在每個相關時間序列的時間戳上分配值。它只需在此時間戳之前采用最新的樣本即可。
如果目標抓取或規則評估不再返回先前存在的時間序列的樣本,則該時間序列將被標記為舊數據。如果目標被移除,之前很快就會將其先前返回的時間序列標記為舊數據。
如果在時間序列標記為過時后,在采樣時間戳處評估查詢,則不會為該時間系列返回任何值。如果隨后在該時間序列中攝取新樣本,它們將照常返回。
如果在采樣時間戳前5分鍾未找到任何樣本(默認情況下),則此時間點不返回該時間序列的值。這實際上意味着時間序列在其最新收集的樣本超過5分鍾或標記為舊數據之后從圖表“消失”。對於在其抓取中包含時間戳的時間序列,不會標記舊數據。在這種情況下,僅應用5分鍾的閾值。
9.2 避免慢查詢和過載
如果查詢需要對大量數據進行操作,則繪制圖表可能會超時或使服務器或瀏覽器過載。因此,在構建對未知數據的查詢時,始終在Prometheus表達式瀏覽器的表格視圖中開始構建查詢,直到結果集看起來合理(最多數百個,而不是數千個時間序列)。只有在充分過濾或匯總數據后,才能切換到圖表模式。如果表達式仍然需要很長時間來繪制ad-hoc圖形,請通過錄制規則預先錄制它。
這與Prometheus的查詢語言尤其相關,其中像api_http_requests_total
這樣的簡單度量標准名稱選擇器可以擴展到具有不同標簽的數千個時間序列。還要記住,即使輸出只是少量的時間序列,聚合在許多時間序列上的表達式也會在服務器上產生負載。這類似於在關系數據庫中對列的所有值求和的速度很慢,即使輸出值只是一個數字。