在Issue #2204中,Prometheus 开发人员之一说:
...原则上,您应该倾向于
ignoring
生成on
通用的可共享规则...
我很困惑如何使用ignoring
会导致更通用的规则。例如,考虑一种情况,我们有一个设备的“信息”指标和几个统计信息,如下所示:
device_info{id="1", owner="coyote", project="acme"}
device_rx_bytes{id="1"}
device_tx_bytes{id="1"}
device_rx_errors{id="1"}
device_tx_errors{id="1"}
如果我想按项目获得接收率,我需要将device_rx_bytes
指标与相应的device_info
指标相关联。对我来说,这闻起来像一个 SQL 连接,我会写:
rate(device_rx_bytes[5m]) * on(id) group_left(project) device_info
这似乎是“通用的”,因为它只对用于分组id
的标签 ( ) 和我们想要传播到结果的标签( ) 做出假设project
。如果我正确理解了ignoring
运算符,则相应的表达式会更复杂,因为我需要从右侧列出左侧不存在的所有标签。就像是:
rate(device_rx_bytes[5m]) * ignoring(owner, project) group_left(project) device_info
那是对的吗?如果是,为什么ignoring
优先于on
(不仅在上面的引用中,而且在各种文档和示例中)?
我认为该评论中的关键字是
shareable
或换句话说可重用规则。这意味着您(通常)在使用时保留更多标签,结果ignoring
将on
(通常)成为一个规则,其中更多的原始标签保持不变,因此可以在更多场景中重复使用。想象一下这些时间序列:
ignoring(rev)
与具有 的相同查询相比,具有 的查询在结果中省略了所有其他标签on(app)
。但是,如果您将它们与互斥的标签集一起使用,则
on
and的结果将是相同的,就像您提到的示例一样。ignoring