PromQL: Prometheus 查詢語言的全面解析

Prometheus是一個流行的開源監控系統,PromQL是它的查詢語言。PromQL 的強大功能使其成為一個容易使用而有力的工具。在本文中,我們將全面深入地了解PromQL,包括其語法、函數、數據查詢和模糊匹配等方面的詳細內容。

一、PromQL 語法

首先,讓我們看一下PromQL的基本語法。PromQL的語法類似於SQL,它使用一個表格來表示時序數據,而每個行代表一個時間戳和相應的數據值。


# 示例基本語法
metric_name [ "{" label_name "=" `label_value` [ "," label_name "=" `label_value` ] "}" ] element-specifier [ range-vector-selector | offset ]

其中:

  • metric_name:是一個字符串,表示監控指標的名稱。
  • label_namelabel_value:用來標識監控指標,是一組鍵值對。
  • element-specifier:表示查詢的數據值。例如,一個整個時間序列可以用它的名稱表示,北京市在2021年的天氣可以用它的名稱,也可以用一些關鍵字來表示,如TOPK,AVG等。
  • range-vector-selectoroffset:可選參數。range-vector-selector 用來指定一個時間範圍,而 offset 用戶指定相對時間的時間位移。

二、PromQL判斷數據是否存在

在進行數據檢索之前,通常需要先判斷數據是否存在。PromQL 提供了一些函數來幫助我們進行這個工作。

1. absent() 函數

absent() 函數可用於檢查在請求的時間範圍內是否有指定的指標名稱或標籤/鍵值對的數據存在。


absent(metric_name [ "{" label_name "=" `label_value` [ "," label_name "=" `label_value` ] "}" ]) 

例如以下查詢會返回 1,因為名為 my_metric 的指標不存在:


# 查詢 my_metric 指標是否存在
absent(my_metric)  

2. label_replace() 函數

label_replace() 函數可用於條件轉換:如果存在符合給定模式的標籤,則用新標籤覆蓋原始標籤。


# 示例將源標籤名稱與 value 進行正則表達式替換,新標籤的名稱為 dest_label,替換後的值為 $1
label_replace(source_metric_name{source_label="value"}, "dest_label", "$1", "source_label", "regex") 

三、PromQL 函數

PromQL提供了許多有用的函數幫助我們對數據進行精確查詢和處理。下面我們就來介紹一下它提供的幾種函數。

1. rate() 函數

rate() 函數被用來對計數器類型指標進行轉換,得到每秒鐘的增量速率。例如:獲取過去5分鐘內的接口流量


# query data from counter metric
irate(api_requests_total[5m])  

2. increase() 函數

increase() 函數被用來計算子查詢內計數器類型指標的增量值。例如,下面這段查詢用於比較過去5分鐘和過去10分鐘的接口請求增量:


increase(api_requests_total[5m]) / increase(api_requests_total[10m])

3. sum() 函數

sum() 函數用於匯總同一標籤下的數據,並將多個時序數據之和作為一個新時序數據返回。例如,下面這段查詢計算出了所有服務中廣告流量的總和:


sum(ad_traffic{service="*"})

4. count() 函數

count() 函數用於計算提取出的指標集合中的元素數量。下面這段查詢計算每個標籤的數據數量:


count by (label_name) (metric_name) 

四、PromQL怎麼讀

PromQL的閱讀對初學者來說可能會比較困難。在這裡,我們推薦使用以下技巧來更好地掌握它:

  1. 深入理解查詢的目的,以便更好地理解需要查詢哪些數據和如何使用PromQL來搜索數據。
  2. 在複雜的查詢中使用括號來明確查詢的順序和意圖。
  3. 使用PromQL解釋器測試你的查詢語句,以便確定你所查詢的實際數據是否符合你的預期。

五、PromQL 模糊匹配

PromQL也支持模糊匹配。

1. =~ 運算符

適用於正則表達式匹配。例如,匹配 CPU 使用率中以 http 開頭的數據:


# Using the \'http.*\' regex pattern to match CPU usage metrics that begin with \"http\"
node_cpu{instance=~\"http.*\"}

六、PromQL 語法解析

PromQL的語法解析使得它可以輕鬆地查詢時序數據。使用PromQL解析器,你可以將查詢轉換為可視化數據圖表以及其他處理結果,幫助你更好地理解與管理大規模時序數據。

七、PromQL 中文手冊

為了幫助更多的開發人員更好地理解PromQL,社區提供了PromQL中文手冊,詳細介紹了PromQL的基本語法、常見問題、函數等內容。如果你是一個PromQL新手,這個手冊一定對你大有幫助。

八、PromQL BY

BY 關鍵字用於分組聚合。下面這段代碼計算每個主機的 CPU 平均負載:


avg(cpu_load) by (host)

九、PromQL SUM

SUM 函數用於匯總數據。下面這段代碼計算服務 http_requests_total 的總請求次數:


sum(http_requests_total)

十、PromQL TOPK

使用 TOPK 函數,你可以獲取請求最高的前幾個元素。下面這段代碼查詢了最大的 5 個 CPU 負載值:


topk(5, cpu_load)

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/249705.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 17:12
下一篇 2024-12-12 17:12

相關推薦

  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Python zscore函數全面解析

    本文將介紹什麼是zscore函數,它在數據分析中的作用以及如何使用Python實現zscore函數,為讀者提供全面的指導。 一、zscore函數的概念 zscore函數是一種用於標…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • 全面解讀數據屬性r/w

    數據屬性r/w是指數據屬性的可讀/可寫性,它在程序設計中扮演着非常重要的角色。下面我們從多個方面對數據屬性r/w進行詳細的闡述。 一、r/w的概念 數據屬性r/w即指數據屬性的可讀…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python計算機程序代碼全面介紹

    本文將從多個方面對Python計算機程序代碼進行詳細介紹,包括基礎語法、數據類型、控制語句、函數、模塊及面向對象編程等。 一、基礎語法 Python是一種解釋型、面向對象、動態數據…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28

發表回復

登錄後才能評論