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']
验证方式
- 启动Node.js服务,确认两个端口都正常监听
- 访问
http://localhost:3000验证主服务正常 - 访问
http://localhost:3001/metrics确认指标能正常返回 - 重启Prometheus,检查是否能成功抓取到新端口的指标
内容的提问来源于stack exchange,提问作者user3587856




