2. Prometheus 基础回顾:架构、数据模型与 PromQL 基础查询
在深入集群升级治理与租户隔离蓝图的异常检测之前,必须重新夯实 Prometheus 的核心基础。本章将聚焦 Prometheus 的宏观架构、核心数据模型以及 PromQL 基础查询语法,为后续的日志关联与根因定位提供坚实的度量基石。
2.1 Prometheus 整体架构
Prometheus 采用经典的“拉取(Pull)”模式采集指标,配合告警与可视化组件,形成完整的可观测性闭环。下图展示了其核心组件与数据流向:
架构要点:Prometheus Server 通过服务发现动态获取目标列表,定期从目标的
/metrics 端点拉取指标数据,存入本地 TSDB。用户通过 PromQL 查询数据,Grafana 用于可视化,Alertmanager 负责处理告警。
2.2 数据模型:Metric & Label
Prometheus 的数据模型是其强大查询能力的基础。所有数据都由 指标(Metric) 和 标签(Label) 唯一标识。
| 概念 | 说明 | 示例 |
|---|---|---|
| Metric Name | 描述被监控对象的含义,如 http_requests_total |
node_cpu_seconds_total |
| Label | 键值对,用于维度区分。同一指标名+不同标签组合构成不同时间序列 | {job="api-server", instance="10.0.0.1:9090", method="GET"} |
| Sample | 时间序列中的具体数据点,包含时间戳和值 | @timestamp 1234567890 => 1024 |
| Time Series | 同一 Metric + 同一 Label 组合的样本集合 | node_cpu_seconds_total{cpu="0", mode="idle"} |
关键理解:在 Prometheus 中,
http_requests_total{status="200", method="POST"} 和 http_requests_total{status="500", method="POST"} 是两个完全独立的时间序列。标签是进行租户隔离、蓝绿分组、异常样本筛选的核心维度。
2.3 指标类型
Prometheus 客户端库提供四种核心指标类型,适用于不同的监控场景:
- Counter(计数器): 只增不减,适用于累计值,如请求总数、错误总数。典型查询:
rate(http_requests_total[5m]) - Gauge(仪表盘): 可增可减,适用于瞬时值,如内存使用量、CPU 温度。典型查询:
node_memory_MemAvailable_bytes - Histogram(直方图): 对观测值进行分桶统计,适用于延迟、请求大小。典型查询:
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) - Summary(摘要): 类似 Histogram,但由客户端计算分位数,适用于已知分位数场景。典型查询:
http_request_duration_seconds{quantile="0.95"}
| 类型 | 典型场景 | PromQL 常用函数 |
|---|---|---|
| Counter | 请求总数、错误总数 | rate(), increase() |
| Gauge | 内存、CPU、连接数 | avg(), max(), min() |
| Histogram | 请求延迟、响应大小 | histogram_quantile() |
| Summary | 已知分位数的延迟 | 直接查询 quantile 标签 |
2.4 PromQL 基础查询语法
PromQL(Prometheus Query Language)是数据检索的核心工具。掌握基础语法是进行异常检测的第一步。
2.4.1 即时向量与范围向量
- Instant Vector(即时向量): 查询某个时间点的最新样本。例如:
node_cpu_seconds_total返回所有 CPU 时间序列的最新值。 - Range Vector(范围向量): 查询一段时间范围内的样本。例如:
node_cpu_seconds_total[5m]返回过去 5 分钟内每个时间序列的所有样本。
2.4.2 标签匹配器
使用 {} 对标签进行过滤,支持四种匹配模式:
| 匹配器 | 含义 | 示例 |
|---|---|---|
= |
精确匹配 | http_requests_total{method="GET"} |
!= |
不等于 | http_requests_total{method!="POST"} |
=~ |
正则匹配 | http_requests_total{method=~"GET|POST"} |
!~ |
正则排除 | http_requests_total{method!~"DELETE|PUT"} |
2.4.3 常用函数与操作符
以下是在集群升级和租户隔离场景中最高频使用的 PromQL 元素:
rate(): 计算 Counter 类型指标在指定时间窗口内的每秒平均增长率。例如:rate(http_requests_total[5m])increase(): 计算 Counter 类型指标在指定时间窗口内的增量。例如:increase(http_requests_total[1h])avg()/max()/min(): 聚合操作,常与by子句配合。例如:avg(rate(http_requests_total[5m])) by (job)topk()/bottomk(): 取前 K 或后 K 个时间序列。例如:topk(3, max(node_memory_MemAvailable_bytes) by (instance))- 算术操作符:
+,-,*,/,%。例如:(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes
2.5 基础查询实战示例
以下是一些在集群升级场景中常用的基础查询,帮助你快速上手:
场景:监控某租户(tenant="blue")在升级期间的请求错误率。
# 1. 查询特定租户的请求总数(Counter)
http_requests_total{tenant="blue"}
# 2. 计算过去5分钟的每秒请求速率
rate(http_requests_total{tenant="blue"}[5m])
# 3. 计算错误率(假设 status 标签 >= 500 表示错误)
sum(rate(http_requests_total{tenant="blue", status=~"5.."}[5m]))
/
sum(rate(http_requests_total{tenant="blue"}[5m]))
# 4. 按实例聚合,找出错误率最高的前3个实例
topk(3,
sum(rate(http_requests_total{tenant="blue", status=~"5.."}[5m])) by (instance)
/
sum(rate(http_requests_total{tenant="blue"}[5m])) by (instance)
)
注意:在 PromQL 中,除法操作必须确保分母不为零。可以使用
or 操作符或 __name__ 标签进行防御性查询,避免出现 NaN 导致图表断点。