Prometheus-PromQL


簡介

    官網文檔地址: https://prometheus.io/docs/prometheus/latest/querying/basics/

   Prometheus 提供了一種名為 PromQL(Prometheus Query Language)的函數式(查詢語言),可以讓用戶實時選擇和聚合時間序列數據。表達式的結果既可以顯示為圖形,也可以在 Prometheus 的表達式瀏覽器中查看為表格數據,也可以通過HTTP API由外部系統使用 

作業(Job) 和 實例 (Instance)

    Instance: 能夠接收 Prometheus Server 數據 Scrape 操作的每個網絡端點(endpoint), 即為一個 Instance.

    通常, 具有類似功能的 Instance 的集合稱為一個 Job, 例如一個 Mysql 主從復制集群中的所有 Mysql 進程.

   具有相同目的的實例的集合(例如,出於可伸縮性或可靠性而復制的過程)稱為job

prometheus特殊tag說明

  • address 采集endpoint的地址

  • name metrics 的名稱

  • instance endpoint最后的tag

  • job 任務

  • metrics_path 采集的http path 如 /metrics /cadvisor/metrics

表達式語言數據類型

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

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

根據用例(例如,當繪制與顯示表達式的輸出時),作為用戶指定表達式的結果,這些類型中只有一些是合法的。例如,返回即時向量的表達式是唯一可以直接繪制的類型。

時間序列選擇器

即時向量選擇器

    即時向量選擇器允許在給定的時間戳(即時)選擇一組時間序列和單個樣本值:在最簡單的形式中,只指定一個度量名稱。這會產生一個包含所有具有此度量名稱的時間序列元素的即時向量。

即時向量選擇器由兩部分組成

  • 指標名稱: 用於限定特定指標下的時間序列, 即負責過濾指標,可選.

 

  • 匹配器(Matcher): 或者成為標簽選擇器, 用於過濾時間序列上的標簽, 定義在{}之中.可選

 

 

 

  • 只給定指標名稱, 或在標簽名稱上使用了控制的匹配器, 返回給定的指標下的所有時間序列,各自的即時樣本.

    • 例如: http_requests_total 和 http_request_total{}的功能相同, 都是用於返回 http_requests_total 指標下各時間序列的即時樣本.

    • 僅給定匹配器, 返回所有符合給定的匹配器的所有時間序列上的即時樣本.

      • 這些時間序列可能會有這不同的指標名稱

      • 例如: {job=".*", method='get'}

    • 指標名稱和匹配器的組合; 返回給定的指定的, 且符合給定的標簽過濾器的所有時間序列上的即時樣本.

      • 例如: http_requests_total{method=get}

標簽匹配模式

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

范圍向量選擇器

    范圍向量字面量的工作方式與即時向量字面量類似,不同之處在於它們從當前時刻選擇了一系列樣本。從語法上講,在向量選擇器的末尾將持續時間附加在方括號 ( []) 中,以指定應該為每個結果范圍向量元素提取多遠的時間值。

在此示例中,我們選擇了過去 5 分鍾內為所有具有指標名稱http_requests_totaljob標簽設置為 的時間序列記錄的所有值prometheus

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

時間范圍

持續時間指定為一個數字,后跟以下單位之一:

  • ms - 毫秒
  • s - 秒
  • m - 分鍾
  • h - 小時
  • d - days - 假設一天總是 24 小時
  • w - 周 - 假設一周總是 7d
  • y - 年 - 假設一年總是 365d
rate(node_network_receive_bytes_total{device!="lo"}[1m]) / 1024 

偏移修改器

(node_network_receive_bytes_total{device!="lo"}offset 5h)

四種指標類型

Counter

    計數器是代表一個累積指標單調遞增計數器,其價值只能在重新啟動增加或歸零。例如,您可以使用計數器來表示已服務請求,已完成任務或錯誤的數量。

   http_request_total 

通常 Counter 的總數並沒有直接作用, 而是需要借助 rate, topk, increase 和 irate 等函數來生成樣本數據的變化情況增長率.

  • rate(http_requests_total[2]), 獲取2小時內, 該指標下各時間序列上的http總請求數的增長速率.

  • topk(http_requests_total[2]), 高靈敏度函數, 用於計算指標的瞬時速率.

    • 基於樣本范圍內的最后兩個樣本進行計算, 相比較 rate 函數來說, irate更適用於短期啥時間范圍的變化速率分析.

  • increase 同時極差速率.

