在PromQL中,如何使用<agg>_over_time()指定分辨率并防止插值

问题描述 投票:0回答:1

我需要编写一个查询来查找流量突然下降的情况,因此我尝试获取当前 10 分钟并将其与之前的几个 10 分钟存储桶进行比较。

这里我得到过去 1 小时内每 10 分钟总流量的 6 个值。看起来很简单:

sum(
  increase(
    istio_requests_total{destination_workload="service-v1", reporter="source"}[10m:10m]
  )
)

这会产生以下结果。请注意,我只得到 6 个没有插值的值,这正是我想要的。

Time                      Value
2023-08-25 14:50:00           5
2023-08-25 15:00:00           7
2023-08-25 15:10:00           8
2023-08-25 15:20:00           6
2023-08-25 15:30:00           9
2023-08-25 15:40:00           5

为了仅获取当前 10 分钟,我尝试了:

last_over_time(
  sum(
    increase(
      istio_requests_total{destination_workload="service-v1", reporter="source"}[10m:10m]
    )
  )[10m:10m]
)

但奇怪的是,插值又回来了,我得到了默认的 5 秒间隔:

Time                      Value
2023-08-25 14:47:10           5
2023-08-25 14:47:15           5
2023-08-25 14:47:20           5
[ ... as many 5 seconds as there are in an hour ]

我期望没有像第一个示例那样的插值,只有 1 个值:

Time                      Value
2023-08-25 15:40:00           5

我不能将总体时间范围更改为仅 10 分钟的原因是因为我需要这些其他值来获取除第一个存储桶之外的所有其他存储桶的平均值、最小值和最大值来构建基线。然后,我可以将当前 10 分钟时段与过去一小时每个 10 分钟时段的平均值进行比较,以检测突然变化,并确定当前 10 分钟是否低于最小 10 分钟值,以便警报将自行调节除非情况变得更糟。

这不会出现在 Grafana 中,因此不幸的是,任何 Grafana 解决方案都不起作用。

我如何获得 _over_time() 函数来遵守指定的 10m 分辨率,而不是在每 5 秒的间隔内插入该值?

interpolation resolution promql
1个回答
0
投票

您似乎对范围选择器中使用的分辨率有误解。如果用于返回范围向量,它实际上表现得像您期望的那样,但这种情况很少见,并且这种行为不会扩展到使用范围向量作为输入的函数的结果。

要每 10 分钟仅获得一个结果,您需要将适当的

step
参数 传递给您的请求(在本例中为
step=10m
)。

increase(something [10m:10m])
通常不会产生任何结果,因为
increase
需要至少 2 个点才能计算结果。另一方面,像
increase(something [10m:5m])
这样的东西预计会为每一步产生结果。因此,您通过最初的查询获得 6 分这一事实是一个幸运的巧合。

这里是不同方法的演示。请注意,前两张图每 14 秒就有一个值(默认值)。第三次——每 600 秒一次。最后一个不会产生任何东西(也许如果你幸运的话并在 10m 左右的时间内按下“执行”,它就会产生任何东西?我对此不确定)。


我相信你对

last_over_time
也有一个错误的观念。它用于在缺席期间“拉伸”最后看到的值。演示其功能此处

我不确定你在你的情况下想做什么,因为不清楚你打算如何使用,但通常是为了接收最后一个值(相对传递

time
参数,你不需要做任何事情特别:只需传递您的查询即可。(或者您可能想使用类似
@end()
之类的东西?)


关于

将当前 10 分钟时段与过去一小时每个 10 分钟时段的平均值进行比较,以检测突然变化,并确定当前 10 分钟是否低于 10 分钟最小值

如果您想查找当前 10 分钟内计数器的增量是否低于前 5 个 10 分钟窗口内的增量,您可以简单地使用以下查询:

increase(my_counter[10m])
 < increase(my_counter[10m]) offset 10m
 < increase(my_counter[10m]) offset 20m
 < increase(my_counter[10m]) offset 30m
 < increase(my_counter[10m]) offset 40m
 < increase(my_counter[10m]) offset 50m
© www.soinside.com 2019 - 2024. All rights reserved.