JavaScript (Node.js) 应用监控:工具与库
监控 Node.js 应用是维护服务稳定性、性能和可用性的关键任务。如果没有持续的指标收集、错误追踪和代码性能分析,您可能会面临意外宕机、运行缓慢和内存泄漏的风险。在本文中,我们将介绍用于监控 Node.js 的最佳工具和库,包括流行的开源解决方案。
为什么需要监控 Node.js?
Node.js 是一个异步环境,擅长处理 I/O 操作,但也有一些需要关注的特性:
- 单线程模型:阻塞代码可能导致整个进程停止。
- 内存泄漏:由闭包和引用管理不当引起。
- 事件循环:其延迟(lag)直接影响响应速度。
- 异步代码错误:未处理的 Promise 可能被忽略。
工具的主要类别
为了全面监控 Node.js 应用,您需要来自三个类别的工具:
- 指标收集 (Metrics):CPU、内存、每秒请求数、响应时间。
- 性能分析 (Profiling):分析瓶颈和事件循环。
- 错误追踪 (Error Tracking):自动收集和聚合异常。
1. Prometheus + prom-client (指标收集)
Prometheus 是现代基础设施中指标收集的事实标准。对于 Node.js,使用 prom-client 库。它允许您创建直方图、计数器和仪表指标。
安装:
npm install prom-client express导出指标的示例 (server.js):
const express = require('express');const client = require('prom-client');const app = express();
// 为响应时间创建直方图const httpRequestDurationMicroseconds = new client.Histogram({ name: 'http_request_duration_ms', help: 'Duration of HTTP requests in ms', labelNames: ['method', 'route', 'status'], buckets: [50, 100, 200, 500, 1000, 2000]});
// 用于测量时间的中间件app.use((req, res, next) => { const end = httpRequestDurationMicroseconds.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.route?.path || 'unknown', status: res.statusCode }); }); next();});
// Prometheus 端点app.get('/metrics', async (req, res) => { res.set('Content-Type', client.register.contentType); res.end(await client.register.metrics());});
app.get('/', (req, res) => res.send('Hello World!'));app.listen(3000, () => console.log('Server running on port 3000'));现在,您可以配置 Prometheus 从 /metrics 收集指标,并在 Grafana 中将其可视化。
2. PM2 (进程管理器和基本监控)
PM2 不仅是 Node.js 的进程管理器,还内置了监控系统。它允许您跟踪进程状态、在崩溃时重启进程以及收集基本指标。
安装:
npm install pm2 -g使用监控启动应用:
pm2 start server.js --name "my-app"pm2 monit # 打开监控面板将指标导出到 Prometheus (通过 pm2-metrics):
npm install pm2-metricspm2 start server.js --name "my-app"pm2-metrics --port 9200 # 打开 /metrics 端点3. Clinic.js (性能分析和诊断)
Clinic.js 是一套工具