有没有办法对范围向量执行即时向量运算?
例如,如果我们有
count_containers
并且我们想计算至少有一个的时间分数,我们可以尝试这样做:
avg(avg_over_time(count_containers[1h] > 0))
但这无法完成,因为
count_containers[1h]
是一个范围向量。是否可以对范围向量中的即时向量执行任何类型的 map(...)
运算?或者推迟从 count_containers
构建范围向量的方法?
有没有办法对范围向量执行即时向量运算?
不。普罗米修斯不允许这样的事情。
但是您可以使用子查询语法将范围选择器应用于除向量选择器之外的其他内容。所以在你的例子中它会是这样的。
avg(avg_over_time((count_containers > 0)[1h:15s]))
请注意,在这种情况下,您必须将
:
放在范围选择器中以指示子查询的使用。
在这个例子中,我使用了分辨率
15s
,以指示应每 15 秒窗口计算一次查询结果。但您可能希望根据需要的精度、抓取间隔等进行调整。此外,可以省略分辨率(同时保留 :
,如 [1h:]
):在这种情况下,evaluation_interval
的值将是使用过。
我们想要计算至少有一个的时间比例,我们可以尝试这样做:
您尝试的查询,即使支持,也不会产生您想要的结果。相反,当容器数量为正数时,它会计算平均容器数量。
要计算容器数量为正数的时间百分比,请使用以下
avg(avg_over_time( (count_containers > bool 0)[1h:15s] ))
如果容器数量为正,则表达式
count_containers > bool 0
将返回 1,否则返回 0。
如果您想计算过去一小时内
count_containers
为正数的时间份额,最好使用以下 PromQL 查询:
sum(sum_over_time((count_containers >bool 0)[1h:15s]))
/
sum(count_over_time(count_containers[1h:15s]))
此查询使用以下 PromQL 功能:
请注意,
avg(avg_over_time(...))
查询可能会返回意外结果,因为平均值的平均值可能不等于平均值。
附注上面的查询假设单个时间序列的原始样本之间的间隔等于15秒 - 请参阅上面查询中冒号后面方括号中的
15s
。这个区间在 Prometheus 生态系统中也称为 scrape_interval
。如果您的数据具有不同的抓取间隔,则应在上面的查询中调整方括号中的值。否则查询结果将不正确。
P.P.S。可以使用 MetricsQL 中的 share_gt_over_time 函数将查询简化为以下查询 - 我正在使用的类似于 PromQL 的查询语言:
share_gt_over_time(count_containets[1h], 0)