跨集群日志检索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 压缩)降低存储开销。
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))
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() 进行标签标准化,才能正确聚合。