跨集群日志检索API与Prometheus监控集成 - 第2节

2.1 核心概念:Metric、Label 与 TSDB

Prometheus 的数据模型是理解其查询与存储的基础。三个核心概念构成了整个监控体系的骨架:Metric(指标)、Label(标签) 和 TSDB(时序数据库)。

2.1.1 Metric(指标)

Metric 描述被监控对象在某个时间点的具体数值特征,例如 HTTP 请求总数、CPU 使用率、队列深度。每个 Metric 由 指标名称 和一组 标签 唯一标识。

类型说明典型场景
Counter只增不减的累计值,重启归零请求总数、错误次数、任务完成数
Gauge可增可减的瞬时值CPU 温度、内存使用量、并发连接数
Histogram对观测值进行分桶统计,可计算分位数请求延迟分布、响应大小分布
Summary类似 Histogram,但由客户端直接计算分位数预定义分位数的延迟监控(如 p99)

2.1.2 Label(标签)

Label 是 Prometheus 数据模型的灵魂。每个 Metric 可以附加任意数量的键值对标签,用于多维度的数据筛选与聚合。例如:

http_requests_total{method="POST", endpoint="/api/login", status="200"}

标签使得同一个 Metric 名称下可以承载不同维度的数据,从而支持灵活的 PromQL 查询。

最佳实践: 标签基数(Label Cardinality)是 TSDB 性能的关键。避免在标签中存储高基数数据(如用户 ID、Email),否则会导致内存膨胀和查询缓慢。

2.1.3 TSDB(时序数据库)

Prometheus 内置的 TSDB 负责高效存储和压缩时序数据。其核心设计包括:

  • Block 结构: 数据按时间窗口(默认 2 小时)切分为独立的 Block,每个 Block 包含该时间窗口内的所有样本。
  • 倒排索引: 基于标签建立倒排索引,支持快速检索任意标签组合对应的时序数据。
  • 压缩与合并: 旧 Block 会被后台合并为更大的 Block,并应用压缩算法(如 Gorilla 压缩)降低存储开销。
Prometheus 核心数据模型 Metric(指标) http_requests_total Label(标签) {method="POST", status="200"} TSDB(时序库) Block + 倒排索引 数据模型关系说明 • Metric 名称 + Label 集合 = 唯一的时间序列(Time Series) • 每个时间序列由一组按时间排序的 (timestamp, value) 样本组成 • TSDB 通过倒排索引快速定位满足特定 Label 条件的所有时间序列 • 查询时先通过标签匹配缩小范围,再读取对应 Block 中的样本数据

2.2 PromQL 基础语法

PromQL(Prometheus Query Language)是 Prometheus 内置的函数式查询语言,用于实时聚合和分析时序数据。掌握 PromQL 是进行日志检索、跨集群查询和告警规则编写的前提。

2.2.1 数据类型

类型说明示例
Instant Vector一组时间序列在同一个时间戳上的样本值http_requests_total{status="200"}
Range Vector一组时间序列在一段时间范围内的样本值http_requests_total{status="200"}[5m]
Scalar一个简单的浮点数值1024
String字符串常量(当前仅用于某些函数)"production"

2.2.2 选择器(Selectors)

选择器用于从 TSDB 中筛选目标时间序列:

  • 精确匹配: = 标签值完全相等
  • 正则匹配: =~ 匹配正则表达式;!~ 排除正则匹配
  • 不等于: != 标签值不相等
# 精确匹配
http_requests_total{method="GET", status="200"}

# 正则匹配:所有以 /api 开头的 endpoint
http_requests_total{endpoint=~"/api/.*"}

# 排除特定值
http_requests_total{status!="500"}

2.2.3 操作符与聚合

PromQL 支持丰富的算术、比较和逻辑操作符,以及强大的聚合函数:

类别操作符/函数说明
算术+ - * / % ^对两个向量或标量进行运算
比较== != < > <= >=过滤或生成布尔值
逻辑and or unless向量集合运算
聚合sum() avg() min() max() count()按标签维度聚合
速率rate() irate() increase()计算 Counter 类型的变化率
实战案例: 计算过去 5 分钟内,每个 endpoint 的平均请求延迟(p50 近似):
histogram_quantile(0.5, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, endpoint))
PromQL 查询执行流程 1. 标签选择器 {method="POST"} 2. 时间范围 [5m] / offset 3. 操作符/函数 rate() / sum() 4. 结果向量 Instant/Range 查询执行说明 • 先通过标签选择器从倒排索引中定位匹配的时间序列集合 • 再根据时间范围(Range Vector)从对应 Block 中读取样本数据 • 最后应用操作符、聚合函数或速率计算,输出最终结果向量

2.2.4 常用函数速查

函数作用典型用法
rate()计算 Counter 在指定时间窗口内的每秒平均增长率rate(http_requests_total[5m])
irate()计算 Counter 在区间内最后两个样本的瞬时增长率irate(http_requests_total[5m])
increase()计算 Counter 在指定时间窗口内的增量increase(http_requests_total[1h])
histogram_quantile()基于 Histogram 计算分位数histogram_quantile(0.99, ...)
label_replace()对标签值进行正则替换,用于跨集群查询时统一标签label_replace(metric, "dc", "$1", "instance", "(.*)")
注意: 在跨集群查询场景中,不同集群的标签命名可能不一致(例如一个用 region,另一个用 dc)。此时需要借助 label_replace() 或 label_join() 进行标签标准化,才能正确聚合。