JavaScript 应用监控:从 A 到 Z 的指标与告警

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

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

开始课程

JavaScript 应用监控:从 A 到 Z 的指标与告警



在现代开发中,仅仅编写可运行的代码是不够的。理解您的应用在生产环境中的行为至关重要。JavaScript 应用监控(尤其是在 Node.js 上)不仅仅是一种趋势,而是一种必需。它可以帮助您发现瓶颈、防止故障并确保服务的高可用性。在本文中,我们将介绍完整的流程:从收集关键指标到配置告警,使用现代工具栈。



为什么 Node.js 监控很重要?

Node.js 应用通常以异步模式运行,每秒处理数千个请求。没有监控,您将面临以下风险:

  • 错过会导致服务器崩溃的内存泄漏。
  • 无法注意到响应时间(延迟)的增加,从而降低用户体验。
  • 因未处理的错误而丢失数据。

监控系统为您提供可见性(可观测性),并允许您基于数据而非猜测做出决策。



JavaScript 应用的关键指标

所有指标可分为三类:基础设施指标、业务指标和应用指标。让我们详细了解一下。



1. 基础设施指标(USE 方法)

这些是服务器健康的基本指标:CPU、内存、磁盘、网络。对于 Node.js,内存(堆、非堆)和打开的文件描述符数量尤为重要。



2. 应用指标(RED 方法)

RED 方法(速率、错误、持续时间)是微服务的黄金标准:

  • 速率:每秒请求数(RPS)。
  • 错误:以错误(4xx、5xx)结束的请求百分比。
  • 持续时间:请求执行时间(p50、p95、p99 百分位数)。


3. 业务指标

特定于您产品的指标:注册用户数、完成订单数、活跃会话数等。



使用 Prometheus 和 Node.js 收集指标

Prometheus 是收集指标的事实标准。对于 Node.js,我们使用 prom-client 库。让我们看一个配置示例。



安装与基本配置

npm install prom-client express


创建一个带有 /metrics 端点的服务器:

const express = require('express');const client = require('prom-client');

const app = express();const port = 3000;

// 创建指标注册表const register = new client.Registry();

// 添加默认的 Node.js 指标client.collectDefaultMetrics({ register });

// 为响应时间创建自定义直方图const httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status'], buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5]});register.registerMetric(httpRequestDuration);

// 用于测量时间的中间件app.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.route?.path || 'unknown', status: res.statusCode }); }); next();});

// 指标端点app.get('/metrics', async (req, res) => { res.set('Content-Type', register.contentType); res.end(await register.metrics());});

app.get('/', (req, res) => { res.send('Hello, monitoring!');});

app.listen(port, () => { console.log(`App listening at http://localhost:${port}`);});


自定义计数器

添加一个错误计数器:

const errorCounter = new client.Counter({    name: 'app_errors_total',                

博客

书籍推荐