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
Также в библиотеке
Кэширование в Kotlin: Redis, Caffeine и другие решения
Event Bus и паттерн Observer в JavaScript (Node.js): реализация и примеры
Ramsey/UUID для PHP: полное руководство с примерами
Hilt/Dagger для Kotlin: полное руководство с примерами