OpenObserve中的PromQL标签匹配

编程语言 2026-07-12

使用OpenObserve及其Collector,我得到一个名为 system_filesystem_usage 的指标。

该指标带有一个标签state,其取值为used、free或 reserved。我对 "reserved" 不感兴趣,但我想用 "used" 和 "free" 来计算使用率的百分比。由于用于计算的数值来自多行/事件,我猜这可能属于PromQL标签匹配(PromQL label matching) 的情形。我尝试了:

system_filesystem_usage{state="used"}
  / (system_filesystem_usage{state="used"} + system_filesystem_usage{state="free"})
  * 100

但即便是像 system_filesystem_usage{state="used"} + system_filesystem_usage{state="free"} 这样的更简单表达式,在OpenObserve中也不会产生任何结果。我到底错在哪儿?

解决方案

PromQL不能在state标签不同(used与 free)时匹配指标。你的查询失败,因为它试图对具有不同标签集合的时间序列进行运算。

作为解决方案,你可以使用聚合按公共标签分组(不包含state):

(
  sum by (device, mountpoint, host_name) (system_filesystem_usage{state="used"})

    /

  sum by (device, mountpoint, host_name) (system_filesystem_usage{state=~"used|free"})

  ) * 100

这会按设备/挂载点/主机计算文件系统使用百分比。sum by() 会在state标签上进行聚合,因此分子和分母具有匹配的标签集合,PromQL可以进行除法。
备选方案(如果你想要保留除state之外的所有标签):

  (
    sum without (state) (system_filesystem_usage{state="used"})
    /
    sum without (state) (system_filesystem_usage{state=~"used|free"})
  ) * 100
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章