Prometheus 持久化查詢

本章重點: 持久化查詢配置

promQL篇章: 表達式,豆包ai,偏移量修改器,指標類型,指標類型,聚合計算函數,持久化查詢

持久化查詢特點

  • 為什麼需要持久化查詢

    • Prometheus 原生查詢存在兩大痛點
      • 臨時查詢不可複用:複雜 PromQL 需重複編寫,效率低下;
      • 高開銷查詢性能差:頻繁執行聚合 / 計算類查詢會佔用大量服務器資源;
      • 無統一指標口徑:不同人員編寫的查詢邏輯不一致,導致監控數據失真。
    • 通過 持久化查詢(核心為「記錄規則」),可將自定義查詢邏輯固化為配置,自動生成可複用的新指標,支撐告警規則、可視化面板的統一調用,實現「一次配置,永久複用」,大幅提升監控效率與穩定性。
    • 説白了就類似於 linux的 alias ll='ls -l' 一種快速命令的別名
  • 核心概念:持久化查詢的三種方式

    方式 核心用途 適用場景 關鍵特性 實操示例 關聯組件 / 工具
    記錄規則 生成預計算 / 聚合指標 複雜聚合、高頻查詢、指標標準化 可被後續規則 / 查詢複用,降低計算開銷 計算節點 5 分鐘 CPU 空閒率、內存使用率 Prometheus 核心
    警報規則 基於指標觸發告警 異常監控、故障預警 依賴記錄規則,支持持續時間過濾、級別分類 當 CPU 使用率 > 80% 持續 5 分鐘時觸發告警 Alertmanager
    可視化配置 儀表盤展示查詢結果 實時監控、數據彙報、趨勢分析 直接調用記錄規則,支持圖表自定義、聯動篩選 Grafana 配置節點資源監控面板(CPU、內存、磁盤) Grafana
    • 核心邏輯:記錄規則是基礎,警報規則和可視化配置基於記錄規則實現,形成「指標生成→告警→可視化」的完整監控鏈路

流程配置

  • 配置流程

    graph TD
        A[修改 Prometheus 主配置] --> B[創建規則目錄與文件]
        B --> C[編寫記錄規則]
        C --> D[驗證配置正確性]
        D --> E[熱加載/重啓生效]
    
  • 開始配置

    1. 修改主配置(prometheus.yml)

      global:
        scrape_interval: 15s        # 全局指標採集間隔
        evaluation_interval: 15s    # 全局規則評估間隔(默認,可被規則組覆蓋)
      
      # 關聯記錄規則文件(支持單文件、多文件、通配符)
      rule_files:
        - "/data/prometheus/rules/node_rules.yml"  # 用絕對路徑
        # - "rules/*.yml"            # 通配符:匹配 rules 目錄下所有 yml 文件
      
    2. 創建規則目錄與文件

      # 1. 創建規則目錄(與主配置中路徑一致)
      mkdir -p /data/prometheus/rules
      
      # 2. 創建規則文件(按監控對象命名,如節點、內存)
      touch /data/prometheus/rules/node_rules.yml
      
    3. 編寫記錄規則

      • 規則文件結構

        這裏用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_totalnode_cpu
        • 操作_時間窗口:avg_rate5m(5 分鐘平均速率)、max_1h(1 小時最大值)
      • 關鍵配置説明

        字段 作用 注意事項
        groups.name 規則組名稱 全局唯一,避免重複
        interval 組內規則執行間隔 高頻指標(如 CPU)設 10s,低頻(如磁盤)設 1m
        record 生成的新指標名 嚴格遵循命名規範
        expr 核心查詢語句 可引用同組已定義的規則,減少計算開銷
        labels 自定義標籤 用於篩選、分組,支持動態標籤(如 env: {{ $labels.env }}
    4. 示例 node_rules.yml

      groups:
        - 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_rulesmysql_alert_rules),避免單組規則過多
    性能優化 高基數指標用 irate()(瞬時速率),長時間窗口用 rate()(平均速率);過濾無關標籤減少計算量
    標籤規範 統一標籤鍵(如 envclusterservice),便於跨指標篩選和分類
    複用優先 複雜邏輯拆分多個規則,後續規則引用前序規則(如先算 CPU 空閒率,再算使用率)