Prometheus метрики в TypeScript: полное руководство по мониторингу

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

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

Начать курс

Prometheus метрики в TypeScript: полное руководство

Prometheus — это система с открытым исходным кодом для мониторинга и оповещения, которая собирает метрики из ваших приложений в реальном времени. В этой статье мы рассмотрим, как интегрировать Prometheus метрики в TypeScript-приложения, используя библиотеку prom-client. Вы узнаете, как создавать, регистрировать и экспортировать метрики, а также как настроить эндпоинт для сбора данных.

Что такое Prometheus метрики?

Prometheus работает по принципу pull-модели: он периодически опрашивает (scrape) эндпоинты вашего приложения, чтобы получить метрики. Метрики делятся на несколько основных типов:

  • Counter (счетчик) — только увеличивается (например, количество запросов).
  • Gauge (датчик) — может увеличиваться и уменьшаться (например, текущее количество активных пользователей).
  • Histogram (гистограмма) — измеряет распределение значений (например, время ответа).
  • Summary (сводка) — похожа на гистограмму, но вычисляет квантили на стороне клиента.

Установка prom-client в TypeScript

Для работы с Prometheus в TypeScript мы будем использовать официальную библиотеку prom-client. Установите её через npm:

npm install prom-client

Также установите типы для TypeScript:

npm install @types/prom-client --save-dev

Создание и регистрация метрик

Рассмотрим базовый пример создания метрик. Создадим файл metrics.ts:

import client from 'prom-client';

// Создаем регистр для метрик (по умолчанию используется глобальный)
const register = new client.Registry();

// Добавляем дефолтные метрики (например, память, CPU)
client.collectDefaultMetrics({ register });

// Создаем Counter для подсчета запросов
const httpRequestsTotal = new client.Counter({
  name: 'http_requests_total',
  help: 'Total number of HTTP requests',
  labelNames: ['method', 'status', 'path'],
  registers: [register],
});

// Создаем Gauge для активных подключений
const activeConnections = new client.Gauge({
  name: 'active_connections',
  help: 'Number of active connections',
  registers: [register],
});

// Создаем Histogram для времени ответа
const httpRequestDuration = new client.Histogram({
  name: 'http_request_duration_seconds',
  help: 'Duration of HTTP requests in seconds',
  labelNames: ['method', 'path'],
  buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],
  registers: [register],
});

export { register, httpRequestsTotal, activeConnections, httpRequestDuration };

Использование метрик в Express приложении

Теперь создадим простое Express-приложение на TypeScript, которое будет использовать наши метрики:

import express from 'express';
import { register, httpRequestsTotal, activeConnections, httpRequestDuration } from './metrics';

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

// Middleware для подсчета времени запроса
app.use((req, res, next) => {
  const end = httpRequestDuration.startTimer({ method: req.method, path: req.path });
  activeConnections.inc();

  res.on('finish', () => {
    httpRequestsTotal.inc({ method: req.method, status: res.statusCode.toString(), path: req.path });
    activeConnections.dec();
    end();
  });

  next();
});

// Эндпоинт для Prometheus
app.get('/metrics', async (req, res) => {
  res.set('Content-Type', register.contentType);
  res.end(await register.metrics());
});

// Пример эндпоинта
app.get('/', (req, res) => {
  res.send('Hello, Prometheus!');
});

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

Запуск и проверка

Запустите приложение:

npx ts-node app.ts

Откройте в браузере http://localhost:3000/metrics. Вы должны увидеть что-то вроде:

# HELP http_requests_total Total number of HTTP requests
# TYPE http_requests_total counter
http_requests_total{method="GET",status="200",path="/"} 1
# HELP active_connections Number of active connections
# TYPE active_connections gauge
active_connections 0
# HELP http_request_duration_seconds Duration of HTTP requests in seconds
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{le="0.01"} 0
http_request_duration_seconds_bucket{le="0.05"} 1
http_request_duration_seconds_bucket{le="0.1"} 1
# ... остальные метрики

Продвинутые возможности

Библиотека prom-client поддерживает и более сложные сценарии:

  • Summary — для точных квантилей (например, p99

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