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

Node.js应用中通过Prometheus API关联同标签的两个指标

如何用Prometheus API一次请求关联同标签的两个指标

这事儿好办!你可以用Prometheus内置的join函数来实现这个需求,它能帮你基于server标签把两个指标的关联结果一次性查出来,完全符合你的预期。

方法一:使用join函数(推荐)

Prometheus 2.7及以上版本支持join函数,专门用来实现类似SQL的标签关联操作。针对你的场景,对应的PromQL查询语句如下:

join(server) (metricA, metricB)

效果说明

这个查询会自动匹配metricA和metricB中server标签值相同的条目,返回的结果会保留server标签,并且每个匹配项会同时包含两个指标的数值。在Prometheus API的响应里,每个样本的value字段会是一个数组——第一个元素是metricA的值,第二个是metricB的值。

对应你的示例数据,API返回的简化结果大概是这样:

{
  "status": "success",
  "data": {
    "resultType": "vector",
    "result": [
      {
        "metric": { "server": "serverA" },
        "value": [1620000000, [10, 30]]
      },
      {
        "metric": { "server": "serverB" },
        "value": [1620000000, [20, 40]]
      }
    ]
  }
}

你只需要在Node.js代码里解析这个响应,就能直接得到每个server对应的两个指标值了。

方法二:客户端手动合并(兼容旧版本)

如果你的Prometheus版本低于2.7,不支持join函数,也可以先一次性查询两个指标,然后在Node.js代码里手动按server标签分组合并。

第一步:查询两个指标

用这个PromQL语句一次性获取所有相关数据:

{__name__=~"metricA|metricB"}

第二步:Node.js代码合并结果

拿到API返回的结果后,用简单的逻辑把同server的指标值整合到一起:

// 假设apiResponse是Prometheus API返回的完整响应对象
const groupedData = {};

apiResponse.data.result.forEach(item => {
  const server = item.metric.server;
  const metricName = item.metric.__name__;
  const value = item.value[1]; // 取指标数值部分

  // 初始化server对应的对象
  if (!groupedData[server]) {
    groupedData[server] = { server };
  }
  // 给对应指标赋值
  groupedData[server][`value #${metricName.slice(-1)}`] = value;
});

// 转换为你需要的数组格式
const finalResult = Object.values(groupedData);

执行完这段代码后,finalResult就是你想要的结构:

[
  { server: "serverA", "value #A": "10", "value #B": "30" },
  { server: "serverB", "value #A": "20", "value #B": "40" }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:17:48