Monitoring Node.js: Key Metrics You Should Track
Node.js 监控:你应该追踪的关键 Metrics
了解在 Node.js 应用程序中哪些 metrics 重要,它们为何重要,以及如何在生产环境中有效地追踪它们。
May 19th, ‘25
Faiz Shaikh
分享:
LinkedIn [ Reddit ](https://last9.io/blog/node-js-key-metrics/<https:/www.reddit.com/submit?url=https%3A%2F%2Flast9.io%2Fblog%2Fnode-js-key-metrics%2F&title=Monitoring Node.js: Key Metrics You Should Track>)[ X ](https://last9.io/blog/node-js-key-metrics/<https:/x.com/intent/tweet?url=https://last9.io/blog/node-js-key-metrics/&text=Understand which metrics matter in Node.js applications, why they’re important, and how to track them effectively in production.>)
内容
有效的 Node.js 监控需要追踪运行时 metrics(内存、CPU)、应用程序 metrics(请求率、响应时间)和业务 metrics(用户行为、转化率)。本指南涵盖了要追踪的内容、如何收集它们以及如何设置有意义的告警。
为什么 Node.js Metrics 很重要?
你已经构建了一个 Node.js 应用程序并将其部署到生产环境。如果没有适当的 metrics,当用户报告“应用程序感觉很慢”时,故障排除将变得困难。
良好的 metrics 将模糊的抱怨转化为可操作的数据点,例如“支付服务正在经历 500 毫秒的响应时间,高于 120 毫秒的基线”。
💡 要更深入地了解现代应用程序中的可观测性,请查看 Last9's APM Observability Guide。
你应该追踪哪些运行时 Metrics?
运行时 metrics 显示 Node.js 本身的性能如何。它们提供了问题的早期预警信号。
监控内存使用情况
Node.js 内存管理和垃圾回收可能很棘手。观察这些 metrics 以识别内存问题:
- HeapUsed vs Heap Total : 当已用内存增长并且在垃圾回收后没有返回到基线时,你可能存在内存泄漏。
- External Memory : C++ 对象绑定到 JavaScript 对象所使用的内存。
- Garbage CollectionFrequency : 频繁的垃圾回收会降低性能。
- RSS (Resident Set Size) : 为 Node 进程在 RAM 中分配的总内存。
- Full GC Per Min : 每分钟完全垃圾回收周期的次数。
- Incremental GC Per Min : 每分钟增量垃圾回收周期的次数。
- Heap Size Changed : 垃圾回收周期回收的内存百分比。
- GC Duration : 花费在垃圾回收上的时间(持续时间越长,对性能的影响越大)。
// 在你的应用程序中记录内存使用情况的基本方法
const logMemoryUsage = () => {
const memUsage = process.memoryUsage();
console.log({
rss: `${Math.round(memUsage.rss / 1024 / 1024)} MB`,
heapTotal: `${Math.round(memUsage.heapTotal / 1024 / 1024)} MB`,
heapUsed: `${Math.round(memUsage.heapUsed / 1024 / 1024)} MB`,
external: `${Math.round(memUsage.external / 1024 / 1024)} MB`
});
};
测量 CPU 利用率
Node.js 默认是单线程的。CPU metrics 帮助你了解资源使用情况:
- CPU Usage Percentage : 你的 Node 进程正在使用的 CPU 百分比。
- Event Loop Lag : 任务应该运行的时间和实际运行时间之间的延迟。
- Active Handles : 活动句柄(套接字、计时器等)的计数——高数字可能表明资源泄漏。
💡 也在 JVM 上运行服务?这是一个你需要追踪的关键 metrics的分解。
分析 Event Loop Metrics
Event loop 是 Node.js 性能的核心。这些 metrics 帮助监控其健康状况:
- Event Loop Lag : Event loop 处理回调所需的时间。
- Event Loop Utilization : Event loop 运行代码与空闲的时间比率。
- Average Tick Length : Event loop tick 之间的平均时间量。
- Maximum Tick Length : Event loop tick 之间的最长时间量(表明阻塞操作)。
- Minimum Tick Length : tick 之间的最短时间量。
- Tick Count : Event loop 已经 tick 的次数。
- Average IO Time : 每个 event loop tick 花费在处理 IO 回调上的平均毫秒数。
Metric | 警告阈值 | 严重阈值 | 含义
---|---|---|---
Event Loop Lag | > 100ms | > 500ms | 应用程序难以足够快地处理回调
CPU Usage | > 70% 持续 | > 90% 持续 | 接近 CPU 限制
Memory Growth | 几个小时内稳步增长 | 接近堆限制 | 可能存在内存泄漏
应用程序 Metrics 如何提高性能?
运行时 metrics 显示 Node.js 的性能。应用程序 metrics 显示你的代码的性能。
追踪 HTTP 请求 Metrics
对于 Web 应用程序和 API,请监控:
- Request Rate : 每秒请求数,按端点分解。
- Response Time : P95/P99 延迟(不仅仅是平均值)。
- Error Rate : 导致错误的请求百分比(4xx/5xx)。
- Concurrent Connections : 活动连接数。
监控数据库和外部服务性能
你的应用程序连接到其他服务:
- Query Execution Time : 数据库操作花费的时间。
- Connection Pool Utilization : 当前与允许的最大连接数。
- External API Response Times : 第三方服务响应的速度。
- Failed Transactions : 数据库或 API 调用失败率。
- KB Read/Written Per Second : 磁盘操作速率。
- Network I/O : 每秒接收和发送的 KB 数。
Last9 帮助关联跨服务的这些 metrics,以识别数据库减速如何影响你的 Node.js 应用程序的性能。
Metrics 如何与业务价值相关联?
为了向非技术利益相关者展示价值,请追踪业务 metrics:
- Conversion Rate : 技术性能如何影响销售。
- User Engagement : 会话持续时间、每次访问的页面数。
- Cart Abandonment : 通常与慢速结帐 API 响应相关。
- Revenue Impact : 性能下降期间的财务影响。
如何实现 Metrics 收集
以下是如何开始从你的 Node.js 应用程序收集 metrics:
利用内置的 Node.js API
Node.js 具有用于基本 metrics 的内置工具:
// health-check.js
const os = require('os');
app.get('/health', (req, res) => {
res.json({
uptime: process.uptime(),
memory: process.memoryUsage(),
cpu: {
load: os.loadavg(),
cores: os.cpus().length
}
});
});
实施可观测性客户端
对于生产应用程序,请使用更全面的解决方案。Last9 的 OpenTelemetry 兼容客户端效果很好:
// 使用 OpenTelemetry 和 Last9 的示例
const { NodeTracerProvider } = require('@opentelemetry/node');
const { ConsoleSpanExporter } = require('@opentelemetry/tracing');
const { CollectorTraceExporter } = require('@opentelemetry/exporter-collector');
const provider = new NodeTracerProvider();
const exporter = new CollectorTraceExporter({
url: 'https://ingest.last9.io',
headers: {
'x-api-key': 'YOUR_API_KEY'
}
});
provider.addSpanProcessor(
new SimpleSpanProcessor(exporter)
);
provider.register();
// 用于 Express、MongoDB 等的自动插桩
require('@opentelemetry/auto-instrumentations-node').registerInstrumentations({
tracerProvider: provider
});
此设置自动捕获 HTTP 请求、数据库调用和外部服务交互。
💡 有关使用 Node.js 设置 OpenTelemetry 的完整分步指南,请参阅 Last9's Getting Started with OpenTelemetry JavaScript guide。
你应该考虑哪些自定义 Metrics?
通用 metrics 提供了一个基础,但每个应用程序都有值得追踪的独特方面:
捕获用户体验 Metrics
// 追踪在结帐过程中花费的时间
app.post('/api/checkout', (req, res) => {
const startTime = Date.now();
processOrder(req.body)
.then(result => {
// 记录结帐时间
metrics.timing('checkout.time', Date.now() - startTime);
metrics.increment('checkout.success');
res.json(result);
})
.catch(err => {
metrics.increment('checkout.error');
res.status(500).json({ error: err.message });
});
});
测量缓存效率
// 追踪缓存命中/未命中率
function getCachedData(key) {
return cache.get(key)
.then(data => {
if (data) {
metrics.increment('cache.hit');
return data;
}
metrics.increment('cache.miss');
return fetchAndCacheData(key);
});
}
你应该如何配置有效的告警?
监控的目标是知道何时出现问题。Last9 帮助设置智能告警:
建立多阈值告警
使用分级告警级别而不是二进制好/坏:
- Warning : "API 延迟超过 200 毫秒,持续 5 分钟"
- Error : "API 延迟超过 500 毫秒,持续 3 分钟"
- Critical : "API 错误率超过 5%,持续 1 分钟"
💡 有关为高基数环境设置有效告警的更多详细信息,请查看 Last9's Alert Studio。
设计基于相关的告警
对模式而不是单个阈值发出警报:
- "数据库连接时间增加 AND API 延迟增加" 表明数据库问题影响你的应用程序。
- "CPU 峰值但吞吐量没有改变" 可能表明存在效率低下的后台进程。
实施异常检测
对于具有可变负载的 Node.js 应用程序尤其有用:
- 根据一天中的时间设置动态阈值
- 对突然变化而不是固定值发出警报
- 检测 metrics 何时偏离历史模式
Last9 的异常检测可以学习你的应用程序的正常行为模式,减少误报,同时捕获实际问题。
💡 现在,使用 AI 和 Last9 MCP 从你的 IDE 立即修复生产 Node.js 日志问题。将实时生产环境上下文(日志、metrics 和追踪)带入你的本地环境,以更快地调试和解决问题。
你应该避免哪些常见错误?
避免这些常见的监控错误:
正确解释内存“锯齿”模式
Node.js 垃圾回收在内存使用中创建锯齿模式。 这是正常的! 查找峰值中的趋势,而不是下降中的趋势。
将 Event Loop Metrics 与性能相关联
繁忙的 event loop 并不总是意味着麻烦。 在优化之前,将其与响应时间和错误率相关联。
选择百分位数而不是平均值
平均响应时间可能会隐藏问题。 100 毫秒的平均值可能意味着所有请求都花费 100 毫秒,或者 95% 的请求花费 50 毫秒,而 5% 的请求花费 1000 毫秒。 始终查看 p95/p99 值。
监控 Socket.IO 通信
对于使用 Socket.IO 的应用程序,还要监控:
- 当前连接数
- 启动以来的总连接数
- 交换的消息数量和大小
何时在生产环境之外使用 Metrics?
Metrics 不仅仅适用于实时系统:
评估新功能
比较新代码前后的 metrics 以尽早发现性能变化。
使用 Metrics 执行负载测试
将负载测试结果与内部 metrics 相关联,以在它们到达生产环境之前找到瓶颈。
比较 A/B 测试性能
使用 metrics 来比较同一功能的不同实现。
💡 想了解更多关于 Node.js 的零代码插桩选项? 请查看我们的 guide on Zero Code Instrumentation。
如何开始使用 Node.js Metrics?
这是你进行有效 Node.js 监控的行动计划:
- 配置基本运行时 metrics(内存、CPU、event loop)
- 实施应用程序级别 metrics(HTTP、数据库、外部服务)
- 定义将性能与结果联系起来的业务 metrics
- 设置智能、多阈值告警
- 为不同的利益相关者创建仪表板
- 根据实际事件定期审查和改进你的 metrics
💡 要快速开始使用 Express 应用程序,请查看我们的 OpenTelemetry Express guide,该指南展示了如何在代码更改最少的情况下对 Node.js 应用程序进行插桩。
总结
监控 Node.js 没有一种万能的方法,但了解哪些 metrics 反映了应用程序中的实际问题是一个好的开始。 专注于帮助你更快地调试并做出明智的决定——其他一切都是噪音。
💡 如果您想进一步讨论您的具体用例,我们的 Discord community 是开放的——我们有一个专门用于开发者讨论和支持的频道。
常见问题解答
Node.js 的垃圾回收如何影响我的 metrics?
垃圾回收会导致执行中的定期暂停,表现为延迟 metrics 中的峰值和内存使用中的锯齿模式。 这些是正常的,但过多的 GC 可能表明存在内存问题。 监控 GC 频率和持续时间。
收集这些 metrics 的开销是多少?
现代监控解决方案添加的开销极小(通常 <1% CPU)。 从基本 metrics 开始,然后扩展。 Last9 的代理旨在最大限度地减少影响,同时提供良好的可见性。
我应该插桩所有 API 端点吗?
从你的最关键路径开始。 对于电子商务网站,这可能是产品浏览、购物车和结帐流程。 根据客户影响添加更多内容。
如何在微服务架构中追踪 Node.js metrics?
相关性是关键。 在服务中使用一致的追踪 ID 和可以连接相关 metrics 的平台。 Last9 可以帮助你完成此操作,让你可以在整个系统中追踪请求。
我应该追踪多少个 metrics?
专注于可操作的 metrics。 如果一个 metric 不能帮助你决定采取什么行动,那么它可能不值得追踪。 质量胜于数量。
日志、metrics 和追踪有什么区别?
- 日志 是离散事件的记录(“用户 X 已登录”)
- Metrics 是随时间变化的数值测量(“每分钟 5 次登录”)
- Traces 跟踪跨多个服务的操作(“用户登录 → 身份验证服务 → 数据库”)
如何将 Node.js metrics 与用户体验相关联?
在后端 metrics 的同时实施真实用户监控 (RUM)。 这捕获了实际用户体验,并允许你将后端性能与前端 metrics(如页面加载时间)相关联。
适用于 Node.js 应用程序的良好告警策略是什么?
基于影响的多级告警:
- Info : 值得注意但不紧急的异常
- Warning : 需要尽快关注的问题
- Critical : 现在影响用户的问题
将不同级别路由到适当的渠道(警告通过电子邮件,关键警报通过 PagerDuty)。