大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
APM 与生产监控
开发期用 nrt-debug;上线后需要 metrics、tracing、错误聚合——APM(Application Performance Monitoring)把 延迟、吞吐、GC、未捕获异常 持续可视化,衔接 broader observability 路线。
学习目标
- 说清 metrics / logs / traces 三支柱在 Node 中的落点
- 了解 OpenTelemetry 与常见 SaaS(Datadog、New Relic 等)集成方式
- 避免在高 QPS 路径上同步打满日志
三支柱速览
| 支柱 | Node 典型实现 | 回答的问题 |
|---|---|---|
| Metrics | prom-client、OTel Meter | QPS、P99、heap、event loop lag |
| Logs | pino、winston → stdout/ELK | 某次请求发生了什么 |
| Traces | OpenTelemetry + Jaeger/Tempo | 慢在哪一段、跨服务链路 |
Golden signals:延迟、流量、错误、饱和度(CPU、event loop delay)。
Event Loop 延迟
主线程被 nrt-worker 未 offload 的 CPU 堵住时,所有请求一起慢——监控 eventLoopUtilization / perf_hooks.monitorEventLoopDelay:
import { monitorEventLoopDelay } from "node:perf_hooks";
const h = monitorEventLoopDelay({ resolution: 10 });
h.enable();
setInterval(() => {
console.log({
p50: h.percentile(50) / 1e6,
p99: h.percentile(99) / 1e6,
});
h.reset();
}, 10_000);
P99 持续 > 50–100ms 值得查同步代码或 GC(nrt-gc)。
OpenTelemetry 入门(概念)
// 伪代码:实际需 @opentelemetry/sdk-node 等包
import { trace } from "@opentelemetry/api";
const span = trace.getTracer("app").startSpan("handleRequest");
try {
await doWork();
} finally {
span.end();
}
自动 instrumentation 可钩住 http、fs——注意 采样率(生产常 1–10%),避免 trace 存储爆炸。
与 Java Micrometer / Spring Actuator 类似:统一 export 到 Prometheus/Grafana 是常见自建方案。
错误与 process 事件
process.on("uncaughtException", (err) => {
// 上报 APM 后:记录、告警;是否 exit 视策略而定
console.error(err);
});
process.on("unhandledRejection", (reason) => {
console.error("unhandledRejection", reason);
});
最佳实践:unhandledRejection 在 Node 未来版本可能直接退出——业务层 await 链务必 .catch(nrt-callbacks)。
日志与 PII
- 结构化 JSON 日志便于检索;不要把密码、token 打进 message。
- 高 QPS 避免 同步 console.log 洪水——用 pino 等异步 logger,或采样 debug。
练习
- 为 Express 加
/metrics返回自研memoryUsage+ 简单请求计数 - 用
monitorEventLoopDelay在故意 CPU 阻塞前后对比 P99 - 列出你会上报的 5 个 alert 条件(错误率、heap、loop lag 等)
小结
Metrics 看趋势,Traces 定位慢路径,Logs 补上下文。 下一课 CLI 工具链——commander、chalk、nodemon 的运行时视角。