You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过单条PromQL拼接两个同标签查询的结果?

问题:能否通过单条PromQL直接拼接两个查询的结果?

现有两条PromQL查询,它们的结果都包含workload标签:

  1. sum by(workload) (label_replace(kube_replicaset_status_replicas{},"workload","$1","replicaset","(.+)"))
  2. 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", "", ".+")
)

关键逻辑说明

  1. 添加区分标签:给两个查询的结果分别加上source标签(值为replicaset和statefulset),这样即使workload相同,整个时间序列的标签组合也不一样,PromQL不会自动合并它们。
  2. 合并结果:使用or运算符将两个查询结果合并,or会保留左右两边所有的时间序列,不会去重。
  3. 关于标签保留:如果必须只保留workload标签且保留重复条目,PromQL做不到——因为PromQL要求时间序列的标签组合唯一。这种情况只能在查询后通过客户端代码处理结果。

内容的提问来源于stack exchange,提问作者JAESANGPARK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:15:44