在问题 #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
将相同,就像您提到的示例一样。