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

在深入服务目录资源优化之前,必须牢固掌握 Prometheus 的核心基础。本章将系统回顾 Prometheus 的宏观架构、核心组件职责、数据模型(Metric、Label、Sample)以及 PromQL 基础语法,为后续的监控数据采集、指标分析与资源建模打下坚实的技术地基。

2.1 Prometheus 整体架构与核心组件

Prometheus 采用经典的拉取(Pull)模式采集监控数据,整体架构由多个职责清晰的组件构成。下图展示了核心组件及其数据流转关系:

Prometheus 核心架构与数据流 Exporter / 应用 暴露 /metrics 端点 服务发现 K8s / Consul / 文件 Prometheus Server 检索器 (Retrieval) TSDB 存储引擎 HTTP API / 查询引擎 Alertmanager 告警路由 / 静默 Grafana / 可视化 仪表盘 / 图表 Pushgateway 批处理任务指标 核心拉取模式:Prometheus Server 定期从 Exporter / 应用拉取指标,服务发现动态管理抓取目标。 Pushgateway 用于无法直接拉取的短生命周期任务。

2.2 核心组件职责速览

组件 职责 关键说明
Prometheus Server 核心服务,包含检索器、TSDB 存储、查询引擎、HTTP API 负责拉取、存储、查询所有指标数据
Exporter 将第三方系统指标转换为 Prometheus 格式 如 node_exporter、blackbox_exporter
Service Discovery 动态发现抓取目标(Target) 支持 Kubernetes、Consul、文件等多种机制
Alertmanager 处理告警,进行去重、分组、路由、静默 支持多种接收器(Email、PagerDuty、Webhook)
Pushgateway 接收短生命周期任务的指标推送 用于批处理、CronJob 等场景
Grafana / 可视化 数据可视化与仪表盘 通过 PromQL 查询 Prometheus 数据
架构要点:Prometheus 的 Pull 模式天然适合微服务和容器化环境。服务发现机制使得新服务上线后自动被纳入监控范围,无需手动配置每个目标,这是实现大规模资源监控自动化的基础。

2.3 数据模型:Metric、Label、Sample

Prometheus 的数据模型是理解一切监控逻辑的起点。所有监控数据都由三个核心元素构成:

  • Metric(指标名):描述被监控对象的一般特征,例如 http_requests_total、node_cpu_seconds_total。指标名只能包含字母、数字、下划线和冒号。
  • Label(标签):键值对,用于对指标进行多维度的细分。例如 method="GET"、status="200"、instance="web-01"。标签是 Prometheus 数据模型的核心灵活性来源。
  • Sample(样本):一个具体的时间序列数据点,包含一个 float64 值和一个毫秒精度的时间戳。

一个完整的时间序列由 Metric Name + Label 集合唯一标识。例如:

http_requests_total{method="POST", handler="/api/v1/orders", instance="10.0.0.1:8080"}

上述标识符代表一个独立的时间序列,每个时间点上的值就是一个 Sample。

2.4 数据模型核心概念对比

概念 定义 示例 作用
Metric 指标名称 node_memory_MemAvailable_bytes 定义监控的物理量
Label 标签键值对 env="prod", region="us-east" 提供多维度过滤与聚合
Sample 时间戳 + 值 t=1700000000, v=2048 记录具体数据点
Time Series Metric + Labels 组合 cpu_usage{host="web1", core="0"} 唯一标识一条数据流
关键理解:在 Prometheus 中,Label 是数据建模的核心工具。通过合理设计标签,你可以将同一指标按不同维度(如服务名、实例、区域、版本)进行切片和聚合,这正是服务目录资源优化中按服务、团队、环境进行资源归因的基础。

2.5 PromQL 基础语法

PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言。掌握 PromQL 基础语法是进行监控数据分析、告警规则编写和资源利用率计算的前提。

2.5.1 四种核心数据类型

类型 说明 示例
Instant Vector 某一时刻的一组时间序列 node_cpu_seconds_total
Range Vector 一段时间范围内的一组时间序列 node_cpu_seconds_total[5m]
Scalar 一个简单的浮点数值 1024
String 字符串值(使用较少) "prod"

2.5.2 基础查询示例

以下是一些常用的 PromQL 查询模式:

# 查询所有 HTTP 请求总数
http_requests_total

# 查询特定 handler 的请求数(标签过滤)
http_requests_total{handler="/api/v1/orders"}

# 查询多个标签组合
http_requests_total{method="POST", status=~"5.."}

# 查询过去 5 分钟的请求速率(rate 函数)
rate(http_requests_total[5m])

# 计算 CPU 使用率(avg by 聚合)
avg by (instance) (rate(node_cpu_seconds_total{mode!="idle"}[5m])) * 100

2.5.3 常用 PromQL 函数速查

函数 作用 典型场景
rate() 计算 Counter 类型指标的每秒平均增长率 请求速率、错误速率
irate() 计算 Counter 类型指标的瞬时增长率 敏感于突增的监控
increase() 计算 Counter 类型指标在时间范围内的增量 总请求数变化
avg() 聚合操作:计算平均值 平均 CPU 使用率
sum() 聚合操作:求和 总内存使用量
topk() 返回前 K 个时间序列 找出资源消耗最高的服务
histogram_quantile() 从 Histogram 计算分位数 P99 延迟
常见误区:对 Counter 类型指标直接使用 avg() 或 sum() 而不加 rate() 或 increase(),得到的值会随时间累积而不断增长,无法反映当前的真实速率。在资源监控中,始终优先使用 rate() 或 irate() 来获取可比较的利用率数据。

2.6 PromQL 查询执行流程

理解 PromQL 查询在 Prometheus Server 内部的执行路径,有助于排查查询性能问题和优化资源监控表达式。

PromQL 查询执行流程 用户输入 PromQL 词法 / 语法解析 查询计划生成 TSDB 数据读取 结果 Range Vector 查询会从 TSDB 读取指定时间窗口内的所有样本点 聚合操作(如 sum by)在查询引擎层完成,减少数据传输量

2.7 本章小结

  • Prometheus 采用 Pull 模式,核心组件包括 Server、Exporter、Service Discovery、Alertmanager、Pushgateway。
  • 数据模型由 Metric + Label + Sample 构成,Label 是实现多维数据建模的关键。
  • PromQL 支持 Instant Vector 和 Range Vector 两种核心数据类型,rate()、avg()、sum() 是资源监控中最常用的函数。
  • 掌握 PromQL 基础是后续进行服务目录资源利用率计算、容量规划和成本分析的前提。