引言:为什么高级监控是 Node.js 的必需品
\n在现代 Web 开发中,监控已超越了简单的错误日志记录。对于关键任务的 Node.js 应用——从微服务到高负载 API——需要主动收集指标、智能告警和数据可视化。在高级层面,我们讨论的不仅仅是“应用是否存活”,而是其性能、瓶颈以及故障预测。
\n在本文中,我们将探讨如何为 JavaScript (Node.js) 应用构建一个完整的监控系统:从自定义指标收集到通过 Prometheus 和 Grafana 配置告警。您将学习如何利用 Node.js 的内置功能和现代库来主动跟踪服务状态。
\n\n1. 高级指标收集:从事件循环到自定义计数器
\n基础指标是服务器响应时间。高级指标则是事件循环延迟、活动句柄数量和垃圾回收频率。让我们看看如何使用 process 和 prom-client 库(Prometheus 客户端)来收集这些数据。
1.1. 事件循环指标与系统资源
\nNode.js 是单线程的,因此事件循环延迟至关重要。我们通过 process.hrtime() 测量它,并将其作为直方图导出。
const client = require('prom-client');\nconst eventLoopDelay = new client.Histogram({\n name: 'nodejs_event_loop_delay_seconds',\n help: '事件循环延迟(秒)',\n buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1]\n});\n\nfunction measureEventLoop() {\n const start = process.hrtime.bigint();\n setImmediate(() => {\n const duration = Number(process.hrtime.bigint() - start) / 1e9;\n eventLoopDelay.observe(duration);\n });\n}\nsetInterval(measureEventLoop, 5000);\n\n1.2. 业务逻辑的自定义指标
\n除了系统指标,还要跟踪业务指标:处理的订单数量、验证错误、外部请求的执行时间。
\nconst orderCounter = new client.Counter({\n name: 'app_orders_total',\n help: '已处理的订单总数',\n labelNames: ['status'] // success, failed\n});\n\n// 在处理器中的使用示例\napp.post('/api/order', async (req, res) => {\n try {\n await processOrder(req.body);\n orderCounter.inc({ status: 'success' });\n res.send('OK');\n } catch (err) {\n orderCounter.inc({ status: 'failed' });\n res.status(500).send('Error');\n }\n});\n\n2. 指标导出与 Prometheus 集成
\n为了让 Prometheus 能够收集指标,需要创建一个 /metrics 端点。我们使用 prom-client 的标准注册表。
2.1. 创建收集端点
\nconst express = require('express');\nconst app = express();\nconst client = require('prom-client');\n\n// 收集 Node.js 默认指标\nclient.collectDefaultMetrics({ timeout: 5000 });\n\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', client.register.contentType);\n res.end(await client.register.metrics());\n});\n\napp.listen(3000, () => console.log('指标服务器运行在 :3000'));\n\n2.2. Prometheus 配置
\n在 prometheus.yml 文件中,为您的应用添加目标:
scrape_configs:\n - job_name: 'nodejs-app'\n static_configs:\n - targets: ['localhost:3000']\n重启 Prometheus 后,默认每 15 秒收集一次指标。
\n\n3. 告警配置:从简单阈值到异常分析
\n告警是对指标超出正常范围的响应。在高级层面,我们使用 PromQL 处理复杂条件,并在 Alertmanager 中配置规则。
\n\n3.1. 基本告警规则
\n创建 alerts.yml 文件:
博客
书籍推荐
推荐阅读