大家好!今天我们将深入探讨Prometheus查询语言(PromQL)中两个非常重要但容易混淆的关键字:on()和ignoring()。它们在执行向量(vector)间操作时,决定了以哪些标签作为匹配依据。为了编写准确的查询,清晰理解它们之间的区别至关重要!

🎯 on(): “只看这些标签进行匹配!”
on()是一个关键字,它指示Prometheus只对指定标签列表完全匹配的时间序列数据执行操作。所有未在on()中明确提及的其他标签在匹配过程中将被完全忽略。
on()的工作方式
- 显式指定:直接、明确地指定用于匹配的标签。
- 白名单方式:类似于“只允许此列表中的标签,其余的不用管”的方式。
示例场景 📝
假设我们有以下两个指标:
- http_requests_total{method=”GET”, path=”/api/users”, instance=”app-1″}
- http_requests_in_progress{method=”GET”, path=”/api/users”, instance=”app-1″}
在这里,我们希望根据method和path计算正在进行的请求的比例。我们不想考虑instance标签。这时就可以使用on()。
http_requests_in_progress
/ on(method, path)
http_requests_total
此查询对method和path标签值完全匹配的数据执行除法运算。即使instance标签不同,也会被忽略,从而得到我们想要的结果。
🙈 ignoring(): “除了这些标签,其他都匹配!”
ignoring()与on()的概念正好相反。它指示Prometheus对除了指定标签列表之外的所有其他标签都匹配的时间序列数据执行操作。
ignoring()的工作方式
- 例外指定:直接指定在匹配中要忽略的标签。
- 黑名单方式:类似于“忽略此列表中的标签,但所有其他标签都必须匹配”的方式。
示例场景 📝
在与上述相同的情况下,我们来尝试使用ignoring()。我们需要只忽略instance标签,而其他所有标签(method、path)都必须匹配。
http_requests_in_progress
/ ignoring(instance)
http_requests_total
此查询查找除了instance标签之外的所有其他标签(method、path)都匹配的数据,并执行操作。结果与使用on(method, path)得到的结果相同。
🤔 on() vs ignoring(),何时使用?
| 类别 | on() | ignoring() |
| 概念 | 仅匹配明确指定的标签 (白名单) | 忽略明确指定的标签进行匹配 (黑名单) |
| 优点 | 查询意图明确简洁 | 即使添加新标签,也可能较少需要修改查询 |
| 推荐场景 | 当需要根据少数特定标签进行分组或操作时 | 当只想排除随环境变化的特定标签(如instance、pod)时 |
通常,我们倾向于忽略区分单个实例的唯一标签(如instance或pod),并根据与服务逻辑相关的标签(如method、path、status_code等)执行操作。在这种情况下,使用ignoring(instance, pod)可能更灵活和方便。
反之,如果想从众多标签中仅根据两三个特定标签(如job、handler)进行分组,那么on(job, handler)将是一个更直观、更明确的选择。
结论 ✨
on()和ignoring()是PromQL中控制向量匹配的强大工具。
- on()明确指定要包含的标签。🎯
- ignoring()明确指定要排除的标签。🙈
准确理解这两个关键字的区别,并根据实际情况选择合适的关键字,可以帮助您编写更准确、更灵活的监控查询!
发表回复