2. Prometheus 基础回顾:架构、数据模型与 PromQL 入门
在深入服务目录资源优化之前,必须牢固掌握 Prometheus 的核心基础。本章将系统回顾 Prometheus 的宏观架构、核心组件职责、数据模型(Metric、Label、Sample)以及 PromQL 基础语法,为后续的监控数据采集、指标分析与资源建模打下坚实的技术地基。
2.1 Prometheus 整体架构与核心组件
Prometheus 采用经典的拉取(Pull)模式采集监控数据,整体架构由多个职责清晰的组件构成。下图展示了核心组件及其数据流转关系:
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 内部的执行路径,有助于排查查询性能问题和优化资源监控表达式。
2.7 本章小结
- Prometheus 采用 Pull 模式,核心组件包括 Server、Exporter、Service Discovery、Alertmanager、Pushgateway。
- 数据模型由 Metric + Label + Sample 构成,Label 是实现多维数据建模的关键。
- PromQL 支持 Instant Vector 和 Range Vector 两种核心数据类型,
rate()、avg()、sum()是资源监控中最常用的函数。 - 掌握 PromQL 基础是后续进行服务目录资源利用率计算、容量规划和成本分析的前提。