如何在 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"
等),它将比较a
和b
的值。如果a
更小,您将获得它的值。如果b
更小,则表达式a < b
不会为该特定标签组合返回任何内容,但or b
将返回b
的值。
a < 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 中合并/加入两个指标