如何在没有标签的情况下将 "sum()" 除以 "count()"

How to divide "sum()" by "count()" without labels

我有一些容器的 CPU 使用率(占各自容器实例的百分比),我想用这个值除以可用容器实例的数量。

此查询按预期为我提供了 CPU 百分比用法:

sum by (name) (
  rate(container_cpu_usage_seconds_total{$default, promstack_alias=~"$promstack_alias"}[$__rate_interval]) 
  * 100
)

这个查询只给我提供了实例数:

count(sum by (instance_id) (container_last_seen{$default, instance_state="running"}))

但我无法将它们组合起来。我想要的基本上是这样的:

sum by (name) (
  rate(container_cpu_usage_seconds_total{$default, promstack_alias=~"$promstack_alias"}[$__rate_interval]) 
  * 100
)
/
count(sum by (instance_id) (container_last_seen{$default, instance_state="running"}))

如果我除以一个数字,例如3,查询成功。我错过了什么?

在这里找到答案

关键是忽略带有 / ignoring(name) group_left 的现有标签(在我的例子中)。

Prometheus 提供了以下几种方式来划分带标签的时间序列和不带标签的时间序列:

  1. 通过将没有标签的时间序列包装到 scalar() 函数中:
sum by (name) (
  rate(container_cpu_usage_seconds_total{$default, promstack_alias=~"$promstack_alias"}[$__rate_interval]) 
  * 100
)
/
scalar(count(sum by (instance_id) (container_last_seen{$default, instance_state="running"})))

这可以根据 these rules.

进行标量除法
  1. 通过向 / 添加 on() group_left() 修饰符:
sum by (name) (
  rate(container_cpu_usage_seconds_total{$default, promstack_alias=~"$promstack_alias"}[$__rate_interval]) 
  * 100
)
/ on() group_left()
count(sum by (instance_id) (container_last_seen{$default, instance_state="running"}))

这会根据 these docs.

启用 many-to-one 匹配 / 运算符左侧和右侧的时间序列