Prometheus 监控系统:指标采集与 PromQL 查询

FreeGuideOnline 最新 2026-06-13

Prometheus 核心概念:从指标采集到 PromQL 查询

Prometheus 是一款开源的系统监控与报警框架,以多维数据模型和强大的PromQL 查询语言为核心。它通过拉取(Pull)方式主动采集目标的指标数据,并以时间序列的形式存储在本地,非常适合云原生与微服务架构。

本教程助你快速上手指标采集配置,并掌握 PromQL 基本查询技巧。


1. 数据模型:一切皆指标

Prometheus 将监控数据抽象为时间序列,每条序列由唯一标识符构成:

<metric_name>{<label>=<value>, ...}  <sample_value> @ <timestamp>

1.1 指标名称与标签

  • 指标名(Metric name):描述测量对象的本质,如 http_requests_total(HTTP 请求总数)。
  • 标签(Labels):键值对形式,为同一指标增加维度。例如 {method="GET", handler="/api", status="200"}
  • 组合示例http_requests_total{method="GET", handler="/api", status="200"} 1027

通过标签,可灵活地对数据进行过滤、聚合和分组,这是 Prometheus 强大查询能力的基础。

1.2 四种主要指标类型

  • Counter(计数器):只增不减的值,如请求数、错误数。重启后会被重置为 0,通常用 rate() 分析增速。
  • Gauge(仪表盘):可增可减的瞬时值,如内存使用量、当前线程数。
  • Histogram(直方图):对观测值进行预分区统计,如请求响应时间分布在 <0.1s0.1-0.2s……桶中,并提供总和与总数,用于计算百分位数。
  • Summary(摘要):在客户端直接计算分位数,比 Histogram 多提供精确的客户端分位值,但聚合能力弱。

2. 指标采集:让 Prometheus 找到你的数据

Prometheus 监控对象被称为Target。采集目标通常按Job分组管理。

2.1 拉取模式工作原理

  1. Prometheus Server 根据 prometheus.yml 中的 scrape_configs 定时向各 Target 的 /metrics 端点(默认)发起 HTTP GET 请求。
  2. 目标需暴露符合 Prometheus text-based exposition format 的指标数据(客户端库自动生成,或借助 Exporter 转换)。
  3. 拉取到的样本与元数据被打上 jobinstance 标签,存入本地时序数据库。

2.2 配置静态目标

最简配置示例(prometheus.yml):

global:
  scrape_interval: 15s     # 全局采集间隔

scrape_configs:
  - job_name: 'my-app'
    static_configs:
      - targets: ['localhost:8080']   # 应用指标暴露地址
        labels:
          env: 'dev'                  # 附加自定义标签

保存后重载 Prometheus,即可在 Targets 页面查看状态。

2.3 动态服务发现

云原生环境中 IP 多变,需动态发现目标:

  • Kubernetes 服务发现:基于 Pod、Service、Endpoints 等资源自动识别采集目标。
    - job_name: 'kubernetes-pods'
      kubernetes_sd_configs:
        - role: pod
      relabel_configs:
        - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
          action: keep
          regex: true
    
  • 其他常见方式:基于 Consul、DNS、文件等。

利用 relabel_configs 可在采集前修改标签,控制保留、丢弃或重写。

2.4 Exporter 生态

许多系统本身不暴露 Prometheus 格式指标,需使用 Exporter

Exporter 作用 监听端口示例
Node Exporter 收集 Linux 系统级指标(CPU、内存、磁盘等) 9100
Blackbox Exporter 探测 HTTP、TCP、DNS 等端点的可达性 9115
MySQL Exporter 数据库连接、查询等指标 9104
Kafka Exporter Consumer lag、分区状态等 9308

运行后将其配置为 Prometheus 捕获目标即可。


3. PromQL 查询语言快速上手

PromQL(Prometheus Query Language)是进行指标查询、聚合、分析和告警的灵魂。

