如何在 PromQL 中获得两个指标中的最小值?

Posted

技术标签:

【中文标题】如何在 PromQL 中获得两个指标中的最小值?【英文标题】:How to get the minimum of two metrics in PromQL? 【发布时间】:2019-09-20 21:18:44 【问题描述】:

我正在寻找类似于 SQL 的 LEAST() 函数的东西。 由于存在二元运算符(以及定义明确的匹配行为),因此人们会期望也会有 min/max,但找不到这样的函数。

我知道使用正则表达式(即min(__name__=~"a|b"))可以实现这一点,但如果可能的话,我希望避免这种黑客攻击。

【问题讨论】:

使用MetricsQL 可以使用min(a, b) 完成。我不确定 PromQL 是否可行。 【参考方案1】:

我很确定这是最有效的方法。如果你想避免正则表达式,你可以把它写成:

a < b or b

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

【讨论】:

我不明白这个表达式怎么会给出最少的(a,b) 抱歉,表述有误。现在修好了。您根本不需要 min 运算符。 min 将从值向量中生成单个值,这可能不是您想要的(除非您的两个指标中的每一个都只有一个实例,在这种情况下它会碰巧起作用)。 表达式的工作方式是,对于每个标签组合(例如job="foo",instance="bar"job="foo",instance="baz" 等),它将比较ab 的值。如果a 更小,您将获得它的值。如果b 更小,则表达式a &lt; b 不会为该特定标签组合返回任何内容,但or b 将返回b 的值。 a &lt; b 怎么会返回一个而不是布尔值? RTFM: prometheus.io/docs/prometheus/latest/querying/operators/…【参考方案2】:

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

标量具有可比性——但向量通常不具有可比性。 如果你想比较它们,你必须定义可以衡量它们的数学指标。

为了确定其中的最小值,需要有一组可比较的元素。 这就是为什么 Prometheus 中的 min 函数只有一个参数。这个参数实际上是一个可比较元素的列表。

例如你可以试试这个:

    首先执行以下操作:
(count(upsquad=~"XYZ") by(env))

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

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

然后当我执行此操作时:

max((count(upsquad=~"XYZ") by(env)))

我得到了结果:

              61

这是预期的。

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

【讨论】:

以上是关于如何在 PromQL 中获得两个指标中的最小值?的主要内容,如果未能解决你的问题,请参考以下文章

在 Prometheus/PromQL 中合并/加入两个指标

在单个 promql 查询中需要两个 Prometheus 指标值

PromQL - 如何获得结果值之间的间隔

Prometheus/PromQL 减去两个量规指标

Prometheus的PromQL纪要

如何在 PromQL 中将零值(向量(0)与度量值合并