Мониторинг приложений JavaScript (Node.js): библиотеки и инструменты
В современной веб-разработке мониторинг Node.js приложений — это не просто опция, а необходимость. Без него невозможно гарантировать стабильность, производительность и быстрое обнаружение ошибок. В этой статье мы подробно разберём ключевые инструменты и библиотеки для построения системы observability (наблюдаемости) в экосистеме Node.js.
Зачем нужен мониторинг Node.js?
Node.js — однопоточная среда с неблокирующим вводом-выводом. Это означает, что одна ошибка или утечка памяти могут парализовать всё приложение. Мониторинг помогает:
- Отслеживать метрики (CPU, память, количество запросов, время ответа).
- Обнаруживать аномалии (внезапный рост ошибок, падение производительности).
- Проводить профилирование (узкие места в коде, утечки памяти).
- Настраивать алерты (уведомления в Slack, Telegram, email).
Основные библиотеки для мониторинга Node.js
1. Prometheus Client (prom-client)
Это стандартный экспортер метрик для Node.js, совместимый с популярной системой сбора метрик Prometheus. Библиотека позволяет создавать кастомные счётчики, гистограммы и суммарные метрики.
const client = require('prom-client');
const express = require('express');
const app = express();
// Создаём счётчик запросов
const httpRequestsTotal = new client.Counter({
name: 'http_requests_total',
help: 'Total number of HTTP requests',
labelNames: ['method', 'route', 'status']
});
// Middleware для сбора метрик
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
httpRequestsTotal.inc({
method: req.method,
route: req.route?.path || 'unknown',
status: res.statusCode
});
});
next();
});
// Эндпоинт для Prometheus
app.get('/metrics', async (req, res) => {
res.set('Content-Type', client.register.contentType);
res.end(await client.register.metrics());
});
app.listen(3000);
2. OpenTelemetry для Node.js
OpenTelemetry — это современный стандарт для сбора телеметрии (трассировки, метрики, логи). Для Node.js доступен пакет @opentelemetry/sdk-node. Он автоматически инструментирует популярные библиотеки (Express, HTTP, gRPC) и собирает распределённые трассы.
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const sdk = new NodeSDK({
traceExporter: new ConsoleSpanExporter(),
instrumentations: [getNodeAutoInstrumentations()]
});
sdk.start();
// Пример автоматической трассировки Express
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello'));
app.listen(3000);
3. PM2 — менеджер процессов с мониторингом
PM2 не только управляет запуском Node.js процессов, но и предоставляет встроенный мониторинг. Команда pm2 monit показывает CPU, память и количество перезапусков в реальном времени. Для продвинутого мониторинга используйте pm2-plus или pm2-metrics.
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
instances: 2,
exec_mode: 'cluster',
env: {
NODE_ENV: 'production'
}
}]
};
4. Clinic.js — профилирование и диагностика
Clinic.js — это набор инструментов для глубокого анализа производительности Node.js. Он включает Doctor (быстрая диагностика), Bubbleprof (асинхронные задержки) и Flame (flamegraph для CPU).
// Установка: npm install -g clinic
// Запуск с профилированием:
clinic doctor -- node app.js
// После остановки приложения (Ctrl+C) откроется HTML-отчёт
// Пример вывода: "CPU usage: 85%, Event loop delay: 120ms"
Дополнительные инструменты
- Express Status Monitor — веб-интерфейс для отслеживания метрик Express в реальном времени.
- Node.js Inspector — встроенный отладчик Chrome DevTools для Node.js (
node --inspect). - Log4js / Winston — структурированное