You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node.js Express场景下,如何为Prometheus配置不同的指标暴露端口?

可以实现!分端口运行主服务与Metrics端点

当然可以!你完全能实现让Express主服务运行在一个端口,同时把Prometheus的metrics端点单独暴露在另一个独立端口的需求。这样做不仅能隔离业务流量和监控抓取的流量,还能更灵活地对metrics端口做访问控制。

步骤1:修改Node.js服务端代码

你需要创建两个独立的HTTP服务:一个用于运行主业务逻辑(比如原3000端口),另一个专门处理Prometheus指标请求(比如新的3001端口)。以下是调整后的代码:

const Prometheus = require('prom-client');
const express = require('express');
const http = require('http');

// 主业务Express应用
const app = express();
// 初始化Prometheus默认指标
const metricsInterval = Prometheus.collectDefaultMetrics();

// 自定义请求计数器
const requestCounter = new Prometheus.Counter({
  name: 'num_of_requests',
  help: 'Number of requests made',
  labelNames: ['method', 'route', 'code']
});

// 中间件:记录所有主服务请求的指标
app.use((req, res, next) => {
  // 响应结束时更新计数器
  res.on('finish', () => {
    requestCounter.inc({
      method: req.method,
      route: req.originalUrl,
      code: res.statusCode
    });
  });
  next();
});

// 主服务的业务路由示例
app.get('/', (req, res) => {
  res.send('主服务运行中!');
});

// 专门用于暴露Metrics的Express实例
const metricsApp = express();
metricsApp.get('/metrics', (req, res) => {
  res.set('Content-Type', Prometheus.register.contentType);
  res.end(Prometheus.register.metrics());
});

// 启动主服务在3000端口
app.listen(3000, () => {
  console.log('主服务已启动,监听端口:3000');
});

// 启动Metrics服务在3001端口
http.createServer(metricsApp).listen(3001, () => {
  console.log('Metrics服务已启动,监听端口:3001');
});

步骤2:更新Prometheus配置

将Prometheus的抓取目标修改为新的Metrics端口(这里是3001):

scrape_configs:
  # 任务名将作为标签`job=<job_name>`添加到从此配置抓取的任何时间序列中。
  - job_name: 'referral'
    static_configs:
      - targets: ['localhost:3001']

验证方式

  1. 启动Node.js服务,确认两个端口都正常监听
  2. 访问http://localhost:3000验证主服务正常
  3. 访问http://localhost:3001/metrics确认指标能正常返回
  4. 重启Prometheus,检查是否能成功抓取到新端口的指标

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

火山引擎 最新活动