2. Prometheus 基础回顾:架构、数据模型与 PromQL 基础查询

在深入集群升级治理与租户隔离蓝图的异常检测之前,必须重新夯实 Prometheus 的核心基础。本章将聚焦 Prometheus 的宏观架构、核心数据模型以及 PromQL 基础查询语法,为后续的日志关联与根因定位提供坚实的度量基石。

2.1 Prometheus 整体架构

Prometheus 采用经典的“拉取(Pull)”模式采集指标,配合告警与可视化组件,形成完整的可观测性闭环。下图展示了其核心组件与数据流向:

Prometheus 核心架构图 Prometheus 核心架构 被监控目标 (Jobs / Exporters) /metrics 端点 服务发现 (k8s / consul) Prometheus Server Retrieval (拉取) TSDB (存储) HTTP API / PromQL Alertmanager Grafana (可视化) 告警接收 (邮件/钉钉/PagerDuty) 核心拉取模型 Server 主动从目标 /metrics 拉取数据
架构要点: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
PromQL 查询逻辑流程 PromQL 查询逻辑流程 原始时间序列 (Metric + Labels) 标签过滤 ({job="api", ...}) 范围/函数计算 (rate[5m], increase) 聚合操作 (avg by, topk) 最终查询结果 (Instant Vector) 查询示例 topk(3, avg(rate( http_requests_total[5m])) by (instance))

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 导致图表断点。