Node.js进程指标需通过prom-client库暴露给Prometheus:安装后调用collectDefaultMetrics()注册默认指标(如事件循环延迟、堆内存、GC统计),再启动HTTP服务器在/metrics端点返回register.metrics()序列化数据,注意await处理Promise、避免端口冲突及确保指标注册与生命周期正确。

Node.js 进程指标怎么暴露给 Prometheus
Prometheus 默认不识别 Node.js 进程数据,必须由应用主动暴露 /metrics 端点。直接调用 process.cpuUsage() 或 process.memoryUsage() 只是获取快照,不构成可拉取的指标格式。
正确做法是引入 prom-client 库,它提供符合 Prometheus 文本协议(OpenMetrics)的指标注册与序列化能力:
npm install prom-client
在启动脚本中初始化并暴露 HTTP 端点:
const client = require('prom-client');
const collectDefaultMetrics = client.collectDefaultMetrics;
const register = client.register;
<p>// 注册默认指标(event loop delay、heap usage、GC 等)
collectDefaultMetrics({ timeout: 5000 });</p><p>// 启动一个简单 HTTP server 暴露指标
const http = require('http');
http.createServer(async (req, res) => {
if (req.url === '/metrics') {
res.setHeader('Content-Type', register.contentType);
res.end(await register.metrics());
}
}).listen(9091);</p>
注意:register.metrics() 返回 Promise,必须 await;否则返回空字符串或报错 TypeError: Cannot read property 'toString' of undefined。
VSCode 调试环境下如何避免端口冲突
VSCode 启动 Node.js 调试时默认复用同一进程,若多个调试会话同时运行,9091 端口极易被占用,报错 Error: listen EADDRINUSE: address already in use :::9091。
解决方式不是硬编码端口,而是动态分配:
- 使用
portfinder库自动选取可用端口(推荐) - 或读取环境变量
PROCESS_ID+ 固定偏移量,例如9090 + process.pid % 100 - 在
launch.json中注入唯一端口:添加"env": { "METRICS_PORT": "9092" },代码中读取process.env.METRICS_PORT
更重要的是:不要在 attach 模式下启动指标服务——该模式下 Node.js 已运行,HTTP server 可能无法绑定。只在 launch 模式中初始化。
Prometheus 配置文件里怎么加本地 Node 实例
本地开发时,Prometheus 的 scrape_configs 必须显式指向你的 Node.js 服务,不能依赖服务发现。
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
编辑 prometheus.yml,在 scrape_configs 下追加:
scrape_configs:
- job_name: 'node-local'
static_configs:
- targets: ['localhost:9091']
关键点:
-
job_name命名需唯一,避免和node_exporter冲突(后者通常叫node) -
targets必须写localhost,不能写127.0.0.1—— VSCode 的 WSL 或容器调试场景下,网络栈可能不认后者 - 改完配置后要重载 Prometheus:发送
POST http://localhost:9090/-/reload,或重启服务
验证是否生效:打开 http://localhost:9090/targets,状态应为 UP,且标签含 instance="localhost:9091"。
为什么 metrics 页面返回 404 或空内容
常见原因不是路径写错,而是指标未注册或采集逻辑未触发。
检查三件事:
- 确认
collectDefaultMetrics()已调用——漏掉这行,register.metrics()就只有空壳 - 确认 Node.js 进程没在指标暴露前就退出(比如脚本执行完立即结束);加
console.log('metrics server listening')和process.on('exit', ...)排查生命周期 - 确认没有其他中间件(如 Express 的
app.use(...))拦截了/metrics路径,尤其当你混用 Express 时,必须把指标路由放在所有app.use之前
最简验证法:curl 直接请求,别依赖浏览器缓存:curl -v http://localhost:9091/metrics。看到以 # HELP 开头的文本,才算真正就绪。
真正麻烦的不是写几行指标代码,而是让指标在 VSCode 的各种启动模式(launch/attach/remote-WSL)下稳定暴露。端口、进程生命周期、HTTP server 初始化时机,这三个点卡住的人最多。










