有没有办法在 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
很常见,但count
和in_stock
不常见)。在这种情况下,您可以使用on
设置要匹配的标签列表:
item_stock unless on(name) item_purchases
【讨论】:
以上是关于有没有办法在 PromQL 中进行类似查询的“左外连接”?的主要内容,如果未能解决你的问题,请参考以下文章
promql 中有没有办法使用 thanos api 获取所有可用的标签名称?