prometheus-PromQL-4

本章重點:四大指標類型,理論跟示例

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

Prometheus 支持四種核心指標類型,由客户端定義並上報,服務端通過 PromQL 函數分析,適配不同監控場景,核心差異在於數據變化特性和統計方式。

一、四大指標類型

指標類型 核心特性 適用場景
Counter 單調遞增,僅重置時歸零 統計請求數、錯誤數、任務執行次數等累計值
Gauge 可增可減,實時反映狀態 統計 CPU 使用率、內存佔用、温度、隊列長度等瞬時值
Histogram 服務端分桶累積統計 統計請求延遲、響應大小等分佈情況(支持估算分位數)
Summary 客户端預計算分位數 統計延遲、吞吐量等(需精準分位數,減少服務端計算壓力)

1.1、Counter(計數器)

核心是 “只增不減”,需通過速率類函數轉換為有意義的監控數據,函數(rate,irate,increase,topk

  • rate (指標 [時間窗口])

    • 説明: 用於計算 時間窗口內平均增長率 的核心函數,基於 Counter 類型指標,返回 “每秒增量”,適合分析 長期趨勢或平滑波動(如每秒鐘的請求量、錯誤率等)

    • 示例

      # 1. 過去 10 分鐘內,CPU 用於處理系統態進程的平均每秒耗時佔比
      rate(node_cpu_seconds_total{mode='system'}[10m])
      
      # 2. 計算 所有 job 標籤匹配 file 開頭的節點中,系統態 CPU 的平均使用率(百分比),用於監控特定分組節點的系統級 CPU 負載
      avg(rate(node_cpu_seconds_total{mode='system', job=~'file.*'}[10m])) * 100
      
      # 3.計算過去 3 分鐘內,sda 磁盤的 平均每秒寫入字節數(反映磁盤 IO 寫入趨勢)
      rate(node_disk_written_bytes_total{device="sda"}[3m])
      
    • 優勢: rate 核心價值是 “平滑短期波動,反映長期趨勢”,適合:

      • 日常監控儀表盤(如 QPS、CPU 使用率趨勢圖)
      • 穩定性告警(如錯誤率、流量過載閾值)
      • 性能分析(如磁盤 IO、網絡速率的平均負載)
    • 注意:時間窗口建議設置為 指標採集間隔的 5-10 倍(如採集間隔 15s,窗口用 [1m][5m]),平衡靈敏度與平滑效果;短期突發監控優先用 irate,長期趨勢用 rate

  • irate (指標 [時間窗口])

    • 説明:用於計算 瞬時增長率 的函數,基於時間窗口內的 最後兩個樣本點 計算,靈敏度極高,適合監控 短期快速波動的指標(如突發流量、瞬時錯誤激增等)

    • 示例

      # 1. 計算過去 1 分鐘內,POST 方法調用 /api/pay 接口的 瞬時請求數/秒(快速捕捉支付接口的突發流量
      irate(http_requests_total{method="POST", path="/api/pay"}[1m])
      
      # 2. 計算過去 30 秒內,節點通過 ens192 網卡的 瞬時發送字節速率(精確到秒級波動)
      irate(node_network_transmit_bytes_total{device='ens192'}[30s])
      
      # 3. 計算過去 2 分鐘內,5xx 錯誤狀態碼的 瞬時出現速率
      irate(http_requests_total{status=~"5.."}[2m])  # 5xx 錯誤
      
    • 優勢: irate 核心價值是 “捕捉瞬時波動”,適合:

      • 實時告警(快速響應突發異常)
      • 短期故障排查(秒級精度的指標變化)
      • 高靈敏度監控場景(如支付、核心交易鏈路)
    • 注意:與 rate(平滑長期趨勢)配合使用,互補監控不同時間粒度的指標變化。

  • increase (指標 [時間窗口])

    • 説明:計算時間窗口內的總增量,適合統計固定時段總量

    • 示例:

      # 1. 計算過去 1 小時內,http_requests_total 指標的總增量(即這 1 小時內的總請求數)
      increase(http_requests_total[1h])
      
      # 2. 計算過去 24 小時內,sda 磁盤的總寫入字節數,可轉換為 GB 便於閲讀:increase(...) / 1024 / 1024 / 1024
      increase(node_disk_written_bytes_total{device="sda"}[24h])
      
      # 3. 計算節點過去 1 小時的總流出流量(轉換為 GB),篩選出超過 10GB 的節點
      increase(node_network_transmit_bytes_total[1h]) / 1024 / 1024 / 1024 >10
      
      # 4. 過去 1 小時內,CPU 處於 “空閒態(idle)” 的總秒數
      increase(node_cpu_seconds_total{mode="idle"}[1h])
      # 若結果為 3500 秒(約 58 分鐘),説明這 1 小時內 CPU 有 3500 秒處於空閒狀態。
      # 對於單核心 CPU,1 小時總時長為 3600 秒,3500 秒意味着空閒率約 97%(幾乎無負載);若結果為 1000 秒,則空閒率約 28%(負載較高)。
      
      # 5、這裏是總核的空閒態狀態
      avg(increase(node_cpu_seconds_total{mode="idle"}[1h])) by (instance)
      
    • 優勢: increase 核心價值是 “統計固定時段的總量”,適合:

      • 業務報表(如每日請求量、錯誤量)
      • 異常總量監控(如 “1 小時內錯誤超閾值”)
      • 資源使用總量統計(如磁盤寫入量、網絡流量)
    • 注意:increase 結果是 絕對值,需根據指標單位(如字節、次數)轉換為易讀格式;與 rate(速率)的區別是:rate 關注 “每秒多少”,increase 關注 “這段時間共多少”。

  • topk (N, 指標)

    • 説明:是 PromQL 中用於篩選 前 N 個最大值 的函數,適用於快速定位 “指標值最高的實體”(如負載最高的節點、請求量最大的接口等)

    • 示例

      # 1.從 http_requests_total(累計請求數)中,篩選出總請求數排名前 5 的接口(按 path、method 等標籤區分)
      topk(5, http_requests_total)
      
      # 2. 篩選出內存佔用最高的 2 個節點(按 instance 標籤區分)
      topk(2,node_memory_MemTotal_bytes-node_memory_Active_bytes)
      
      # 3. 篩選出根磁盤<10%的前2個節點
      topk(2,(node_filesystem_avail_bytes{mountpoint="/"} /node_filesystem_size_bytes{mountpoint="/"})*100) < 10
      
      # 4.獲取 500 錯誤數排名前三的服務實例
      topk(3, http_requests_total{status="500"})
      
    • 優勢: topk 核心價值是 “快速定位頭部實體”,適合:

      • 流量 / 負載排行(如 Top 5 接口、Top 3 節點)
      • 異常指標篩選(如錯誤數最高的接口、使用率超標的節點)
      • 資源優化決策(如優先擴容負載最高的實例)
    • 注意:topk 結果是 瞬時值或時間窗口內的統計值,需結合時間範圍(如 [5m])避免偶然峯值影響判斷。

1.2、Gauge(儀表盤)

核心是 “靈活變化”,直接反映當前狀態,可結合聚合函數或趨勢預測函數使用。函數(sum,avg,max,min,delta,predict_linear

  • 幾個函數説明

    函數 核心作用 關鍵場景
    sum 聚合多序列的總量 集羣總資源、總流量
    avg 計算多序列的平均值 平均負載、平均延遲
    max 取最大值,定位極端值 最高使用率、最大延遲(問題排查)
    min 取最小值,發現冗餘或異常 最低負載節點、最小流量(資源調度)
    delta 計算時間窗口內的差值 內存 / 温度變化量(異常波動監控)
    predict_linear 線性預測未來值 磁盤 / 內存耗盡時間(容量規劃預警)
  • sum (指標 )

    • 説明:用於聚合多個時間序列的指標值,得到總量(如集羣總資源使用、服務總請求量等)

    • 示例

      # 1. 獲取以job=file.*的標籤的全部空閒內存
      sum((node_filesystem_size_bytes-node_filesystem_avail_bytes{job=~"file.*"}))
      
      # 2. 按環境(env,如 prod/test)分組,彙總各組內所有服務的請求速率(過去 5 分鐘平均),得到每個環境的總 QPS
      sum(rate(http_requests_total[5m])) by (env)
      
      # 3. 總 sda、sdb、sdc 三塊磁盤的寫入速率(過去 10 分鐘平均),得到節點總磁盤寫入速率
      sum(rate(node_disk_written_bytes_total{device=~"sd[a-c]"}[10m]))
      
  • avg

    • 説明:用於求多個時間序列的均值,反映整體平均水平(如集羣平均負載、服務平均延遲等)。

    • 示例

      # 1. 按可用區(job)分組,計算每組內節點的非空閒 CPU 使用率(過去 5 分鐘平均)的平均值,得到各可用區的平均 CPU 負載
      avg(rate(node_cpu_seconds_total{mode!="idle"}[5m]) * 100) by (job)
      
      # 2. 按接口路徑(path)分組,先通過 sum/count 計算每個接口的平均延遲,再求同一路徑下所有實例的平均延遲
      avg(rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])) by (path)
      
      # 計算所有節點 / 分區的使用率(1 - 可用比例)的平均值,得到集羣平均磁盤使用率
      avg(1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100
      
      # 4. 按主機維度統計 Web 應用的平均 CPU 使用率
      avg(cpu_usage_percent{app="web"}) by (host)
      
  • max

    • 説明: 用於定位 “最極端” 的時間序列(如負載最高的節點、延遲最大的接口等)。

    • 示例

      # 1. 按節點(instance)計算內存使用率,取其中的最大值,定位內存壓力最大的節點
      max(node_memory_Active_bytes / node_memory_MemTotal_bytes * 100)
      
      # 2. 按網卡(device)分組,取過去 1 分鐘內的最大網絡流入速率,定位流量最高的網卡
      max(rate(node_network_receive_bytes_total[10m])) by (device)
      
  • min

    • 説明:用於發現 “最低值” 的時間序列(如資源使用率最低的節點、延遲最小的實例等)。
    • 示例: 跟MAX相反
  • delta (指標 [時間窗口])

    • 説明:用於計算 Gauge 類型指標在指定時間窗口內首尾樣本差值 的函數,核心價值是 “量化指標的變化量”(正值為增加、負值為減少),適用於監控數據波動、異常變化等場景。

    • 示例

      # 1.計算 web01 節點過去 1 小時內已用內存的增減量(單位:字節)
         # 結果為正:內存使用量增加(如 1073741824 表示增加 1GB);
         # 結果為負:內存使用量減少(如 -536870912 表示減少 512MB)。
      delta(node_memory_Active_bytes{instance="10.4.50.130:9100"}[1h])
      
      # 2. 計算節點過去 5 分鐘內的 TCP established 連接數變化,若突增超過 500,説明可能有流量衝擊或連接泄漏
      delta(node_netstat_Tcp_CurrEstab{instance="10.4.50.130:9100"}[5m]) > 500
      
      # 3. 可用區(file.*)分組,計算每個區域節點 1 分鐘負載值(node_load1)的變化量
      delta(node_load1{job=~"file.*"}[1h])
      
      # 4. 計算節點過去1小時變化超過 2GB
      abs(delta(node_memory_Active_bytes[1h])) > 2*1024*1024*1024
      
      # 5.過去 6 小時內 / 分區的空閒空間變化量(負值表示空間減少)
      delta(node_filesystem_avail_bytes{mountpoint="/"}[6h])
      
    • 優勢: delta 核心價值是 “量化指標的時間維度變化”,適合:

      • 資源波動監控(內存、磁盤、負載的增減);
      • 異常變化告警(如突發的連接數、錯誤數增長);
      • 趨勢分析(如隊列堆積、温度上升趨勢)。
  • **predict_linear (指標 [時間窗口], 預測秒數)**,

    • 説明:predict_linear(v range-vector, t scalar) 是 PromQL 中用於 線性迴歸預測 的核心函數,基於指定時間窗口的樣本數據,預測 t 秒後的指標值,適用於容量規劃、資源耗盡預警等場景

    • 示例:

      # 1. 預測磁盤空間何時耗盡(告警核心)
        # node_filesystem_avail_bytes{mountpoint="/"}:/ 分區的可用空間(Gauge 類型);
        # [6h]:基於過去 6 小時的空間變化趨勢做預測;
        # 3600:預測 1 小時(3600 秒)後的可用空間;
        # < 0:若預測結果為負,説明 1 小時內磁盤將滿。
      predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 3600)<1
      
      # 2. 基於過去 3 小時的內存使用趨勢,預測 1 小時後 db01 主機的內存使用量
      predict_linear(node_memory_Active_bytes{job="file-node"}[3h],3600)
      
    • 優勢: predict_linear 核心價值是 “提前預判資源趨勢”,適合:

      • 容量預警(磁盤、內存、CPU 耗盡前通知);
      • 流量規劃(大促、秒殺等場景的提前擴容);
      • 集羣資源優化(跨區域 / 多服務的統一規劃)。

