PromQL 如何在一个查询中"关联"两个指标?
PromQL 没有 SQL 式 JOIN,但可以用算术运算 + on/ignoring 标签匹配,或 group_left/group_right 修饰符把两个指标按标签对齐后合并计算。本文给出对齐计算的完整写法与典型场景。
Prometheus 没有 JOIN 关键字,关联两个指标靠"向量匹配":用算术运算符连接两个指标,再用 on()/ignoring() 指定按哪些标签对齐,需要携带额外标签时加 group_left。
场景一:两个指标相除算比率
# 错误率 = 错误数 / 总请求数(标签完全相同时直接相除)
sum(rate(http_errors_total[5m])) by (service)
/ sum(rate(http_requests_total[5m])) by (service)
两边都 by (service) 聚合后标签集一致,Prometheus 自动按标签配对计算。
场景二:标签不完全一致——on / ignoring
# 只按 instance 对齐,忽略其他标签差异
app_memory_bytes / on(instance) node_memory_bytes
on(a, b):只用列出的标签做匹配;ignoring(x, y):用除列出外的所有标签匹配。
场景三:把信息标签带过来——group_left
# 给 up 附加上 app_version_info 里的 version 标签
up * on(instance) group_left(version) app_version_info
group_left/group_right 解决"多对一"匹配,并把 info 类指标的额外标签合并进结果——这是查"哪个版本的服务挂了"这类问题的标准写法。
观测云对照
观测云 DQL 支持跨指标的组合运算与标签对齐,查询界面中可直接对多个指标做四则运算与比率计算;对运维更友好的是平台内置的错误率、饱和度等常用复合指标,多数场景免手写。
常见问题(FAQ)
Q:两边序列数对不上会怎样? 匹配不上的序列被丢弃;多对多直接报错——用 group_left/right 明确方向。
Q:group_left 后面的括号里写什么? 需要从右侧指标带过来的标签名列表;留空表示只做多对一匹配不带标签。