Prometheus/PromQL 减去两个仪表指标

Prometheus/PromQL subtract two gauge metrics

我有来自两个不同实例的这个量表指标 "metric_awesome"。 我想做的是从实例二中减去实例一,就像这样

metric_awesome{instance="one"} - metric_awesome{instance="two"}

很遗憾,结果集为空。有没有人经历过这个?

这里的问题是标签不匹配。你想要的是:

metric_awesome{instance="one"} - ignoring(instance) metric_awesome{instance="two"}

如果有人搜索这个想要执行此操作的一对多减法,请查看 group_right 除了之前写的内容。

metric_awesome{instance="one"} - ignoring(instance) group_right metric_awesome{job="compare-instances"}

另见 Prometheus dokumentation

默认情况下,Prometheus 按以下方式执行 a - b

  1. a查询选择所有时间序列。
  2. b查询选择所有时间序列。
  3. 它在 ab 处搜索具有相同标签集的时间序列对。
  4. 它计算找到的具有相同标签集的对中时间序列之间的差异。

有关详细信息,请参阅 these docs

metric_awesome{instance="one"} - metric_awesome{instance="two"} returns 为空结果,因为 - 左侧的所有匹配时间序列都包含 instance="one" 标签,而 instance="one" 左侧的所有时间序列- 的右侧包含 instance="two" 标签。此处没有具有相同标签集的时间序列对。

可以使用 on()ignoring()group_left()group_right() 修饰符更改此行为。

例如,metric_awesome{instance="one"} - ignoring(instance) metric_awesom{instance="two"} 指示在搜索具有相同标签的时间序列对时忽略 instance 标签。当 - 一侧的多个时间序列与另一侧的单个时间序列匹配时,这可能会导致 multiple-to-one 匹配。在这种情况下,默认情况下 Prometheus returns 错误。这可以通过向 - 运算符添加 group_left()group_right() 修饰符来解决:

metric_awesome{instance="one"}
  - ignoring(instance) group_left()
metric_awesome{instance="two"}

metric_awesome{instance="one"}
  - ignoring(instance) group_right()
metric_awesome{instance="two"}

有关这些修饰符的更多详细信息,请参阅 these docs