JavaScript 应用监控:高级指标与告警

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么高级监控是 Node.js 的必需品

\n

在现代 Web 开发中,监控已超越了简单的错误日志记录。对于关键任务的 Node.js 应用——从微服务到高负载 API——需要主动收集指标、智能告警和数据可视化。在高级层面,我们讨论的不仅仅是“应用是否存活”,而是其性能、瓶颈以及故障预测。

\n

在本文中,我们将探讨如何为 JavaScript (Node.js) 应用构建一个完整的监控系统:从自定义指标收集到通过 Prometheus 和 Grafana 配置告警。您将学习如何利用 Node.js 的内置功能和现代库来主动跟踪服务状态。

\n\n

1. 高级指标收集:从事件循环到自定义计数器

\n

基础指标是服务器响应时间。高级指标则是事件循环延迟、活动句柄数量和垃圾回收频率。让我们看看如何使用 process 和 prom-client 库(Prometheus 客户端)来收集这些数据。

\n\n

1.1. 事件循环指标与系统资源

\n

Node.js 是单线程的,因此事件循环延迟至关重要。我们通过 process.hrtime() 测量它,并将其作为直方图导出。

\n
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\n

1.2. 业务逻辑的自定义指标

\n

除了系统指标,还要跟踪业务指标:处理的订单数量、验证错误、外部请求的执行时间。

\n
const 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\n

2. 指标导出与 Prometheus 集成

\n

为了让 Prometheus 能够收集指标,需要创建一个 /metrics 端点。我们使用 prom-client 的标准注册表。

\n\n

2.1. 创建收集端点

\n
const 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\n

2.2. Prometheus 配置

\n

在 prometheus.yml 文件中,为您的应用添加目标:

\n
scrape_configs:\n  - job_name: 'nodejs-app'\n    static_configs:\n      - targets: ['localhost:3000']
\n

重启 Prometheus 后,默认每 15 秒收集一次指标。

\n\n

3. 告警配置:从简单阈值到异常分析

\n

告警是对指标超出正常范围的响应。在高级层面,我们使用 PromQL 处理复杂条件,并在 Alertmanager 中配置规则。

\n\n

3.1. 基本告警规则

\n

创建 alerts.yml 文件:

\n

博客

书籍推荐