1. PromQL 基础回顾:理解时间序列、标签、指标类型与核心数据类型
PromQL(Prometheus Query Language)是 Prometheus 生态的核心查询语言。掌握 PromQL 的基础概念,是后续进行查询优化与告警规则性能调优的前提。本节将系统梳理时间序列、标签、指标类型以及 PromQL 的四种核心数据类型。
1.1 时间序列与标签
Prometheus 存储的所有数据本质上都是时间序列(Time Series)。一个时间序列由一组指标名称(Metric Name)和一组标签(Labels)唯一标识。
- 指标名称:描述被监控对象的含义,例如
http_requests_total、node_cpu_seconds_total。 - 标签:键值对,用于对时间序列进行维度划分。例如
method="GET"、status="200"、instance="localhost:9090"。
关键理解:每个唯一的标签组合都会创建一个独立的时间序列。标签基数过高(例如
user_id 作为标签)会导致性能问题,这是后续调优章节的重点。
时间序列的格式如下:
<metric_name>{<label_name1>="<label_value1>", <label_name2>="<label_value2>", ...}
示例:
http_requests_total{method="POST", handler="/api/v1/order", status="200"}
1.2 指标类型(Metric Types)
Prometheus 客户端库提供四种核心指标类型,每种类型在 PromQL 中的语义和常用函数有所不同。
| 指标类型 | 描述 | 典型场景 | 常用 PromQL 函数 |
|---|---|---|---|
| Counter | 只增不减的计数器,重启后归零 | 请求总数、错误总数、任务完成数 | rate(), increase(), irate() |
| Gauge | 可增可减的瞬时值 | CPU 使用率、内存使用量、当前连接数 | avg(), min(), max(), delta() |
| Histogram | 对观测值进行分桶统计,提供 _bucket、_count、_sum 序列 |
请求延迟分布、响应大小分布 | histogram_quantile(), rate() |
| Summary | 类似 Histogram,但由客户端计算分位数,提供 _count、_sum、_quantile 序列 |
预计算的分位数(如 p99 延迟) | 直接查询 _quantile 序列 |
性能提示:Histogram 的
_bucket 序列数量由桶个数决定,过多的桶会增加存储和查询开销。Summary 的分位数由客户端预计算,无法在查询时动态调整分位数值。
1.3 PromQL 四种核心数据类型
PromQL 表达式求值后返回四种数据类型之一。理解这些类型是正确使用 PromQL 的基础。
- Instant Vector(瞬时向量):一组时间序列,每个序列包含一个最新样本值。例如
node_cpu_seconds_total返回所有 CPU 的当前值。 - Range Vector(范围向量):一组时间序列,每个序列包含一段时间范围内的多个样本值。通过
[时间范围]定义,例如node_cpu_seconds_total[5m]。 - Scalar(标量):一个简单的数字浮点值。例如
1、3.14,或通过scalar()函数转换得到。 - String(字符串):一个简单的字符串值,目前使用较少。
核心区别:Instant Vector 用于当前值查询和告警规则;Range Vector 用于计算速率、增长量等聚合函数;Scalar 常用于算术运算或阈值比较。
下表总结了四种数据类型的特征与使用场景:
| 数据类型 | 包含样本数 | 时间范围 | 典型用法 |
|---|---|---|---|
| Instant Vector | 每个序列 1 个 | 当前时刻 | 告警规则、仪表盘即时值 |
| Range Vector | 每个序列多个 | 指定时间窗口 | rate(), increase(), avg_over_time() |
| Scalar | 1 个 | 无 | 算术运算、阈值比较 |
| String | 1 个 | 无 | 极少使用,用于标签值 |
1.4 核心数据类型转换关系图
下图展示了 PromQL 四种核心数据类型之间的转换关系与常见操作路径:
1.5 指标类型与 PromQL 数据类型的关系
不同的指标类型在 PromQL 中通常与特定的数据类型和函数配合使用。下表总结了常见组合:
| 指标类型 | 常用 PromQL 数据类型 | 典型查询示例 |
|---|---|---|
| Counter | Range Vector → Instant Vector | rate(http_requests_total[5m]) |
| Gauge | Instant Vector | node_memory_MemAvailable_bytes |
| Histogram | Range Vector → Instant Vector | histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) |
| Summary | Instant Vector | http_request_duration_seconds_summary{quantile="0.99"} |
实战要点:Counter 类型必须使用
rate() 或 increase() 转换为速率后才有意义;Gauge 类型可以直接使用原始值;Histogram 的 _bucket 序列需要配合 rate() 和 histogram_quantile() 计算分位数。
1.6 标签选择器与时间序列过滤
在 PromQL 中,通过标签选择器可以精确过滤时间序列。标签选择器支持四种匹配模式:
- =:精确匹配,例如
method="GET" - !=:不匹配,例如
method!="POST" - =~:正则匹配,例如
method=~"GET|POST" - !~:正则不匹配,例如
method!~"DELETE|PUT"
示例:
http_requests_total{method="GET", status=~"2[0-9][0-9]"}
性能警告:正则匹配(
=~ 和 !~)比精确匹配消耗更多计算资源。在告警规则和高频查询中,应优先使用精确匹配,避免使用高开销的正则表达式。
通过本节的学习,你应该能够清晰区分时间序列的组成、四种指标类型的语义差异,以及 PromQL 四种核心数据类型的用途与转换关系。这些基础知识将贯穿整个课程,为后续的查询优化和告警规则调优打下坚实基础。