有没有办法在 PromQL 中进行类似查询的“左外连接”?

Posted

技术标签:

【中文标题】有没有办法在 PromQL 中进行类似查询的“左外连接”?【英文标题】:Is there a way to do a "left outer join" like query in PromQL? 【发布时间】:2021-08-08 11:06:27 【问题描述】:

我正在尝试使用应该描述相同实体的两个指标(共享一些标签,包括我可以用作 UUID 的一个),以便创建警报/仪表板,以提醒我一个实体报告一个指标,但不是其他指标。

例如,对于以下指标:

item_purchasesname="item1", count="5"
item_purchasesname="item2", count="7"

item_stockname="item1", in_stock="1"
item_stockname="item2", in_stock="0"
item_stockname="item3", in_stock="1"

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

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

我已经有一个查询,可以帮助我过滤某些条件(例如,如果某件商品已购买但没有库存,例如“item2”),它看起来像:

item_purchasesin_stock="1" * on (name) group_left () (item_purchases)

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

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

【问题讨论】:

【参考方案1】:

可以使用unless操作符:

item_stock unless item_purchases

产生一个向量,该向量由item_stock 的元素组成,item_purchases 中没有与标签集完全匹配的元素。两个向量中的所有匹配元素都将被删除。

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

item_stock unless on(name) item_purchases

【讨论】:

以上是关于有没有办法在 PromQL 中进行类似查询的“左外连接”?的主要内容,如果未能解决你的问题,请参考以下文章

值数组中每个元素的 PromQL 增量

promql 中有没有办法使用 thanos api 获取所有可用的标签名称?

彻底理解Prometheus查询语法

Prometheus 查询 promql 以在同一字段上进行平均

PromQL 中的 MetricQL 函数

如何在 LINQ 中使用左外连接进行 SQL 查询?