当前位置: 首页 > news >正文

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)
http://www.dtcms.com/a/603154.html

相关文章:

  • 衡水网站建设与制作济南专业做网站的公司哪家好
  • 青岛网站建设方案维护wordpress 幻灯片无法显示
  • 临沭做网站小公司管理方法
  • 建设网站域名有了还要什么网页设计表格跨行代码
  • cms网站怎么制作网上推广兼职
  • 2025年第十一届数维杯国际大学生数学建模挑战赛(国际赛)
  • 网站制作价格甄选乐云践新百度快照入口
  • 三亚网站建设哪家好wordpress链接 颜色
  • SQL窗口函数实战:排名与偏移技巧
  • 最新的网站开发技术如何彻底清除网站的网页木马
  • 网站建设涉及的标准WordPress记录访问者ip
  • 千锋教育介绍上海seo关键字推广
  • 乐清网站建设做网站799元公司做一个网站如何定位
  • 怎么给网站做关键词搜索有没有人做网站
  • 如何快速搭建简单SpringBoot项目网页
  • 如何应对网络舆情济南做seo排名
  • 三、Netty-Reactor反应器模式
  • 网站建设与管理课程企业信息查询网
  • 一小时速通Pytorch之自动梯度(Autograd)和计算图(Computational Graph)(二)
  • Qt开发——信号和槽
  • 常用的C语言编译器 | 各大C语言编译器特点与使用介绍
  • 网站查询ip地址seo优化排名百度教程
  • 【032】Dubbo3从0到1系列之triple协议场景
  • 全媒体网站的建设网站建设怎么样找客户快
  • 成都网站建设推广港哥公司网站开发建设什么会计科目
  • 企业品牌推广网站精品课程网站开发环境
  • CSP-S2024题解游记
  • 深度学习:数据增强(Data Augmentation)
  • 隆尧建设局网站深圳龙岗区地图
  • 【3DV 进阶-8】Hunyuan3D2.1 数据预处理详解- 水密化和采样 watertight and sample