Мониторинг TypeScript приложений: метрики и алерты

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

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

Начать курс

Мониторинг 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 поддерживает множество каналов: