Мониторинг TypeScript приложений: метрики и алерты
В современной веб-разработке мониторинг TypeScript приложений — это не роскошь, а необходимость. Без него вы рискуете узнать о сбое только от пользователей. В этой статье мы разберем, как настроить эффективный мониторинг для TypeScript-проектов, какие метрики отслеживать и как настроить алерты, чтобы получать уведомления о проблемах до того, как они станут критическими.
Почему мониторинг TypeScript приложений так важен?
TypeScript, будучи надстройкой над JavaScript, часто используется для создания сложных корпоративных систем и серверных решений на Node.js. Однако динамическая природа JavaScript под капотом может приводить к неожиданным ошибкам времени выполнения. Мониторинг позволяет:
- Обнаруживать проблемы на ранней стадии — до того, как они повлияют на пользователей.
- Анализировать производительность — выявлять узкие места в коде.
- Прогнозировать отказы — на основе трендов метрик.
- Улучшать качество кода — понимать, какие модули самые "проблемные".
Ключевые метрики для TypeScript приложений
Чтобы мониторинг был эффективным, нужно собирать правильные метрики. Разделим их на три основные группы.
1. Технические метрики (RED-метод)
Подход RED (Rate, Errors, Duration) идеально подходит для микросервисов и API:
- Rate (частота запросов) — количество запросов в секунду (RPS).
- Errors (ошибки) — процент ошибок (4xx, 5xx).
- Duration (время ответа) — время обработки запроса (p50, p95, p99).
Пример сбора метрик с помощью библиотеки prom-client:
import client from 'prom-client';
import express from 'express';
const app = express();
// Создаем метрики
const httpRequestDuration = new client.Histogram({
name: 'http_request_duration_seconds',
help: 'Duration of HTTP requests in seconds',
labelNames: ['method', 'route', 'status_code'],
buckets: [0.1, 0.5, 1, 2, 5]
});
const httpRequestsTotal = new client.Counter({
name: 'http_requests_total',
help: 'Total number of HTTP requests',
labelNames: ['method', 'route', 'status_code']
});
// Middleware для сбора метрик
app.use((req, res, next) => {
const end = httpRequestDuration.startTimer();
res.on('finish', () => {
const labels = { method: req.method, route: req.path, status_code: res.statusCode };
httpRequestsTotal.inc(labels);
end(labels);
});
next();
});
// Endpoint для Prometheus
app.get('/metrics', async (req, res) => {
res.set('Content-Type', client.register.contentType);
res.end(await client.register.metrics());
});
app.listen(3000, () => console.log('Server running on port 3000'));
2. Бизнес-метрики
Эти метрики отражают здоровье бизнеса:
- Количество успешных транзакций.
- Средний размер корзины (для e-commerce).
- Время отклика базы данных.
- Количество активных пользователей.
Пример кастомной метрики для отслеживания заказов:
const ordersCreated = new client.Counter({
name: 'orders_created_total',
help: 'Total number of orders created',
labelNames: ['status']
});
// Где-то в коде
export function createOrder(data: OrderData): Order {
// логика создания заказа
ordersCreated.inc({ status: 'success' });
return order;
}
3. Метрики инфраструктуры
Для Node.js/TypeScript приложений критичны:
- Использование памяти (heap, RSS).
- Загрузка CPU.
- Количество открытых файловых дескрипторов.
- Количество активных соединений.
- Сборка мусора (GC).
Пример сбора метрик памяти:
const memoryUsage = new client.Gauge({
name: 'node_memory_usage_bytes',
help: 'Memory usage in bytes',
labelNames: ['type']
});
// Обновляем каждые 10 секунд
setInterval(() => {
const usage = process.memoryUsage();
memoryUsage.set({ type: 'rss' }, usage.rss);
memoryUsage.set({ type: 'heapTotal' }, usage.heapTotal);
memoryUsage.set({ type: 'heapUsed' }, usage.heapUsed);
memoryUsage.set({ type: 'external' }, usage.external);
}, 10000);
Настройка алертов: от метрик к действиям
Собирать метрики — полдела. Важно настроить алерты, которые оповестят вас о проблемах. Рассмотрим настройку на базе Prometheus и Alertmanager.
Правила алертов в Prometheus
Создайте файл alerts.yml:
groups:
- name: typescript_alerts
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status_code=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "High error rate ({{ $value | humanizePercentage }})"
description: "Error rate for {{ $labels.route }} is {{ $value | humanizePercentage }}"
- alert: MemoryUsageHigh
expr: node_memory_usage_bytes{type="heapUsed"} / node_memory_usage_bytes{type="heapTotal"} > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "Memory usage above 80%"
description: "Heap usage is {{ $value | humanizePercentage }}"
- alert: HighResponseTime
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 2
for: 3m
labels:
severity: warning
annotations:
summary: "High response time (p95 > 2s)"
description: "p95 response time for {{ $labels.route }} is {{ $value }}s"
Каналы оповещений
Alertmanager поддерживает множество каналов:
- Email — классика, но медленно.
- Slack/Telegram — быстрые уведомления для команды.
Блоги
Рекомендаций по книгам
Читайте также
GraphQL API с Go: пошаговый туториал для начинающих