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 四种核心数据类型之间的转换关系与常见操作路径:

PromQL 核心数据类型转换关系 Instant Vector 当前时刻值 Range Vector 时间窗口样本 Scalar 单一数值 String 字符串值 [5m] 范围选择 rate() / increase() scalar() 算术运算返回 Instant Vector label 值提取 说明: • 实线为常用转换路径 • 虚线为较少使用路径 • 箭头方向表示转换方向 常见操作: • rate() 需要 Range Vector • 告警规则用 Instant Vector • 阈值比较用 Scalar

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 四种核心数据类型的用途与转换关系。这些基础知识将贯穿整个课程,为后续的查询优化和告警规则调优打下坚实基础。