Prometheus 数据模型
Prometheus 的数据模型是整个监控体系的基础。与关系型数据库的表结构不同,Prometheus 采用 时序数据模型:每个数据点由指标名、标签集合、时间戳、样本值四元组唯一确定。这种模型的设计目标是支持高效的多维查询。
理解 Prometheus 数据模型,是写出正确 PromQL 查询、避免常见陷阱的前提。很多 PromQL 的「诡异」行为,实际上是数据模型设计的结果。
数据结构详解
Prometheus 的每个时序(Time Series)由以下部分组成:
指标名(Metric Name):描述被测量数据的名称,格式为 [a-zA-Z_:][a-zA-Z0-9_:]*。好的指标名应该自解释,如 http_requests_total、node_memory_Bytes_available。Prometheus 推荐使用「领域_子领域_单位」的三段式命名。
标签(Labels):描述数据维度的键值对集合,格式为 label_name="label_value"。标签是 Prometheus 多维数据模型的核心——同一个指标名加上不同的标签值,代表不同维度的数据。例如,http_requests_total{method="GET", status="200"} 和 http_requests_total{method="POST", status="500"} 是两个不同的时序。
样本(Sample):每个时序在某个时间点的具体数值,由样本值(float64)和时间戳(int64,毫秒精度)组成。样本是时序数据的实际载体。
指标类型与数据特性
Prometheus 在客户端库层面区分四种指标类型(Counter、Gauge、Histogram、Summary),但在服务端存储层面,所有类型最终都表现为一组样本。
Counter 类型表现为:时序 ID + 多个(时间戳 → 累计值)对。每次 increase() 或 rate() 计算,实际上是对两个样本值做差值。
Histogram 类型表现为:一组带有 le="边界" 标签的时序。每个 le 标签代表一个 Bucket 的上界,加上一个 _sum 和 _count 时序。查询 P99 延迟时,PromQL 需要对 histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) 进行计算。
Summary 类型表现为:_count 和 _sum 时序,加上带分位数标签的时序(quantile="0.5")。Summary 的分位数是客户端预计算的,无法在服务端进行聚合或修正。