Prometheus 监控基础:架构、数据模型、指标类型与 PromQL 入门
在深入蓝绿发布与回滚策略之前,必须建立坚实的 Prometheus 监控基础。本章将系统梳理 Prometheus 的核心架构、数据模型、指标类型以及 PromQL 查询语言的基础用法,为后续的发布监控与自动化回滚判定提供理论支撑。
2.1 Prometheus 整体架构
Prometheus 是一个开源的系统监控和告警工具包,其核心设计理念是“拉取(Pull)”模式。理解其架构组件是进行监控配置和故障排查的前提。
架构要点: 在蓝绿发布场景中,我们通常会在新版本(Green)环境部署完成后,通过 Prometheus 主动拉取新环境的业务指标,与旧版本(Blue)环境进行实时对比,以此作为发布是否成功的判定依据。
2.2 数据模型
Prometheus 将所有采集到的数据存储为时间序列(Time Series)。每个时间序列由指标名称(Metric Name)和一组标签(Labels)唯一标识。
| 组件 | 说明 | 示例 |
|---|---|---|
| 指标名称 | 描述被监控样本的一般特征,如 http_requests_total |
http_requests_total |
| 标签 | 键值对形式,用于对时间序列进行维度划分 | {method="GET", endpoint="/api/v1/users"} |
| 样本 | 实际的时间序列数据点,包含时间戳和值 | @timestamp 1234567890 => 1024 |
一个完整的时间序列标识如下:
<metric_name>{<label_name1>="<label_value1>", <label_name2>="<label_value2>"}
示例:
http_requests_total{method="POST", handler="/api/deploy", instance="green-svc:8080"}
关键理解: 标签是 Prometheus 数据模型的灵魂。在蓝绿发布中,我们可以通过为不同版本的服务实例打上不同的标签(如
version="blue" 和 version="green"),从而在 PromQL 中精确区分和对比两个版本的指标。
2.3 指标类型
Prometheus 客户端库提供了四种核心指标类型,理解它们对于编写正确的监控规则至关重要。
| 指标类型 | 特点 | 典型应用场景 |
|---|---|---|
| Counter | 只增不减的计数器,重启后归零 | 请求总数、错误总数、任务完成数 |
| Gauge | 可增可减的数值,反映当前状态 | CPU 使用率、内存使用量、当前连接数 |
| Histogram | 对观测值进行分桶统计,可计算分位数 | 请求延迟分布、响应大小分布 |
| Summary | 类似 Histogram,但由客户端计算分位数 | 预定义分位数(如 P99)的请求延迟 |
发布监控注意: 在评估新版本发布是否正常时,Gauge 类型指标(如错误率、延迟)通常用于实时告警;Counter 类型指标(如请求总量)需要结合
rate() 函数计算速率后使用;Histogram 是衡量用户体验(如 P99 延迟)的首选类型。
2.4 PromQL 入门
PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,用于实时聚合和分析时间序列数据。以下是在蓝绿发布场景中最常用的 PromQL 操作。
2.4.1 即时查询与范围查询
- 即时查询(Instant Query): 返回查询时间点的最新样本值。
- 范围查询(Range Query): 返回指定时间范围内的所有样本值。
# 即时查询:查看当前 green 环境的请求总数
http_requests_total{version="green"}
# 范围查询:查看过去 5 分钟内 green 环境的请求速率
rate(http_requests_total{version="green"}[5m])
2.4.2 常用函数
| 函数 | 作用 | 发布场景示例 |
|---|---|---|
rate() |
计算 Counter 类型指标在指定时间窗口内的每秒平均增长率 | rate(http_requests_total{version="green"}[1m]) |
increase() |
计算 Counter 类型指标在指定时间窗口内的增量 | increase(http_requests_total{version="green"}[5m]) |
avg() |
计算所有时间序列的平均值 | avg(rate(http_requests_total{version="green"}[1m])) |
histogram_quantile() |
从 Histogram 指标中计算分位数 | histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{version="green"}[5m])) |
2.4.3 蓝绿对比查询实战
假设我们为 Blue 和 Green 环境分别打了标签 version="blue" 和 version="green",以下查询可以实时对比两个环境的健康状态:
# 对比两个环境的 5 分钟错误率
rate(http_requests_total{status=~"5..", version="green"}[5m])
/
rate(http_requests_total{version="green"}[5m])
rate(http_requests_total{status=~"5..", version="blue"}[5m])
/
rate(http_requests_total{version="blue"}[5m])
# 对比两个环境的 P99 延迟
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{version="green"}[5m]))
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{version="blue"}[5m]))
实战技巧: 在自动化回滚脚本中,我们可以将上述 PromQL 查询结果与预设的阈值(如错误率 > 1% 或 P99 延迟 > 500ms)进行比较,一旦新版本指标超出阈值,立即触发回滚操作。