普罗米修斯即时向量与范围向量

sma*_*all 27 prometheus


关于即时向量和范围向量,我仍然不明白

即时向量 - 一组时间序列,每个时间序列包含一个样本,所有时间序列共享相同的时间戳。

范围向量 - 一组时间序列,其中包含每个时间序列随时间变化的一系列数据点。

我只能绘制一个即时向量。
当我在表达式中写入时,我得到即时向量:my_metric_name并且我看到没有时间戳的指标值。那么如何将其绘制成图表呢?如果它现在只有一个值。范围向量似乎更合乎逻辑,因为它具有每个时间戳的值(写作my_metric_name[5m]

你能向我解释一下我在这里不明白的这两个向量的外观/工作原理吗?

谢谢你!

zan*_*ngw 27

总结自

\n\n
\n
    \n
  • \xe2\x80\x99 是什么向量?\n
      \n
    • 由于 Prometheus 是一个时间序列数据库,因此所有数据都位于某个时间戳的上下文中。将时间戳映射到记录数据的序列称为时间序列
    • \n
    • 一组相关的时间序列称为向量
    • \n
    • 例如\n
        \n
      • http_requests_total是一个向量,表示服务接收到的 http 请求总数
      • \n
      • http_requests_total{code="200"}http_requests_total 指的是指定的整个时间序列集。通过附加 a {code="200"},我们\xe2\x80\x99 正在选择一个子集。
      • \n
      \n
    • \n
    \n
  • \n
  • 矢量类型\n
      \n
    • 即时向量- 一组时间序列,其中每个时间戳映射到该 \xe2\x80\x9cinstant\xe2\x80\x9d\n 处的单个数据点
        \n
      • http_requests_total想象一下在给定时间戳评估表达式。http_requests_total 是一个即时向量选择器,它为具有度量名称 的任何时间序列选择最新样本http_requests_total。更具体地说,“最新”意味着“最多 5 分钟且不陈旧” “最新”意味着相对于评估时间戳因此,此选择器只会为在评估时间戳之前最多 5 分钟具有样本的系列生成结果,并且评估时间戳之前的最后一个样本不是过时标记(将系列标记为在某个时间点终止的显式方法) Prometheus TSDB 中的特定时间)。
      • \n
      \n
    • \n
    • 范围向量- 一组时间序列,其中每个时间戳映射到 \xe2\x80\x9crange\xe2\x80\x9d 数据点,记录了过去的一些持续时间。\n
        \n
      • 范围向量主要用于图形,您希望在图形中显示给定时间范围内的 PromQL 表达式。范围查询的工作方式与许多完全独立的即时查询完全相同,这些查询在给定时间范围内的后续时间步长进行评估。当然,这是在幕后高度优化的,在这种情况下,Prometheus 实际上并没有运行许多独立的即时查询。
      • \n
      \n
    • \n
    \n
  • \n
  • 差异\n
      \n
    • 可以绘制即时向量图表;范围向量不能。这是因为绘制图表需要在 y 轴上显示 x 轴上每个时间戳的数据点。即时向量对于每个时间戳都有一个值,而范围向量则有多个值。为了绘制指标图表,未定义1如何显示时间序列中单个时间戳的多个数据点。
    • \n
    • 可以比较即时向量并对其进行算术运算;范围向量不能。这也是由于比较和算术运算符的定义方式造成的。对于每个时间戳,如果我们有多个值,我们不知道如何添加 1 或将它们与具有类似性质的另一个时间序列进行比较。
    • \n
    • 计数器的范围向量。我们采用即时向量并附加我们的持续时间[15m]。这部分称为范围选择器,它将瞬时向量转换为范围向量。然后,我们使用像increase这样的函数,它可以有效地从范围末尾的数据点中减去范围开头的数据点。increase(http_requests_total{code="200",handler="/api/v1/query"}[15m])代表it is the increase in the total number of requests over the past fifteen minutes
    • \n
    \n
  • \n
\n


val*_*ala 20

VictoriaMetrics作者在这里。这是一个类似 Prometheus 的监控系统,它支持类似 PromQL 的查询语言 - MetricsQL

