Prometheus метрики в Node.js: библиотека prom-client

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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 поддерживает множество дополнительных функций:

  • Кастомные регистры — можно создавать

Рекомендаций