Prometheus指标采集架构与PromQL查询语言实战指南

Prometheus监控体系架构与数据模型解析

Prometheus是云原生监控的事实标准,采用拉取式(Pull)指标采集、时序数据库本地存储、PromQL查询语言三大核心组件。数据模型以时间序列为单位,每条序列由指标名称和一组键值对标签唯一标识。这种标签模型天然支持多维度聚合查询——按实例、服务、集群、环境等维度灵活筛选和分组。

Prometheus的拉取模式与传统的Push模式相比,优势在于服务发现机制自动感知目标变化,无需在客户端配置推送地址;目标挂掉后Prometheus自动标记stale不再写入,避免脏数据。劣势是拉取间隔决定了数据精度上限,不适合亚秒级监控场景。默认scrape_interval=15s,生产环境根据业务需求调整为5s或10s。

四种指标类型与Exporter采集实战

Prometheus定义四种指标类型:Counter(只增计数器,如请求总数)、Gauge(可增可减仪表盘,如CPU使用率)、Histogram(直方图,对观测值采样并统计分布,如请求延迟)、Summary(分位数摘要,客户端计算分位数)。Counter类型必须用rate()或increase()函数计算变化速率,直接展示原始值没有意义。

Exporter是Prometheus生态的指标采集插件。node_exporter采集主机CPU、内存、磁盘、网络指标;mysqld_exporter采集MySQL运行状态;redis_exporter采集Redis实例信息。自定义业务指标推荐使用Prometheus官方客户端库直接埋点:

from prometheus_client import Counter, Histogram, start_http_server

REQUEST_COUNT = Counter(
    'http_requests_total',
    'Total HTTP requests',
    ['method', 'endpoint', 'status']
)

REQUEST_LATENCY = Histogram(
    'http_request_duration_seconds',
    'HTTP request latency',
    ['method', 'endpoint'],
    buckets=[0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0]
)

def handle_request(method, endpoint):
    REQUEST_COUNT.labels(method=method, endpoint=endpoint, status=200).inc()
    with REQUEST_LATENCY.labels(method=method, endpoint=endpoint).time():
        pass

start_http_server(9090)

Histogram比Summary更适合生产环境——Histogram的分位数在服务端通过histogram_quantile()函数计算,支持跨实例聚合,而Summary在客户端预计算分位数后无法再聚合。当需要计算全局P99时,Histogram是唯一选择。

PromQL查询语言核心语法与常用模式

PromQL支持即时查询(instant query)和范围查询(range query)。基础查询语法:指标名称直接查询所有序列;花括号标签筛选;正则匹配。范围向量用方括号指定时间窗口。

常用查询模式:

# QPS计算
rate(http_requests_total{job="api-server"}[5m])

# 按维度聚合
sum by (endpoint) (rate(http_requests_total{job="api-server"}[5m]))

# P99延迟
histogram_quantile(0.99, sum by (le, endpoint) (rate(http_request_duration_seconds_bucket[5m])))

# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))

# 容量预测
predict_linear(node_filesystem_avail_bytes[1h], 3600 * 24)

# 同比环比
rate(http_requests_total[5m]) / rate(http_requests_total[5m] offset 1w)

rate()和irate()的区别:rate计算范围窗口内的平均速率,适合图表展示趋势;irate取最近两个采样点的瞬时速率,对突发变化更敏感但噪声大。告警规则推荐用rate,实时看板可用irate。

Recording Rule预计算与告警规则配置

高频Dashboard查询和复杂聚合表达式反复执行会拖慢Prometheus。Recording Rule将常用查询结果预先计算存为新指标,Dashboard直接查询预计算指标即可。配置示例:

groups:
  - name: api_server_recording
    interval: 30s
    rules:
      - record: api:request_rate:5m
        expr: sum by (endpoint) (rate(http_requests_total{job="api-server"}[5m]))
      - record: api:error_rate:5m
        expr: |
          sum by (endpoint) (rate(http_requests_total{status=~"5.."}[5m]))
          / sum by (endpoint) (rate(http_requests_total[5m]))

告警规则同样在rules文件中配置,alert字段指定告警名称,for字段控制持续时长阈值:

groups:
  - name: api_server_alerts
    rules:
      - alert: APIHighErrorRate
        expr: api:error_rate:5m > 0.05
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "API错误率超过5%"

告警通过Alertmanager路由到不同通知通道,支持分组、抑制、静默等策略避免告警风暴。Prometheus+Alertmanager+Grafana三件套构成完整的监控闭环:Prometheus采集存储,Grafana可视化,Alertmanager告警通知。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-zhi-biao-cai-ji-jia-gou-yu-promql-cha-xun-yu-yan/

(0)
小编小编
上一篇 7小时前
下一篇 7小时前

相关推荐