向量匹配是什么
两个向量做算术运算时,PromQL 要按标签把两侧对应起来:默认要求标签集完全一致。on 指定只用哪些标签匹配,ignoring 指定忽略哪些标签,group_left 与 group_right 处理一对多或多对一的场景。匹配不上时结果为空,这是「两个表达式单独都有数据、相除却为空」的常见原因。
基本信息
| 默认行为 | 标签集完全一致才匹配 |
|---|---|
| on(...) | 只按指定标签匹配 |
| ignoring(...) | 忽略指定标签后匹配 |
| group_left | 左侧多、右侧一的场景 |
| group_right | 右侧多、左侧一的场景 |
| 常见症状 | 两侧有数据但相除结果为空 |
典型使用场景
- 计算错误率:错误数除以总数,按 instance 或 route 对齐
- 把实例信息附加到指标上(group_left 引入节点名)
- 用 ignoring 忽略一侧多余标签,让两个来源的指标可以相除
- 多对一场景下把聚合后的比率贴回每条原始序列
- 排查查询为空时,先单独跑两侧表达式确认标签集差异
- 跨数据源关联同一业务实体(实例、渠道、集群)
典型场景
典型场景
# 标签不一致时用 on 指定匹配键
sum by (instance) (rate(http_requests_total{code=~"5.."}[5m]))
/ on (instance) sum by (instance) (rate(http_requests_total[5m]))
# 多对一:把节点信息附到实例指标上(group_left)
sum by (instance) (rate(http_requests_total[5m]))
* on (instance) group_left(node) count by (instance, node) (up == 1)
# 忽略多余标签后用 ignoring 匹配
metric_a / ignoring (pod) metric_b修饰符对照
| 写法 | 含义 | 使用场景 |
|---|---|---|
| on (labels) | 只按这些标签匹配 | 两侧标签维度不同 |
| ignoring (labels) | 忽略这些标签 | 一侧标签更多 |
| group_left | 左侧一对多 | 把附加信息贴在左边 |
| group_right | 右侧一对多 | 较少使用,注意方向 |
向量匹配出错的典型表现:两个表达式单独都有数据,相除后为空;先检查两侧标签集差异,再看匹配修饰符。
on 会丢弃未列出的标签:输出只剩指定维度,如果后续还要按其他维度聚合,聚合层级要提前设计。
group_left 一侧应是「多」的一方,写反会报错或得到错乱结果;报错信息里通常会指出匹配不唯一。
忘记写 on/ignoring 时按全部标签匹配,两侧只要有一个标签差异就无法匹配,这是新写表达式最常见的失败原因。