如何查询大于值的普罗米修斯数据但包含系列向量中的所有数据?

How can I query prometheus data greater than value but include all data in series vector?

我认为这张图片说明了一切

我想在 Prometheus 中查询一个值大于 .5 的系列,但将较低的值包括在系列中以便图表完整。 这些是 Gauge 指标,范围从 0-1(十进制 percent/ratio) 我希望图表中的所有线条都完整。 当前查询

avg_over_time((failure_percentage > .5)[10m:])

我试过自连接和分组都没有成功。

据我所知,不可能 return 使用 PromQL 超过给定值的时间序列的所有数据点。

但这可以通过 MetricsQL:

with (q = failure_percentage) q if ((q > 0.5) default 0)

可以创建 WITH template function return 超过给定阈值的时间序列的所有点:

with (
  f(q, threshold) = q if ((q > threshold) default 0)
)
f(failure_percentage, 0.5)

在 prometheus slack 上的一些人的帮助下,我使用一种连接技巧解决了这个问题

avg_over_time(failure_percentage[10m]) * ( (failure_percentage > 0.5) ^0 )

用户 viq 的原始评论(完整的上下文和解释)

I wonder.... a drity trick that comes to mind is something like

 metric * ( (metric > 0.5) ^ 0)

Since for multiplication to work both sides need to exactly match on labels, so you'll get only the results that match what's on the right, right (I think) should give you only results that match the condition, and ^0 should make the value always be 1, so you're getting in effect metric * 1 maaaaybe, untested

现在可以借助 PromQL @ modifier

首先,对于每个系列,我们希望获得绘图间隔内的最大值。为此,我们将利用 @ end() 修饰符来获取最后一个评估间隔的值。我们必须将间隔设置为与绘图相同的大小,以确保我们获得所有显示值的最大值。

max_over_time((failure_percentage)[10m:] @ end())
max_over_time((failure_percentage)[$__range:] @ end()) (in Grafana to be more dynamic)

然后我们将这些扁平系列分成两组:使用 >bool 运算符将高于 0.5 阈值的那些转换为 1,将低于阈值的那些转换为 0。并且只保留前一个 == 1.

max_over_time((failure_percentage)[10m:] @ end()) >bool 0.5 == 1

最后我们使用 * 运算符(因为乘以 1 是 noop)将所选系列与原始系列连接起来。

failure_percentage * (max_over_time((failure_percentage)[10m:] @ end()) >bool 0.5 == 1)

Grafana pannel example