Prometheus 持久化查詢
本章重點: 持久化查詢配置
promQL篇章: 表達式,豆包ai,偏移量修改器,指標類型,指標類型,聚合計算函數,持久化查詢
持久化查詢特點
-
為什麼需要持久化查詢?
- Prometheus 原生查詢存在兩大痛點
- 臨時查詢不可複用:複雜 PromQL 需重複編寫,效率低下;
- 高開銷查詢性能差:頻繁執行聚合 / 計算類查詢會佔用大量服務器資源;
- 無統一指標口徑:不同人員編寫的查詢邏輯不一致,導致監控數據失真。
- 通過 持久化查詢(核心為「記錄規則」),可將自定義查詢邏輯固化為配置,自動生成可複用的新指標,支撐告警規則、可視化面板的統一調用,實現「一次配置,永久複用」,大幅提升監控效率與穩定性。
- 説白了就類似於 linux的
alias ll='ls -l'一種快速命令的別名
- Prometheus 原生查詢存在兩大痛點
-
核心概念:持久化查詢的三種方式
方式 核心用途 適用場景 關鍵特性 實操示例 關聯組件 / 工具 記錄規則 生成預計算 / 聚合指標 複雜聚合、高頻查詢、指標標準化 可被後續規則 / 查詢複用,降低計算開銷 計算節點 5 分鐘 CPU 空閒率、內存使用率 Prometheus 核心 警報規則 基於指標觸發告警 異常監控、故障預警 依賴記錄規則,支持持續時間過濾、級別分類 當 CPU 使用率 > 80% 持續 5 分鐘時觸發告警 Alertmanager 可視化配置 儀表盤展示查詢結果 實時監控、數據彙報、趨勢分析 直接調用記錄規則,支持圖表自定義、聯動篩選 Grafana 配置節點資源監控面板(CPU、內存、磁盤) Grafana - 核心邏輯:記錄規則是基礎,警報規則和可視化配置基於記錄規則實現,形成「指標生成→告警→可視化」的完整監控鏈路
流程配置
-
配置流程
graph TD A[修改 Prometheus 主配置] --> B[創建規則目錄與文件] B --> C[編寫記錄規則] C --> D[驗證配置正確性] D --> E[熱加載/重啓生效] -
開始配置
-
修改主配置(prometheus.yml)
global: scrape_interval: 15s # 全局指標採集間隔 evaluation_interval: 15s # 全局規則評估間隔(默認,可被規則組覆蓋) # 關聯記錄規則文件(支持單文件、多文件、通配符) rule_files: - "/data/prometheus/rules/node_rules.yml" # 用絕對路徑 # - "rules/*.yml" # 通配符:匹配 rules 目錄下所有 yml 文件 -
創建規則目錄與文件
# 1. 創建規則目錄(與主配置中路徑一致) mkdir -p /data/prometheus/rules # 2. 創建規則文件(按監控對象命名,如節點、內存) touch /data/prometheus/rules/node_rules.yml -
編寫記錄規則
-
規則文件結構
這裏用vscode擴展下載 【language-prometheus】 新建 xx.rules.yml多按tab補,要記得關鍵字
groups: # 全局唯一,建議按「監控對象+功能」命名(node_monitor_rules) - name: 規則組名稱 # 組內規則執行間隔(覆蓋全局 evaluation_interval) interval: 10s rules: # 遵循規範:[聚合級別]:[原指標]:[操作_時間窗口] 這個名稱用於ui查詢 - record: 新指標名稱 # 核心計算邏輯(需先在 UI 驗證)這是填規則 expr: PromQL 表達式 labels: # 自定義標籤(可選,用於篩選、分類) env: prod monitor_type: basic -
規則命名規範 格式:
[聚合級別]:[原指標名]:[操作_時間窗口]- 聚合級別:
instance(實例級)、cluster(集羣級)、service(服務級) - 原指標名:保留核心指標名稱(如
node_cpu_seconds_total→node_cpu) - 操作_時間窗口:
avg_rate5m(5 分鐘平均速率)、max_1h(1 小時最大值)
- 聚合級別:
-
關鍵配置説明
字段 作用 注意事項 groups.name規則組名稱 全局唯一,避免重複 interval組內規則執行間隔 高頻指標(如 CPU)設 10s,低頻(如磁盤)設 1m record生成的新指標名 嚴格遵循命名規範 expr核心查詢語句 可引用同組已定義的規則,減少計算開銷 labels自定義標籤 用於篩選、分組,支持動態標籤(如 env: {{ $labels.env }})
-
-
示例
node_rules.ymlgroups: - name: node_resource_rules # 規則組名稱(全局唯一,按功能命名) interval: 15s # 規則執行間隔(默認繼承全局,可自定義) rules: # 1. 節點CPU 5分鐘空閒率(實例級,百分比) - record: instance:node_cpu:idle_rate5m # 遵循:聚合級別:原指標:操作_時間窗口 expr: avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100 labels: monitor_type: basic # 自定義標籤(便於篩選) env: prod # 2. 節點內存使用率(實例級,百分比)- 修正語義矛盾 - record: instance:node_memory:usage_percent expr: (node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / node_memory_MemTotal_bytes * 100 labels: monitor_type: basic # 3. 節點根目錄磁盤使用率(實例級,百分比)- 修正邏輯+過濾無效數據 - record: instance:node_fs:root_usage_percent expr: (node_filesystem_size_bytes{mountpoint="/", fstype!~"tmpfs|rootfs"} - node_filesystem_avail_bytes{mountpoint="/", fstype!~"tmpfs|rootfs"}) / node_filesystem_size_bytes{mountpoint="/", fstype!~"tmpfs|rootfs"} * 100 labels: monitor_type: basic-
檢查配置
[root@localhost prometheus]# ./promtool check config prometheus.yml Checking prometheus.yml SUCCESS: 1 rule files found SUCCESS: prometheus.yml is valid prometheus config file syntax Checking /data/prometheus/rules/node_rules.yml SUCCESS: 3 rules found -
熱加載
# 需啓用 --web.enable-lifecycle 參數 curl -X POST http://localhost:9090/-/reload -
在 Prometheus UI 中查詢以下指標,確認結果正確
CPU 空閒率: instance:node_cpu:idle_rate5m 內存使用率: instance:node_memory:usage_percent 根目錄磁盤使用率:instance:node_fs:root_usage_percent
-
-
持久化速查表
-
關鍵配置, 記這些關鍵字用 vscode 插件 language-prometheus創建xx.rules.yml寫
字段 作用 注意事項 groups.name規則組名稱 全局唯一,避免重複 groups.interval組內規則執行間隔 高頻指標(如 CPU)設 10s,低頻(如磁盤)設 1m groups.rules.record生成的新指標名 嚴格遵循命名規範 groups.rules.expr核心查詢語句 可引用同組已定義的規則,減少計算開銷 groups.rules.labels自定義標籤 用於篩選、分組,支持動態標籤(如 env: {{ $labels.env }})groups: - name: rule組定義的全局唯一標識 interval: 規則執行的時間間隔 rules: - record: promQLui查詢的名稱 expr: 執行promQL labels: 定義標籤key: value # 用linux別名來對比 groups: - name: 這裏是rule組裏定義的全局唯一 interval: 5s刷新一下 rules: - record: ll expr: ls -l -
規則編寫最佳實踐
優化方向 具體做法 分組管理 按「監控對象 + 功能」分組(如 node_monitor_rules、mysql_alert_rules),避免單組規則過多性能優化 高基數指標用 irate()(瞬時速率),長時間窗口用rate()(平均速率);過濾無關標籤減少計算量標籤規範 統一標籤鍵(如 env、cluster、service),便於跨指標篩選和分類複用優先 複雜邏輯拆分多個規則,後續規則引用前序規則(如先算 CPU 空閒率,再算使用率)