当前位置: 代码迷 >> 综合 >> PromQL 数据模型
  详细解决方案

PromQL 数据模型

热度:110   发布时间:2023-09-30 10:12:23.0

数据模型

在开始学习 PromQL 的知识之前,我们先重新来熟悉下 Prometheus 的数据模型

PromQL 数据模型

Prometheus 会将所有采集到的样本数据以时间序列的方式保存在内存数据库中,并且定时保存到硬盘上。时间序列是按照时间戳和值的序列顺序存放的,我们称之为向量(vector),每条时间序列通过指标名称(metrics name)和一组标签集(labelset)命名。如下所示,可以将时间序列理解为一个以时间为 X 轴的数字矩阵: 

PromQL 数据模型 

时间序列中的每一个点称为一个样本(sample),样本由以下三部分组成:

  • 指标(metric):指标名和描述当前样本特征的标签集合
  • 时间戳(timestamp):一个精确到毫秒的时间戳
  • 样本值(value): 一个 float64 的浮点型数据表示当前样本的值

 如下所示:

PromQL 数据模型

 在形式上,所有的指标都通过如下格式表示:

<metric name>{<label name> = <label value>, ...}
  • 指标的名称可以反映被监控样本的含义(比如,http*request_total 表示当前系统接收到的 HTTP 请求总量)。指标名称只能由 ASCII 字符、数字、下划线以及冒号组成并必须符合正则表达式[a-zA-Z*:]a-zA-Z0-9\*:]\*
  • 标签(label)反映了当前样本的特征维度,通过这些维度 Prometheus 可以对样本数据进行过滤,聚合等。标签的名称只能由 ASCII 字符、数字以及下划线组成并满足正则表达式 [a-zA-Z_][a-zA-Z0-9_]*

注意:在 TSDB 内部,指标名称也只是一个特殊的标签,标签名为 __name__,由于这个标签在 PromQL 中随时都会使用,所以在使用 PromQL 查询的时候就被单独写在了标签列表前面了。另外像 method="" 这样的空标签在 Prometheus 种相当于一个不存在的标签,在 Prometheus 代码里面是明确地剥离了空标签的,并不会存储它们。 

每个不同的 metric_name和 label 组合都称为时间序列,在 Prometheus 的表达式语言中,表达式或子表达式包括以下四种类型之一:

  • 瞬时向量(Instant vector)一个时间序列,每个时间序列包含单个样本,它们共享相同的时间戳。也就是说,表达式的返回值中只会包含该时间序列中的最新的一个样本值。而相应的这样的表达式称之为瞬时向量表达式。(实时查询到的值,不是一个范围,只是一个样本值)PromQL 数据模型
  • 区间向量(Range vector)一组时间序列,每个时间序列包含一段时间范围内的样本数据,这些是通过将时间选择器附加到方括号中的瞬时向量(例如[5m]5 分钟)而生成的。PromQL 数据模型
  • 标量(Scalar):一个简单的数字浮点值。
  • 字符串(String):一个简单的字符串值。 

所有这些指标都是 Prometheus 定期从 metrics 接口那里采集过来的。采集的间隔时间的设置由 prometheus.yml 配置中的 scrape_interval 指定。最多抓取间隔为 30 秒,这意味着至少每 30 秒就会有一个带有新时间戳记录的新数据点,这个值可能会更改,也可能不会更改,但是每隔 scrape_interval 都会产生一个新的数据点。