Promethius、group_left 和“on”与“ignoring”

Promethius、group_left 和“on”与“ignoring”

问题 #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(不仅在上面的引用中,而且在各种文档和示例中也是如此)?

答案1

我认为该评论中的关键词是shareable,或者换句话说可重复使用的规则。这意味着您在使用ignoring与相比时(通常)会保留更多标签on,并且结果(通常)是保留更多原始标签的规则,因此可以在更多场景中重复使用。

想象一下这些时间序列:

instance_cpu_time_ns{app="lion", proc="web", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="elephant", proc="worker", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="turtle", proc="api", rev="4d3a513", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="fox", proc="widget", rev="4d3a513", env="prod", job="cluster-manager"}
...

ignoring(rev)与 相同的查询相比, 的查询会忽略结果中的所有其他标签on(app)

on但是,如果您将它们与互斥的标签集一起使用,则和的结果ignoring将相同,就像您提到的示例一样。

相关内容