当我有空值时,如何计算两个 PromQL 查询之间的差异?

How can I compute the difference between two PromQL queries when I have null values?

我在 Grafana 中有两个 PromQL 查询。

查询 1:max_over_time(counter{label="label1"}[5m])

查询 2:max_over_time(counter{label="label1"}[5m] offset 10m)

两个查询中的标签完全匹配,所以我认为我不需要使用 on() 函数。 我想计算这些查询之间的差异......

查询 3:max_over_time(counter{label="label1"}[5m]) - max_over_time(counter{label="label1"}[5m] offset 10m)

查询 3 returns 大部分正确的结果向量。例如,如果查询 1 的结果向量在第 i 个位置有一个条目,值为 1500,而查询 2 的结果向量在第 i 个位置有一个条目,值为 1000。那么第 i 个结果向量在查询 3 中的位置变为 1500-1000= 500.

但是当查询 1 的值为 1000 且查询 2 的值为 null(格式为 0)时,结果变为 1000 - null = null。

在这种情况下,我希望结果为 1000。我试图将所有空值转换为零,但根据我所读的内容,Prometheus 似乎已经将空值视为零。我也尝试过使用 vector(0):

(max_over_time(counter{label="label1"}[5m]) or vector(0)) - (max_over_time(counter{label="label1"}[5m] offset 10m) or vector(0))

但这不会改变结果。

这是从 Grafana 的查询检查器获得的所有三个查询的结果子集。

Correct results for the difference query

当存在非空值时,我得到了差异查询的正确结果。但是,一旦出现空值,就无法再计算差异。

Incorrect difference values when there are null values. 1000-null should be 1000 not null.

我非常感谢一些有用的提示。提前致谢。

试试这个查询:

sum(max_over_time(counter{label="label1"}[5m]) or vector(0)) - sum(max_over_time(counter{label="label1"}[5m] offset 10m) or vector(0))

就 vector(0) 曾经起作用的程度而言(我不相信它在这种情况下会起作用),它仅在整个数据集为空时才起作用。例如,如果查询 1 returns 数据,比如说,3 个不同的 pods 和查询 2 returns 数据,仅针对其中 1 个 pods(因为其他 2只是按比例放大),那么 pods 2 和 3 的数据将为空,导致减法也导致 pods 2 和 3 为空。使用 vector(0) 不会有任何效果,因为数据 returned for pod 1。我找不到 built-in 方法来强制减法将偏移数据中的所有空值视为0. 但是,这可以通过从自身减去 non-offset 数据并将其与偏移数据进行 OR 运算以强制它 return 0 来实现,对于所有存在 [=16= 的情况的偏移数据] 数据:

(max_over_time(counter{label="label1"}[5m]) -
   (max_over_time(counter{label="label1"}[5m] offset 10m) OR 
      (max_over_time(counter{label="label1"}[5m]) -
       max_over_time(counter{label="label1"}[5m])))