Gauge

  當前數, 表示單個數值,可以任意地上升和下降的度量。儀表通常用於測量值,如溫度或當前內存使用情況,但也用於可以上下波動的“計數”,如並發請求的數量。

 node_memory_MemFree_bytes 

 用於存儲值為可增可減的指標的樣本數據, 常用於進行求和, 取平均值, 最小值, 最大值等聚合計算, 也會經常結合 PromQL的predict_linear和delta函數使用.
  • predict_linear(v range-vector, t, scalar)函數可以預測時間序列v在t秒后的值, 它通過線性回歸的方式來預測樣本數據的Gauge變化趨勢.

  • delta(v range-vector) 函數計算范圍向量中每個時間序列元素的第一個值與最后一個值之差, 從而展示不同時間點上的樣本值的差值.

  • delta(cpu_temp_celsius{host='www.superops.com'}[2h]), 返回該服務器上的CPU溫度與2小時之前的差異.

Histogram

    直方圖樣本觀測(通常之類的東西請求持續時間或響應大小)和計數它們配置的桶中。它還提供所有觀測值的總和。它還提供所有觀察值的總和。

    具有基本指標名稱的直方圖<basename>在抓取期間公開多個時間序列:

  • 觀察桶的累積計數器,公開為 <basename>_bucket{le="<upper inclusive bound>"}
  • 的總和的所有觀察值的,公開為<basename>_sum
  • 該計數已觀察到的事件的,公開為<basename>_count(等同於<basename>_bucket{le="+Inf"}上文)

    使用該 histogram_quantile()函數 從直方圖甚至直方圖的聚合計算分位數。直方圖也適用於計算 Apdex 分數。在對桶進行操作時,請記住直方圖是 累積的。

Histogram 是一種對數據分布情況的圖形展示, 由一系列高度不等的長條圖(bar)或線段表示, 用於展示單個測度的值的分布.

一般用橫軸表示某個指標緯度的數據取值區間, 用縱軸表示樣本統計的頻率或頻數, 從而能夠以二維圖的形式展現數值的分布情況.

為了構建Histogram, 首先需要將值的范圍進行分段, 即將所有值的整個可用范圍分成一系列連續, 相鄰(相鄰處可以使等同值) 但不重疊的間隔, 而后統計每個間隔中有多少值.

從統計學的角度看, 分為數不能被聚合, 也不能進行算數運算.

對於Prometheus 來說, Histogram 會在一段時間范圍內對數據進行采樣, 通常是請求持續時長,或者響應大小等, 並將其計入可配置的bucket中.

Histogram 實現將特定測度可能的取值范圍分隔為多個樣本空間, 並通過對落入bucket內的觀測值進行計數以及請求和操作.

與常規方式略有不同的是, Prometheus 取值間隔的划分采用的累積區間間隔機制, 即米格 bucket 中的樣本均包含了其前面所有的 bucket 中的樣本, 因而也稱為累積直方圖.

  • 可降低Histogram 的維護成本.

  • 支持粗略計算樣本值的分位數,

  • 單獨提供了 _sum和 _count 指標, 從而支持計算平均值.

  • 累積間間隔機制生成的樣本數據需要額外使用內置的histogram_quantile()函數即可根據Histogram指標來計算相應地分位數, 即某個 bucket 的樣本數在所有樣本數中占據的比例.

    histogram_quantile() 函數在計算分為數時會假定每個區間內的樣本滿足線性分布狀態, 因而他的結果僅是一個預估值, 並不完全准確.

    預估的准確度取決於bucket區間划分的粒度, 粒度越大, 准確度越低

# http所有接口 總的95分位值
# sum/count 可以算平均值
prometheus_http_request_duration_seconds_sum/ prometheus_http_request_duration_seconds_count

# histogram_quantile(0.95, sum(rate(prometheus_http_request_duration_seconds_bucket[5m])) by (le,handler))

histogram_quantile(0.95, sum(rate(prometheus_http_request_duration_seconds_bucket[1m])) by (le))

# range_query接口的95分位值
histogram_quantile(0.95, sum(rate(prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range"}[5m])) by (le)

Summary

與histogram類似,摘要樣本觀察(通常是請求持續時間和響應大小之類的東西)。雖然它還提供觀察的總數和所有觀察值的總和,但它計算滑動時間窗口內的可配置分位數。

具有基本指標名稱的摘要<basename>在抓取期間公開多個時間序列:

指標類型是客戶端的特征, 而 Histogram 在客戶端僅是簡單的桶划分和分桶計數, 分位數由 Prometheus Server 基於樣本數據進行估算, 因而其結果未必准確, 甚至不合理的 bucket 划分會導致較大的誤差.

Summary 是一種類似於 Histogram 的指針類型, 單他在客戶端於前一段時間內(默認為10分鍾)的米格采樣點進行統計, 計算並儲存了分位數數值, Server 段直接抓取相應即可.

但Summary不支持sum或avg一類的聚合運算, 而且其分位數由客戶端計算並生成, Server 段無法獲取客戶端未定義的分位數, 而 Histogram 可通過PromQL任意定義, 有較好的靈活性.

Histogram 擴展類型, 單它使直接由被檢測端自行聚合計算出分位數, 並將計算結果響應給 Prometheus Server 的樣本采集請求, 因而, 其分位數計算是由監控端完成.

  • 觀察事件的流式φ-分位數(0 ≤ φ ≤ 1),暴露為<basename>{quantile="<φ>"}
  • 的總和的所有觀察值的,公開為<basename>_sum
  • 該計數的事件已經被觀察到,暴露<basename>_count
# gc耗時

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0.000135743
go_gc_duration_seconds{quantile="0.25"} 0.000872805
go_gc_duration_seconds{quantile="0.5"} 0.000965516
go_gc_duration_seconds{quantile="0.75"} 0.001055636
go_gc_duration_seconds{quantile="1"} 0.006464756

# summary 平均值
go_gc_duration_seconds_sum /go_gc_duration_seconds_count

 

 

聚合函數

  一般來說, 單個指標的價值不大, 在監控場景中往往需要聯合並可視化一組指標, 這種聯合機制即聚合操作, 例如將計數請求和平均值, 分位數, 標准差集等統計函數應用於時間序列的樣本之上生成具有統計學意義的結果等.

  對於查詢結果實現按照某種分類機制進行分組(group by)並將查詢結果按照組進行聚合計算, 也是比較常見的需求, 例如 分組統計, 分組求平均值分組求和等.

  組合操作由聚合函數針對一組值進行計算並返回單個值或少量值作為結果.

  • Prometheus 內置提供了 11 哥聚合函數稱為 聚合運算符.
  • 這些函數僅支持應用於單個即時向量的元素, 返回值也是具有少量元素的新向量或者標量.
  • 這些聚合運算符即可以基於向量表達式返回結果中的時間序列的所有標簽緯度進行分組聚合, 也可以僅基於指標的標簽緯度分組后進行分組聚合.

聚合表達式

PromQL 中的聚合操作語法可采用如下兩種

  • <aggr-op>([args,], <過濾器>) [without|by(label list)]

  • <aggr-op>[without|by(label list)] ([args,], <過濾器>)

分組聚合: 先分組, 后聚合

  • without: 從結果向量中刪除由without子句指定的標簽, 未指定的那部分標簽則用作分組標准.

  • by: 功能與 without 剛好相反, 它僅使用 by 子句中指定的標簽進行聚合, 結果向量中出現但為被 by 子句指定的標簽則會被忽略.

 

sum

   求和函數

sum(node_filesystem_files) by (instance, mountpoint)

avg

求平均值

avg(node_filesystem_files) by (instance)

count

對分組內的時間序列進行數量統計

count(node_memory_MemAvailable_bytes) by (instance)

stddev

對樣本值求標准差, 以幫助用戶了解數據的變動大小

stddev(node_memory_MemAvailable_bytes) by (instance)

stdvar

對樣本值求平方差,他是求標准差過程中的中間狀態

stdvar(node_memory_MemAvailable_bytes) by (instance)

min

求樣本值最小的值

min(node_filesystem_size_bytes) by (instance)

 

max

求樣本值中的最大者

topk

逆序返回分組內的樣本值最小的k個時間序列及其值

bottomk

順序返回分組內的樣本值最小的前k個時間序列及其值

quantile

分位數用於評估數據的分布狀態, 該函數會返回分組內指定的分位數的值, 及數值落在小於等於指定的分為區間的比例.

count_values

對分組內的時間序列的樣本值進行數量統計.

rate

irate(v range-vector)計算范圍向量中時間序列的每秒即時增長​​率。這是基於最后兩個數據點。單調性中斷(例如由於目標重新啟動導致計數器重置)會自動調整。

以下示例表達式返回范圍向量中每個時間序列的兩個最近數據點的 HTTP 請求的每秒速率,該請求最多可回溯 5 分鍾:

 
        
rate(prometheus_http_requests_total{}[5m])

 

irate

irate(v range-vector)計算范圍向量中時間序列的每秒即時增長​​率。這是基於最后兩個數據點。單調性中斷(例如由於目標重新啟動導致計數器重置)會自動調整。

以下示例表達式返回范圍向量中每個時間序列的兩個最近數據點的 HTTP 請求的每秒速率,該請求最多可回溯 5 分鍾:

rate(prometheus_http_requests_total{}[5m])

 

二元運算符

PromQL 支持基本的算數運算和邏輯運算, 這類運算支持使用操作符連接兩個操作數, 因而也稱為二元運算符或二元操作符.

支持運算

  • 兩個標量間運算

  • 即時向量和標量間的運算, 將運算符應用於向量上的每個樣本.

  • 兩個即時向量間的運算, 遵循向量匹配機制.

將運算符用於兩個即時向量間的運算時, 可基於向量匹配模式, 定義其運算機制.

算數運算

  • 支持的運算符: +, - , *, /, %, ^

比較運算符

  • == , != , >, <, >=, <=

邏輯集合運算

  • and , or , unless

  • 目前該運算僅在兩個即時向量間進行, 長不支持標量運算.

運算符優先級

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

可以使用()改變運算符次序.

向量匹配

 

即時向量間的運算時 PromeQL的特色之一, 運算時, PromeQL為會左側向量中的每個元素找到匹配的元素, 其匹配行為有兩種基本類型.

  • 一對一 (One-toOne)

  • 一對多或多對多(Many-to-One, One-to-Many)

一對一匹配

即時向量一對一匹配.

  • 從運算符的兩邊表達式所獲取的即時向量一次比較, 並找到唯一匹配, 標簽完全一致的樣本值.

  • 找不到匹配項則不會出現在結果中.

匹配表達式語法:

  • ignore: 定義匹配檢測時要忽略的標簽.

  • on: 定義匹配檢測時指使用的標簽.

 <即時向量> <運算> ignoring<label list> <即時向量>
 <即時向量> <運算> on<label list> <即時向量>

實例:

 rate(http_requests_total{status_code=~"5.*"}[5m]) > .1* rate(http_requests_total[5m])
 
 - 左側會生成一個即時向量, 計算出 5xx 響應碼的各類請求的增長速率.
 - 右側會生成一個即時向量, 計算出所有標簽組合所代表的增長速率
 - 計算時, PromeQL 會在操作符左右兩側的結果元素中找到標簽完全一致的元素, 進行比較.
 - 計算出沒類請求中的 500 響應碼在該類請求中所占的比例.
 rate(prometheus_http_requests_total{code=~'2.*'}[5m]) > .1 * rate(prometheus_http_requests_total[5m])
 sum (rate(prometheus_http_requests_total{code=~'2.*'}[5m])) by (handler) > 0.1 * sum by (handler) (rate(prometheus_http_requests_total[5m]))
 
 rate(prometheus_http_requests_total{code=~'2.*'}[5m])> on (handler) 0.1 * sum by (handler) (rate(prometheus_http_requests_total[5m]))

多對多

一對多/多對以匹配

  • 一 側的每個元素, 可與 多側的多個元素進行匹配.

  • 必須使用 group_left 或 group_right 明確指定那側為 多 側.

  • 語法

 <vector expr> <bin-op>

 

PromeQL 的解析過程

PromeQL表達式時一段文本, Prometheus 會解析這段文本, 將它轉化為一個結構化的語法樹對象, 進而實現響應的數據計算邏輯.

調用 Prometheus Restful API 查詢表達式計算工作流入有圖所示.

請求數據的時候給出 step 參數就是這里 interval, 它設定結果中相鄰兩個點的間隔, 對 Prom QL的每次 Evaluation 都是針對某個確定的時間點和 Statement 來計算, 得到一個 Vector(時間戳相同的向量.)

Prometheus 可以將異構(時間戳不一致) 的多維時間序列經過計算轉化為同結構 時間戳一直的多時間序列緯度.


免責聲明!

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



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