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