Prometheus метрики в Node.js: библиотека prom-client
Prometheus — это мощная система мониторинга и оповещения с открытым исходным кодом, которая собирает метрики из ваших приложений и инфраструктуры. Для интеграции Prometheus с Node.js приложениями существует официальная и наиболее популярная библиотека prom-client. Она предоставляет готовые инструменты для создания, регистрации и экспорта метрик в формате, который понимает Prometheus.
В этой статье мы подробно разберем, как установить и использовать prom-client, какие типы метрик доступны, и как настроить эндпоинт для сбора данных.
Установка prom-client
Установка библиотеки выполняется стандартным менеджером пакетов npm:
npm install prom-client
После установки вы можете импортировать библиотеку в свой проект:
const client = require('prom-client');
Основные типы метрик Prometheus
Prometheus поддерживает четыре основных типа метрик, каждый из которых решает свою задачу:
- Counter — счетчик, который может только увеличиваться (например, количество запросов, ошибок).
- Gauge — значение, которое может как увеличиваться, так и уменьшаться (например, количество активных пользователей, объем памяти).
- Histogram — гистограмма для измерения распределения значений (например, время ответа запросов).
- Summary — аналогичен гистограмме, но вычисляет квантили на стороне приложения.
Примеры использования prom-client
Рассмотрим создание каждого типа метрики на примере простого Express-приложения.
1. Counter (счетчик)
Счетчик идеально подходит для подсчета количества событий, таких как HTTP-запросы или ошибки.
const httpRequestsCounter = new client.Counter({
name: 'http_requests_total',
help: 'Total number of HTTP requests',
labelNames: ['method', 'status']
});
// Использование:
httpRequestsCounter.inc({ method: 'GET', status: 200 });
httpRequestsCounter.inc({ method: 'POST', status: 500 });
2. Gauge (измеритель)
Gauge позволяет отслеживать текущее значение, которое может меняться в обе стороны.
const activeUsersGauge = new client.Gauge({
name: 'active_users',
help: 'Number of active users'
});
// Увеличить на 1:
activeUsersGauge.inc();
// Уменьшить на 1:
activeUsersGauge.dec();
// Установить конкретное значение:
activeUsersGauge.set(42);
3. Histogram (гистограмма)
Гистограмма помогает анализировать распределение времени выполнения операций.
const requestDurationHistogram = new client.Histogram({
name: 'http_request_duration_seconds',
help: 'Duration of HTTP requests in seconds',
labelNames: ['method', 'route'],
buckets: [0.1, 0.5, 1, 2, 5] // границы корзин (в секундах)
});
// Замер времени:
const end = requestDurationHistogram.startTimer();
// ... выполнение запроса ...
end({ method: 'GET', route: '/api/users' });
4. Summary (суммарий)
Summary похож на гистограмму, но предоставляет точные квантили (например, медиану, 95-й процентиль).
const requestDurationSummary = new client.Summary({
name: 'http_request_duration_summary_seconds',
help: 'Summary of HTTP request duration in seconds',
labelNames: ['method', 'route'],
percentiles: [0.5, 0.9, 0.99] // квантили для расчета
});
// Использование аналогично гистограмме:
const endSummary = requestDurationSummary.startTimer();
// ... выполнение запроса ...
endSummary({ method: 'GET', route: '/api/data' });
Настройка эндпоинта для Prometheus
Чтобы Prometheus мог собирать метрики, необходимо создать отдельный HTTP-эндпоинт (обычно /metrics), который будет возвращать данные в формате, понятном Prometheus.
const express = require('express');
const client = require('prom-client');
const app = express();
const port = 3000;
// Включаем сбор дефолтных метрик Node.js (память, процессор и т.д.)
client.collectDefaultMetrics();
// Эндпоинт для Prometheus
app.get('/metrics', async (req, res) => {
res.set('Content-Type', client.register.contentType);
res.end(await client.register.metrics());
});
app.listen(port, () => {
console.log(`Server running on http://localhost:${port}`);
});
После запуска сервера, перейдя по адресу http://localhost:3000/metrics, вы увидите все зарегистрированные метрики в текстовом формате, который парсит Prometheus.
Продвинутые возможности
Библиотека prom-client поддерживает множество дополнительных функций:
- Кастомные регистры — можно создавать
Также в библиотеке
GraphQL библиотека для Go (Golang) — полное руководство
Логирование в JavaScript (Node.js): лучшие решения для вашего проекта
Валидация данных в Swift: библиотека Validator