JavaScript 应用监控:指标与告警(高级水平)
现代基于 Node.js 的 JavaScript 应用正变得越来越复杂:微服务、事件驱动架构、实时系统。简单的“存活/宕机”监控已无法提供完整视图。为了确保稳定性和高性能,需要采用高级方法:收集业务指标、分析延迟、配置智能告警和实现可观测性。本文将探讨如何使用 Node.js、Prometheus 和 Grafana 构建高级监控系统。
1. Node.js 应用的关键指标
监控始于正确选择指标。对于生产环境,以下三组指标至关重要:
- RED 指标(速率、错误、持续时间)——请求频率、错误数量、响应时间。
- USE 指标(利用率、饱和度、错误)——CPU 负载、内存使用、打开的文件描述符数量。
- 业务指标——活跃用户数、任务队列大小、事件处理速度。
使用 prom-client 库收集指标的示例:
const client = require('prom-client');const httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status_code'], buckets: [0.1, 0.3, 0.5, 1, 3, 5]});
app.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.route?.path || 'unknown', status_code: res.statusCode }); }); next();});同时,务必监控垃圾回收(GC)和事件循环延迟——这有助于在性能问题变得严重之前发现它们。
2. 告警配置:从简单到智能
告警不仅仅是服务器宕机通知。在高级层面,告警应具备:
- 上下文感知——考虑时间、星期几、业务周期。
- 多层级——警告、严重、紧急。
- 预测性——基于趋势(例如,15 分钟内延迟增长 20%)。
使用预测功能的 Prometheus Alertmanager 规则示例:
groups: - name: nodejs_alerts rules: - alert: HighErrorRate expr: rate(http_requests_errors_total[5m]) / rate(http_requests_total[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "高错误率 ({{ $value | humanizePercentage }})" description: "过去 2 分钟内超过 5% 的请求返回错误。"
- alert: MemoryLeak expr: predict_linear(nodejs_heap_bytes_used{space="total"}[30m], 3600) > 1e9 for: 5m labels: severity: warning annotations: summary: "预测内存泄漏" description: "堆内存使用量可能在一小时内超过 1GB。"务必配置告警去重和分组,以免用成百上千条同类消息淹没值班工程师。在 Alertmanager 配置中使用 group_wait 和 group_interval。
3. 高级日志:结构化日志与追踪
标准的 console.log 不适用于生产环境。请使用 pino 或 winston 等库进行 JSON 格式的结构化日志记录。这便于解析日志并与聚合系统(ELK、Loki)集成。
配置 pino 的示例:
const pino = require('pino');const logger = pino({ level: process.env.LOG_LEVEL ||