我正在寻找类似于 SQL 的 LEAST() 函数的东西。
由于存在二元运算符(以及定义明确的匹配行为),因此人们会期望也会有 min/max,但找不到这样的函数。
我知道使用正则表达式(即,min(__name__=~"a|b")
)可以实现这一点,但如果可能的话,我希望避免这种黑客攻击。
我正在寻找类似于 SQL 的 LEAST() 函数的东西。
由于存在二元运算符(以及定义明确的匹配行为),因此人们会期望也会有 min/max,但找不到这样的函数。
我知道使用正则表达式(即,min(__name__=~"a|b")
)可以实现这一点,但如果可能的话,我希望避免这种黑客攻击。
我很确定这是最有效的方法。如果你想避免正则表达式,你可以把它写成:
a < b or b
但以这种方式计算可能会更昂贵。(当然,除非您使用记录规则而不是min(a)
直接使用记录规则min(b)
。也许即使那样。您只需要自己进行基准测试。)
这里需要问的问题是如何比较两个向量?
标量具有可比性——但向量通常不具有可比性。如果你想比较它们,你必须定义可以衡量它们的数学指标。
需要有一组可比较的元素才能确定其中的最小值。这就是为什么min
Prometheus 中的函数只有一个论点。这个论点实际上是一个可比较元素的列表。
例如你可以试试这个:
(count(up{squad=~"XYZ"}) by(env))
对我来说,结果集看起来像这样(更重要的是这些是可比较的):
{env="dev"} 61
{env="preprod"} 39
{env="prod"} 39
然后当我执行这个:
max((count(up{squad=~"XYZ"}) by(env)))
我得到结果:
{} 61
这是预期的。
以上将返回具有最多可访问实例的环境 - 因为在最大值之前我们进行了聚合(计数函数),它返回的标量值与其他标量值相当 - 它表示其他环境中的实例数。