如何在PromQL中获得最少两个指标?

时间:2019-05-02 11:00:05

标签: prometheus promql

我正在寻找类似于SQL的LEAST()函数的内容。
由于存在二进制运算符(以及明确定义的匹配行为),因此人们期望也会有最小/最大,但找不到此类函数。

我知道使用正则表达式(即min(__name__=~"a|b"))是可以实现的,但是如果可能的话,希望避免此类黑客入侵。

2 个答案:

答案 0 :(得分:0)

我很确定这是最有效的方法。如果要避免使用正则表达式,可以将其编写为:

a < b or b

但是用这种方法计算可能会更昂贵。 (当然,除非您直接使用记录规则,而不是直接使用min(a)min(b)。也许即使那样,您也必须自己对其进行基准测试。)

答案 1 :(得分:0)

这里需要问的问题是如何比较两个向量?

标量是可比的 - 但向量一般不是。 如果您想比较它们,您必须定义可以衡量它们的数学指标。

一个人需要有一组可比较的元素来确定它们中的最小值。 这就是为什么 Prometheus 中的 min 函数只有一个参数而不是更多。这个参数实际上是一个可比较元素的列表。

例如你可以试试这个:

  1. 首先执行以下操作:
(count(up{squad=~"XYZ"}) by(env))

对我来说,结果集是这样的(更重要的是它们是可比的):

{env="dev"}         61
{env="preprod"}     39
{env="prod"}        39

然后当我执行这个:

max((count(up{squad=~"XYZ"}) by(env)))

我得到了结果:

{}              61

这是预期的。

以上将返回具有最多可达实例的环境 - 因为在最大值之前我们做了聚合(计数函数),它返回与其他标量值相当的标量值 - 代表其他环境中的实例数。