instant vector在普罗米修斯中, 和确实range vector是令人困惑的术语。这就是 VictoriaMetrics 文档中避免使用这些术语的原因。Prometheus 查询语言 - PromQL - 提供各种功能,可分为两组:

  • 函数,仅接受instant vector. 此类函数可以分为以下子组:
    • 变换函数,它针对每个输入时间序列单独应用各种变换。例如,abs()
    • 标签操作函数,修改输入时间序列的标签和指标名称。例如,label_replace()
    • 聚合函数,将多个输入时间序列聚合到指定的输出时间序列组中。例如,sum()。有趣的是,聚合函数是aggregation operators在 Prometheus 中命名的 - 请参阅这些文档
  • 函数,仅接受range vector. VictoriaMetrics 将此类函数命名为汇总函数,因为它们根据方括号中指定的给定后视窗口(也称为滑动窗口)上的输入时间序列样本来计算结果。例如,计算过去 5 分钟内时间序列rate(http_requests_total[5m])的平均每秒增长率。http_requests_total

从用户的角度来看, 和 之间的唯一区别是instant vectorrange vector是通过在方括号中添加后视窗口range vector来构造的。instant vector例如,http_requests_total是一个instant vector,而http_requests_total[5m]是一个range vector。我想说,该range vector语法只是PromQL 中汇总函数的语法糖。例如,rate(m[d])可以写为rate(m, d),例如,后视窗口d可以作为单独的参数传递给汇总函数。


sha*_*359 6

当我开始学习Prometheus时,我也有类似的问题。

首先要注意的是,Prometheus 表达式语言评估为四种类型

  1. 字符串
  2. 标量
  3. 即时向量
  4. 范围向量

即时向量与范围向量在我下面链接的资源中得到了很好的解释。

Prometheus HTTP API有两种类型

  1. 即时查询 - API 返回给定评估时间的单个值
  2. 范围查询 - API 根据时间范围和步骤返回多个值

通过 Prometheus UI 查询时,结果可以表示为tablegraph

如果您检查从 Prometheus UI 进行的 API 调用,您会注意到

  • 显示表中数据的查询将到达即时查询端点
  • 在图表中显示数据的查询将到达范围查询端点

这会产生四种组合:

查询返回即时向量(通过即时查询 API 端点) 在此输入图像描述

查询返回即时向量(通过范围查询 API 端点)

当我们从表视图切换到图形视图时,Prometheus UI 会调用范围查询端点。范围查询端点本质上只是运行一系列即时查询的语法糖。该端点可以轻松可视化/绘制时间序列图表。

如果范围查询端点不存在,则必须进行多个即时查询调用才能生成特定时间段的图表。

在此输入图像描述

API 调用中的步骤(秒)决定应获取多少个值。(显然这里可能的最高分辨率取决于抓取间隔)。step=2 表示在这两个时间戳之间,请为我们提供每秒的值。

查询返回范围向量(通过即时查询 API 端点)

在此输入图像描述

查询返回范围向量(通过范围查询 API 端点)

失败并出现错误“执行查询时出错:范围查询的表达式类型“范围向量”无效,必须是标量或即时向量”

在此输入图像描述

您无法直接绘制范围向量输出的图表,因为它会在图表中的每个分辨率步骤为每个系列生成多个输出点。此外,不能保证向量中的每个元素在给定范围内具有相同数量的样本。

学习资源

要了解更多信息,请参阅以下我发现非常有用的资源


小智 5

您需要熟悉另外两个相关术语:

  • 即时查询:当您向 Prometheus 查询单个时间戳上的表达式结果时。例如用于警报。
  • 范围查询:当您向 Prometheus 查询具有开始和结束时间戳的表达式时。例如,用于在 Grafana 中绘图。

因此,您的表达式中可以包含许多即时和范围向量,并作为即时或范围查询发送到 Prometheus 。


小智 1

  • 我看到没有时间戳的指标值:首先回答这个问题,结果表中没有显示时间戳,因为我们已经存在“评估时间”字段 供参考
  • 范围向量似乎更合乎逻辑,因为它具有每个时间戳的值:范围向量在 2 个时间戳的范围之间工作,因此当您将 [5m] 应用于指标时,它会占用该范围的 now-5m 并显示该时间范围内的结果,并且由于该时间范围内可能有超过 1 个结果,因此会显示时间戳。

这个视频帮助我理解了同样的问题,希望它也能帮助你。

https://training.robustperception.io/courses/204997/lectures/3156025