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) |