Prometheus学系列(十九)之PromQL基础
Prometheus提供一個函數式的表達式語言PromQL (Prometheus Query Language),可以使用戶實時地查找和聚合時間序列數據。表達式計算結果可以在圖表中展示,也可以在Prometheus表達式瀏覽器中以表格形式展示,或者作為數據源, 以HTTP API的方式提供給外部系統使用。
一、例子
本文檔僅供參考。 對于學習,從幾個例子開始可能更容易。
二、表達式語言數據類型
在Prometheus的表達式語言中,任何表達式或者子表達式都可以歸為四種類型:
- instant vector 瞬時向量 - 它是指在同一時刻,抓取的所有度量指標數據。這些度量指標數據的key都是相同的,也即相同的時間戳。
- range vector 范圍向量 - 它是指在任何一個時間范圍內,抓取的所有度量指標數據。
- scalar 標量 - 一個簡單的浮點值
- string 字符串 - 一個當前沒有被使用的簡單字符串
依賴于使用場景(例如:圖表 vs. 表格),根據用戶所寫的表達式,僅僅只有一部分類型才適用這種表達式。例如:瞬時向量類型是唯一可以直接在圖表中使用的。
三、字面量
3.1 字符串字面量
字符串可以用單引號,雙引號或反引號指定為文字。
PromQL遵循與Go相同的轉義規則。在單引號,雙引號中,反斜杠成為了轉義字符,后面可以跟著a,b, f, n, r, t, v或者\。 可以使用八進制(\nnn)或者十六進制(\xnn, \unnnn和\Unnnnnnnn)提供特定字符。
在反引號內不處理轉義字符。與Go不同,Prom不會丟棄反引號中的換行符。例如:
"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度量標準名稱的時間系列,該名稱也將作業標簽設置為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 - seconds
- m - minutes
- h - hours
- d - days
- w - weeks
- y - 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提供了一些函數列表操作時間序列數據。詳見表達式語言函數
八、陷阱
8.1 Staleness
運行查詢時,獨立于實際當前時間序列數據選擇采樣數據的時間戳。這主要是為了支持聚合(總和,平均等)這樣的情況,其中多個聚合時間序列在時間上不完全對齊。由于它們的獨立性,Prometheus需要在每個相關時間序列的時間戳上分配值。它只需在此時間戳之前采用最新的樣本即可。
如果目標抓取或規則評估不再返回先前存在的時間序列的樣本,則該時間序列將被標記為陳舊。如果目標被移除,之前很快就會將其先前返回的時間序列標記為陳舊。
如果在時間序列標記為過時后在采樣時間戳處評估查詢,則不會為該時間系列返回任何值。如果隨后在該時間序列中攝取新樣本,它們將照常返回。
如果在采樣時間戳前5分鐘未找到任何樣本(默認情況下),則此時間點不返回該時間序列的值。這實際上意味著時間序列在其最新收集的樣本超過5分鐘或標記為陳舊之后從圖表“消失”。
對于在其抓取中包含時間戳的時間序列,不會標記陳舊性。在這種情況下,僅應用5分鐘的閾值。
8.2 避免慢查詢和重載
如果查詢需要對大量數據進行操作,則繪制圖表可能會超時或使服務器或瀏覽器過載。因此,在構建對未知數據的查詢時,始終在Prometheus表達式瀏覽器的表格視圖中開始構建查詢,直到結果集看起來合理(最多數百個,而不是數千個時間序列)。只有在您充分過濾或匯總數據后,才能切換到圖表模式。如果表達式仍然需要很長時間來繪制ad-hoc圖形,請通過錄制規則預先錄制它。
這與Prometheus的查詢語言尤其相關,其中像api_http_requests_total這樣的簡單度量標準名稱選擇器可以擴展到具有不同標簽的數千個時間序列。還要記住,即使輸出只是少量的時間序列,聚合在許多時間序列上的表達式也會在服務器上產生負載。這類似于在關系數據庫中對列的所有值求和的速度很慢,即使輸出值只是一個數字。
九、鏈接
Prometheus官網地址:prometheus.io/ 我的Github:github.com/Alrights/pr…
轉載于:https://juejin.im/post/5d083acd5188255c636e270a
總結
以上是生活随笔為你收集整理的Prometheus学系列(十九)之PromQL基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《孙子兵法》的作者是?A孙武;B孙子;C
- 下一篇: 玻璃险什么情况下不赔 玻璃险什么情况中不