PromQL 介紹¶
原文: PromQL 介绍
PromQL 是 Prometheus 監控系統內置的一種查詢語言,PromQL 允許你以靈活的方式選擇、聚合等其他方式轉換和計算時間序列數據,該語言僅用於讀取數據。可以說 PromQL 是我們學習 Prometheus 最困難也是最重要的部分,本章節我們將介紹 PromQL 的基礎知識、理論基礎,然後會深入了解更加高級的查詢模式。
目標¶
通過對本章節 PromQL 的學習你將能夠有效地構建、分享和理解 PromQL 查詢,可以幫助我們從容應對報警規則、儀錶盤可視化等需求,還能夠避免一些在使用 PromQL 表達式的時候遇到的一些陷阱。
執行¶
前面基礎章節我們介紹了 Prometheus 整體的架構:
當 Prometheus 從系統和服務收集指標數據時,它會把數據存儲在內置的時序數據庫(TSDB)中,要對收集到的數據進行任何處理,我們都可以使用 PromQL 從 TSDB 中讀取數據,同時可以對所選的數據執行過濾、聚合以及其他轉換操作。
PromQL 的執行可以通過兩種方式來觸發:
- 在 Prometheus 服務器中,記錄規則和警報規則會定期運行,並執行查詢操作來計算規則結果(例如觸發報警)。該執行在 Prometheus 服務內部進行,並在配置規則時自動發生。
- 外部用戶和 UI 界面可以使用 Prometheus 服務提供的 HTTP API 來執行 PromQL 查詢。這就是儀錶盤軟件(例如 Grafana、PromLens 以及 Prometheus 內置 Web UI)訪問 PromQL 的方式。
場景¶
PromQL 可以用於許多監控場景,下面簡單介紹幾個相關案例。
臨時查詢¶
我們可以用 PromQL 來對收集的數據進行實時查詢,這有助於我們去調試和診斷遇到的一些問題,我們一般也是直接使用內置的表達式查詢界面來執行這類查詢:
儀錶盤¶
同樣我們也可以基於 PromQL 查詢來創建可視化的圖形、表格等面板,當然一般我們都會使用 Grafana:
Grafana 原生支持 Prometheus 作為數據源,並內置支持了 PromQL 表達式的查詢。
報警¶
Prometheus 可以直接使用基於 PromQL 對收集的數據進行的查詢結果來生成報警,一個完整的報警規則如下所示:
groups:
- name: demo-service-alerts
rules:
- alert: Many5xxErrors
expr: |
(
sum by(path, instance, job) (
rate(demo_api_request_duration_seconds_count{status=~"5..",job="demo"}[1m])
)
/
sum by(path, instance, job) (
rate(demo_api_request_duration_seconds_count{job="demo"}[1m])
) * 100 > 0.5
)
for: 30s
labels:
severity: critical
annotations:
title: "{{$labels.instance}} high 5xx rate on {{$labels.path}}"
description: "The 5xx error rate for path {{$labels.path}} on {{$labels.instance}} is {{$value}}%."
除了構成報警規則核心的 PromQL 表達式(上面 YAML 文件中的 expr
屬性),報警規則還包含其他的一些元數據字段,後面在具體講解報警的章節中會詳細和大家講解。
然後,Prometheus 可以通過一個名為 Alertmanager 的組件來發送報警通知,可以配置一些接收器來接收這些報警,比如用 Opsgenie 接收報警:
自動化¶
此外我們還可以構建自動化流程,針對 PromQL 執行的查詢結果來做出決策,比如 Kubernetes 中基於自定義指標的 HPA。