跳转至

Prometheus:指标采集与查询

Prometheus 以带标签的时间序列保存数值指标,周期性抓取目标的 HTTP Metrics Endpoint,并使用 PromQL 查询、聚合和生成规则。它适合系统、容器和服务的趋势、比例、延迟与告警,不适合保存完整日志或计费明细。

Exporter / Application / Kubernetes
  → /metrics
  → Prometheus:Service Discovery → Scrape → TSDB
  → PromQL / Recording Rules / Alerting Rules
  → Grafana / Alertmanager / Remote Write

数据模型与指标类型

一条时序由指标名和完整标签集合唯一确定:

http_server_requests_total{service="order",method="GET",status="200"} 10240
类型 含义 查询要点
Counter 只增或重启归零的累计值 rate()/increase() 看变化
Gauge 可增可减的瞬时值 CPU 温度、连接数、队列长度
Histogram 按 bucket 统计分布,同时有 count/sum histogram_quantile() 算近似分位数
Summary 客户端计算分位数 跨实例难聚合,先确认使用边界

不要把用户 ID、订单号、原始 URL、异常消息做标签。标签组合数就是活跃时序数,高基数会推高内存、磁盘和查询成本。

抓取配置

global:
  scrape_interval: 30s
  evaluation_interval: 30s

scrape_configs:
  - job_name: linux
    static_configs:
      - targets: ["10.0.0.11:9100", "10.0.0.12:9100"]
        labels:
          environment: production

生产中常通过 Kubernetes 服务发现、Consul 或文件服务发现动态获取目标。Relabel 用于修改发现标签和筛选 Target;Metric Relabel 在抓取后丢弃/修改样本,配置不当会造成静默丢数。

promtool check config /etc/prometheus/prometheus.yml
curl -s http://127.0.0.1:9090/-/ready

常见 Exporter

来源 方式
Linux node_exporter
HTTP/TCP/DNS/TLS 黑盒探测 blackbox_exporter
Java/Spring Micrometer + Actuator /actuator/prometheus
Kubernetes kube-state-metrics、kubelet/cAdvisor
数据库/中间件 产品原生指标或专用 Exporter

Exporter 运行正常不代表采集正常,还要在 Prometheus Targets 检查 UP、最后抓取时间和错误。

PromQL 基础

# Target 是否可抓取
up == 0

# 每秒请求率
sum by (service) (rate(http_server_requests_total[5m]))

# 5xx 比例
sum by (service) (rate(http_server_requests_total{status=~"5.."}[5m]))
/
sum by (service) (rate(http_server_requests_total[5m]))

# P95 延迟(经典 Histogram)
histogram_quantile(
  0.95,
  sum by (le, service) (rate(http_server_request_duration_seconds_bucket[5m]))
)

# 主机可用内存比例
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes

rate() 窗口过短会因样本不足抖动;聚合时保留告警和定位需要的标签。平均值会掩盖长尾,应结合 P95/P99、最大值和分布。

Recording Rule 与 Alerting Rule

复杂且频繁查询可预计算为 Recording Rule,告警规则则产生告警状态:

groups:
  - name: service.rules
    rules:
      - record: service:http_requests:rate5m
        expr: sum by (service) (rate(http_server_requests_total[5m]))
      - alert: TargetDown
        expr: up == 0
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.job }} / {{ $labels.instance }} 无法采集"
promtool check rules /etc/prometheus/rules/*.yml

Prometheus 计算规则,Alertmanager 负责去重、分组、路由、抑制、静默和通知。告警应有负责人、Runbook 和可执行动作。

Remote Write 与高可用

Prometheus 本地 TSDB 适合独立可靠运行;需要长期保留、多集群汇聚或横向查询时,可 Remote Write 到 VictoriaMetrics 等后端。两台 Prometheus 高可用抓取会产生两份带不同 replica 标签的数据,查询端需要正确去重,不能假设共享磁盘即可高可用。

排障顺序

  1. Target 是否在服务发现结果中。
  2. Prometheus 到目标的 DNS、网络、TLS、认证是否正常。
  3. /metrics 是否响应及时、格式是否正确。
  4. Relabel 是否把目标或样本丢掉。
  5. TSDB/Remote Write 队列是否报错或积压。
  6. 查询时间、标签和数据源是否正确。

官方参考:Prometheus OverviewPromQLRules