3.1 即时查询与范围查询

  • 即时向量(Instant vector):当前最后时刻的一组时间序列。 http_requests_total → 返回每个标签组合最新值。
  • 范围向量(Range vector):回溯一段时间内所有样本的序列,供内置函数使用。 http_requests_total[5m] → 返回过去5分钟每个序列的全部样本。

直接在表达式浏览器中输入即时向量,可绘制当前值;但多数计算函数需要区间向量。

3.2 常用过滤与匹配符

  • 标签匹配
    • =:等于,如 http_requests_total{method="GET"}
    • !=:不等于
    • =~:正则匹配,如 {handler=~"/api/.*"}
    • !~:正则排除
  • 多标签组合:逗号分隔相当于 AND,如 {method="GET",status=~"2.."}

3.3 核心函数与实战

3.3.1 速率计算:rate() 与 irate()
  • rate(http_requests_total{job="my-app"}[5m])
    计算5分钟内每秒平均增长率,适合慢变化指标与长时区间趋势。
  • irate(http_requests_total{job="my-app"}[5m])
    基于区间最后两个样本计算瞬时速率,对快速变动更灵敏,适合高波动指标。
3.3.2 指标聚合:sum、avg、topk 等

聚合可将多个序列按维度合并:

  • sum(rate(http_requests_total[5m])) by (status)
    按 HTTP 状态码聚合每秒总请求数。
  • topk(3, avg(node_cpu_seconds_total{mode!="idle"}[1m]) by (instance))
    找出 CPU 使用率最高的前3个实例。
3.3.3 时间函数与处理
  • increase(http_requests_total[1h]):一小时内增量(考虑重置)。
  • delta(cpu_temp_celsius[5m]):5分钟内温度变化量(仅适用于 Gauge)。
  • histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
    计算 HTTP 请求持续时间的 P95,依赖 Histogram。
  • predict_linear(node_filesystem_free_bytes[1h], 4*3600)
    预测4小时后磁盘剩余空间,结果<0 时触发告警。

3.4 偏移与子查询

  • offset 修饰符:查看历史时刻。
    http_requests_total offset 1h 一小时的请求数快照。
  • 子查询 [<duration>:<resolution>]:对内层范围表达式执行更高阶计算。
    rate(http_requests_total[5m])[1h:1m]
    意思是先计算每个1分钟分片的5m速率,然后返回这一小时的历史速率序列。

3.5 实用查询示例

  • 请求成功率(按状态分类)
    sum(rate(http_requests_total{status=~"2.."}[5m])) by (job) 
    / 
    sum(rate(http_requests_total[5m])) by (job) * 100
    
  • 内存使用百分比
    (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
    
  • Kubernetes Pod CPU 利用率(占总 request)
    sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (pod) 
    / 
    sum(kube_pod_container_resource_requests{resource="cpu"}) by (pod) * 100
    

4. 查询调试与可视化

  • Prometheus 内置 UI:在 Graph 标签页可实时测试 PromQL,观察表格与图形。
  • Grafana 集成:使用 Prometheus 数据源,设定动态变量和重复面板,构建灵活仪表盘。
  • 记录规则(Recording rules):将复杂表达式预先计算为新的指标,加速后续查询与告警。
    groups:
      - name: example
        rules:
          - record: job:http_requests_total:rate5m
            expr: rate(http_requests_total[5m])
    
    之后直接用 job:http_requests_total:rate5m 即可。

5. 初学者最佳实践

  1. 标签命名规范:用 snake_case,避免魔术标签名(如少量固定名称),尽量复用标准维度。
  2. 避免基数爆炸:绝对不将用户ID、请求ID等高变化值作为指标标签。
  3. 合理设置采集间隔:通常15s或30s,与指标的波动特性匹配。
  4. 先计数,后平均:尽量用 Counter 累积原始事件,再通过 rate() 获取单位时间值,这比直接用 Gauge 平均更健壮。
  5. 多用记录规则:预聚合常用查询,防止 Grafana 每次刷新重算大量数据。

掌握指标采集配置与 PromQL 后,你已具备构建完整监控体系的核心能力。下一步可深入学习告警规则、长期存储集成(如 Thanos/Cortex)及集群扩展。