10、prometheus-PromQL-4-指标类型
prometheus-PromQL-4
本章重点:四大指标类型,理论跟示例
接上篇, prometheus表达式,prometheus向量选择器,偏移量修改器
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%(负载较高)。 -
优势:
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) |