1.3、Histogram(直方圖)

直方圖(Histogram)是用於統計連續型數據分佈的核心指標類型,通過 “預定義分桶(Bucket)” 累積樣本,支持估算分位數、計算平均值,適用於監控請求延遲、響應大小、函數執行耗時等場景。

  • 核心特性

    • 服務端累積分桶:客户端上報原始樣本,Prometheus 按預定義邊界將樣本歸入不同桶,桶值累積遞增(累積直方圖)。
    • 支持多維度統計:自動生成 _bucket(分桶計數)、_sum(樣本總和)、_count(樣本總數)三類指標。
    • 靈活分位數估算:通過 histogram_quantile() 函數估算任意分位值(如 P95、P99 延遲),適配性能監控場景。
  • 自動生成的指標組件

    對於一個 Histogram 類型指標 xxx,Prometheus 會自動生成以下 3 類指標:

    指標名稱格式 含義 類型
    xxx_bucket{le="邊界值"} 累積桶:值 ≤ 該邊界的樣本總數(le 表示 “小於等於”,le="+Inf" 包含所有樣本) Counter
    xxx_sum 所有樣本的數值總和(如所有請求延遲的總時長) Gauge
    xxx_count 樣本總數(等價於 xxx_bucket{le="+Inf"} Counter
  • Histogram 基礎使用流程

    • 通過 Prometheus 客户端 SDK 定義 Histogram 指標,指定分桶邊界:

      import (
          "github.com/prometheus/client_golang/prometheus"
          "github.com/prometheus/client_golang/prometheus/promauto"
      )
      
      // 定義 HTTP 請求延遲直方圖,分桶邊界:5ms、10ms、20ms、50ms、100ms、200ms、500ms、1s、+Inf
      var httpRequestDuration = promauto.NewHistogram(prometheus.HistogramOpts{
          Name:    "http_request_duration_seconds", // 指標名(注意單位:秒,建議統一用基礎單位)
          Help:    "HTTP 請求響應延遲分佈",
          Buckets: prometheus.ExponentialBuckets(0.005, 2, 8), // 0.005s(5ms)起,每次×2,共8個桶(5,10,20,40,80,160,320,640ms)
          Labels:  []string{"method", "path", "status"}, // 自定義標籤(維度)
      })
      
      // 業務代碼中記錄樣本(如 HTTP 中間件)
      func recordRequestDuration(method, path, status string, duration float64) {
          httpRequestDuration.WithLabelValues(method, path, status).Observe(duration) // duration 單位:秒
      }
      
      • 假設定義指標 http_request_duration_seconds,預定義桶邊界 [5, 10, 20, 50, 100, +Inf](單位:毫秒),則自動生成:
        • http_request_duration_seconds_bucket{le="5"}:延遲 ≤5ms 的請求累積數
        • http_request_duration_seconds_bucket{le="10"}:延遲 ≤10ms 的請求累積數(含 ≤5ms 的樣本)
        • http_request_duration_seconds_sum:所有請求的總延遲時間
        • http_request_duration_seconds_count:總請求數
    • 暫時沒看懂是幹啥用的,先略過,等後續在更新

  • 對比

對比維度 Histogram(直方圖) Summary(摘要)
分位數計算位置 服務端(通過 histogram_quantile 估算) 客户端(預計算,精準)
聚合支持 支持(按 le 聚合後計算分位數) 不支持(分位數為客户端本地統計,無法二次聚合)
服務端壓力 中等(需計算分位數) 低(直接讀取分位數值)
靈活性 高(服務端可調整聚合維度) 低(分位數維度固定)
存儲開銷 隨桶數量增加而增加 固定(僅分位數、sum、count)