能否通过单条PromQL拼接两个同标签查询的结果?
问题:能否通过单条PromQL直接拼接两个查询的结果?
现有两条PromQL查询,它们的结果都包含workload标签:
sum by(workload) (label_replace(kube_replicaset_status_replicas{},"workload","$1","replicaset","(.+)"))sum by(workload) (label_replace(kube_statefulset_replicas{},"workload","$1","statefulset","(.+)"))
查询结果示例
第一条查询返回:
{ "metric": { "workload": "zmx" }, "value": [ 1669274927.023, "0" ] },{ "metric": { "workload": "efg" }, "value": [ 1669274927.023, "0" ] }
第二条查询返回:
{ "metric": { "workload": "abc" }, "value": [ 1669274927.023, "0" ] },{ "metric": { "workload": "efg" }, "value": [ 1669274927.023, "0" ] }
期望直接拼接两个结果(保留重复的workload: efg条目),得到如下结果:
{ "metric": { "workload": "abc" }, "value": [ 1669274927.023, "0" ] },{ "metric": { "workload": "efg" }, "value": [ 1669274927.023, "0" ] },{ "metric": { "workload": "zmx" }, "value": [ 1669274927.023, "0" ] },{ "metric": { "workload": "efg" }, "value": [ 1669274927.023, "0" ] }
请问能否通过单条PromQL直接得到上述拼接后的结果?
答案
可以通过单条PromQL实现,但需要给两个查询的结果添加唯一区分标签,避免PromQL自动合并相同workload的序列,具体实现如下:
最终PromQL
sum by(workload, source) ( label_replace(kube_replicaset_status_replicas{}, "workload", "$1", "replicaset", "(.+)") * on() group_left(source) label_replace(vector(1), "source", "replicaset", "", ".+") ) or sum by(workload, source) ( label_replace(kube_statefulset_replicas{}, "workload", "$1", "statefulset", "(.+)") * on() group_left(source) label_replace(vector(1), "source", "statefulset", "", ".+") )
关键逻辑说明
- 添加区分标签:给两个查询的结果分别加上
source标签(值为replicaset和statefulset),这样即使workload相同,整个时间序列的标签组合也不一样,PromQL不会自动合并它们。 - 合并结果:使用
or运算符将两个查询结果合并,or会保留左右两边所有的时间序列,不会去重。 - 关于标签保留:如果必须只保留
workload标签且保留重复条目,PromQL做不到——因为PromQL要求时间序列的标签组合唯一。这种情况只能在查询后通过客户端代码处理结果。
内容的提问来源于stack exchange,提问作者JAESANGPARK
相关产品推荐
相关产品推荐

