有没有办法在 PromQL 中执行类似 "left outer join" 的查询?

Is there a way to do a "left outer join" like query in PromQL?

我正在尝试使用两个应该描述相同实体的指标(共享一些标签,包括我可以用作 UUID 的标签),以便创建 alerts/dashboard 来提醒我一个实体报告一个指标而不是另一个指标。

例如,对于以下指标:

item_purchases{name="item1", count="5"}
item_purchases{name="item2", count="7"}

item_stock{name="item1", in_stock="1"}
item_stock{name="item2", in_stock="0"}
item_stock{name="item3", in_stock="1"}

我使用 item_stock 作为我的“事实来源”,并且我正在尝试编写一个查询 return:

item_stock{name="item3", ...} # I don't care about the other labels, just the name.

我已经有一个查询可以帮助我在某些条件下进行过滤(例如,如果某件商品已购买但没有库存,如“item2”),它类似于:

item_purchases{in_stock="1"} * on (name) group_left () (item_purchases)

但不幸的是,它只是删除了 item_stock 中在 item_purchases 中没有匹配时间序列的所有记录 - 例如“item3”,这实际上是我正在寻找的结果。

有人有编码此类查询的经验吗?它们甚至可以在 PromQL 中使用,还是我应该恢复到其他解决方案?

可以使用 unless 运算符:

item_stock unless item_purchases

生成一个由 item_stock 的元素组成的向量,其中 item_purchases 中没有元素具有完全匹配的标签集。删除两个向量中的所有匹配元素。

请注意,相关指标没有“完全匹配的标签集”(name 很常见,但 countin_stock不是)。在这种情况下,您可以使用 on 来设置要匹配的标签列表:

item_stock unless on(name) item_purchases