14. Prothetheus查詢

原文:https://prometheus.io/docs/prometheus/latest/querying/basics/

Prometheus提供了一種稱爲PromQL(Prometheus查詢語言)的功能查詢語言,使用戶可以實時選擇和彙總時間序列數據。表達式的結果可以顯示爲圖形,可以在Prometheus的表達式瀏覽器中顯示爲表格數據,也可以由外部系統通過HTTP API使用

例子

本文檔僅供參考。爲了學習,從幾個示例開始可能會更容易。

表達語言數據類型

在Prometheus的表達語言中,一個表達式或子表達式可以計算爲以下四種類型之一:

  • 即時向量 -一組時間序列,每個時間序列包含一個樣本,所有樣本共享相同的時間戳
  • 範圍向量 -一組時間序列,其中包含每個時間序列隨時間變化的一系列數據點
  • 標量 -一個簡單的數字浮點值
  • 字符串-一個簡單的字符串值;目前未使用

根據用例(例如,在繪製圖形或顯示錶達式的輸出時),由於用戶指定的表達式的結果,其中只有某些類型是合法的。例如,返回即時向量的表達式是唯一可以直接繪製圖形的類型。

文字

字符串文字

可以在單引號,雙引號或反引號中將字符串指定爲文字。

PromQL遵循與Go相同的轉義規則。在單引號或雙引號反斜槓開頭的轉義序列,其可以隨後abf, nrtv\。可使用八進制(來提供特定的字符\nnn)或十六進制(\xnn\unnnn\Unnnnnnnn)。

反引號內不會處理任何轉義。與Go不同,Prometheus不會在反引號內丟棄換行符。

例:

"this is a string"
'these are unescaped: \n \\ \t'
`these are not unescaped: \n ' " \t`

浮點文字

標量浮點值可以從字面上寫爲以下形式的數字 [-](digits)[.(digits)]

-2.43

時間序列選擇器

即時向量選擇器

即時矢量選擇器允許在給定的時間戳(即時)下選擇一組時間序列和每個樣本的單個樣本值:以最簡單的形式,僅指定指標名稱。這將導致一個即時向量,其中包含具有該指標名稱的所有時間序列的元素。

本示例選擇所有具有http_requests_total指標名稱的時間序列:

http_requests_total

可以通過在大括號({})中添加一組匹配的標籤來進一步過濾這些時間序列。

本示例僅選擇那些具有http_requests_total 指標名稱的時間序列,這些時間序列也將job標籤設置爲prometheus並將其 group標籤設置爲canary

http_requests_total{job="prometheus",group="canary"}

也可以否定地匹配標籤值,或將標籤值與正則表達式匹配。存在以下標籤匹配運算符:

  • =:選擇與提供的字符串完全相同的標籤。
  • !=:選擇與提供的字符串不同的標籤。
  • =~:選擇與提供的字符串進行正則表達式匹配的標籤。
  • !~:選擇不與提供的字符串進行正則表達式匹配的標籤。

例如,此選擇所有http_requests_total的時間序列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語法

範圍向量選擇器

範圍向量文字的工作方式與即時向量文字相同,不同之處在於它們從當前即時選擇回採樣範圍。從語法上講,

在向量選擇器的末尾,方括號[  ]中會附加一個範圍持續時間,以指定應爲每個結果範圍向量元素提取多遠的時間值。

持續時間以數字指定,後面緊跟以下單位之一:

  • s -秒
  • m - 分鐘
  • h - 小時
  • d - 天
  • w -周
  • y -年

在此示例中,我們選擇所有時間序列在過去5分鐘內記錄的所有值,這些時間序列的指標名稱http_requests_totaljob標籤設置爲prometheus

http_requests_total{job="prometheus"}[5m]

Offset修飾符

offset修飾符可以爲查詢中的個別時刻和範圍矢量改變偏移時間。

例如,以下表達式返回http_requests_total相對於當前查詢評估時間的過去5分鐘的值 :

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)

子查詢

子查詢允許您針對給定的範圍和resolution(分辨率)運行即時查詢。子查詢的結果是範圍向量。

句法: <instant_query> '[' <range> ':' [<resolution>] ']' [ offset <duration> ]

  • <resolution>是可選的。默認值爲全局評估間隔。

運算符

Prometheus支持許多二進制和聚合運算符。這些在表達式語言運算符頁面中進行了詳細描述。

函數

Prometheus支持多種對數據進行操作的函數。這些在表達語言功能頁面中進行了詳細描述。

註釋

PromQL支持以#開頭的註釋行。例:

    # This is a comment

陷阱

陳舊性

運行查詢時,將選擇採樣數據的時間戳,而不依賴於實際的當前時間序列數據。這主要是爲了支持諸如聚合(sumavg等)的情況,其中多個聚合時間序列在時間上不完全一致。由於它們的獨立性,Prometheus需要爲每個相關時間序列在那些時間戳上分配一個值。只需在此時間戳之前獲取最新樣本即可。

如果目標抓取或規則評估不再返回先前存在的時間序列的樣本,則該時間序列將被標記爲陳舊。如果刪除了目標,則其先前返回的時間序列將在不久後標記爲陳舊。

如果在某個時間序列標記爲陳舊後以採樣時間戳評估查詢,則該時間序列不會返回任何值。如果隨後在該時間序列中攝取了新樣本,則它們將照常返回。

如果在採樣時間戳記之前5分鐘未找到樣本(默認情況下),則該時間序列在此時間點不會返回任何值。這實際上意味着,在最新採集的樣本超過5分鐘或標記爲陳舊之後,時間序列會從圖表中“消失”。

對於在抓取中包含時間戳的時間序列,不會標記爲陳舊。在這種情況下,僅會應用5分鐘的閾值。

避免慢查詢和重載

如果查詢需要處理大量數據,則對其進行圖形化處理可能會超時或使服務器或瀏覽器超載。因此,在對未知數據構建查詢時,請始終開始在Prometheus表達式瀏覽器的表格視圖中構建查詢,直到結果集看起來合理爲止(最多數百個而不是數千個時間序列)。僅當您充分過濾或彙總了數據後,才切換到圖形模式。如果該表達式仍無法花費很長時間來繪製臨時圖形,請通過記錄規則對其進行預記錄

這對於Prometheus的查詢語言尤其重要,在該語言中,像這樣的裸指標名稱選擇器api_http_requests_total可以擴展到成千上萬個具有不同標籤的時間序列。還請記住,即使輸出只是少量時間序列,在多個時間序列上聚合的表達式也會在服務器上產生負載。這類似於將關係數據庫中的列的所有值相加會很慢,即使輸出值只是一個數字也是如此。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章