Мониторинг TypeScript-приложений: библиотеки, инструменты и настройка

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

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

Начать курс

Мониторинг приложений TypeScript: полное руководство по инструментам и библиотекам

Мониторинг — это неотъемлемая часть разработки современных веб-приложений на TypeScript. Без него вы работаете вслепую: ошибки остаются незамеченными, производительность падает, а пользователи уходят. В этой статье мы разберем ключевые библиотеки и инструменты для мониторинга TypeScript-приложений, включая Sentry, OpenTelemetry, Prometheus и встроенное логирование. Вы узнаете, как настроить сбор ошибок, метрик и трассировку в реальном времени.

1. Sentry: отслеживание ошибок в реальном времени

Sentry — это самая популярная платформа для мониторинга ошибок. Она поддерживает TypeScript из коробки и позволяет ловить исключения, логировать контекст выполнения и получать уведомления о падениях.

Установка и базовая настройка

npm install @sentry/node @sentry/tracing

Пример инициализации Sentry в TypeScript-приложении на Node.js:

import * as Sentry from "@sentry/node";
import { ProfilingIntegration } from "@sentry/profiling-node";

Sentry.init({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
  integrations: [
    new ProfilingIntegration(),
  ],
  tracesSampleRate: 1.0,
  profilesSampleRate: 1.0,
});

// Принудительная отправка ошибки
app.get("/debug-sentry", function mainHandler(req, res) {
  throw new Error("Тестовая ошибка Sentry!");
});

Логирование контекста

Sentry позволяет добавлять пользовательские теги и контекст:

Sentry.setUser({ email: "user@example.com" });
Sentry.setTag("environment", "production");
Sentry.captureException(new Error("Ошибка при обработке заказа"));

2. OpenTelemetry: стандарт для трассировки и метрик

OpenTelemetry — это открытый стандарт для сбора телеметрии: трейсов, метрик и логов. Он поддерживает TypeScript и легко интегрируется с любыми бэкендами (Jaeger, Zipkin, Prometheus).

Установка пакетов

npm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/instrumentation-http @opentelemetry/instrumentation-express

Пример настройки трассировки

import { NodeSDK } from "@opentelemetry/sdk-node";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { ConsoleSpanExporter } from "@opentelemetry/sdk-trace-node";

const sdk = new NodeSDK({
  traceExporter: new ConsoleSpanExporter(),
  instrumentations: [getNodeAutoInstrumentations()],
});

sdk.start();

Теперь каждый HTTP-запрос будет автоматически обернут в спан (span) с метаданными. Вы можете добавить кастомные спаны:

import { trace } from "@opentelemetry/api";

const tracer = trace.getTracer("my-service");

app.get("/api/data", async (req, res) => {
  const span = tracer.startSpan("processData");
  try {
    const data = await fetchData();
    span.setAttribute("data.size", data.length);
    res.json(data);
  } finally {
    span.end();
  }
});

3. Prometheus + express-prom-bundle: метрики для Node.js

Для сбора метрик производительности (RPS, время ответа, количество ошибок) используйте Prometheus в связке с библиотекой express-prom-bundle. Она автоматически собирает метрики с Express-приложений.

Установка

npm install prom-client express-prom-bundle

Пример настройки

import express from "express";
import promBundle from "express-prom-bundle";

const app = express();

const metricsMiddleware = promBundle({
  includeMethod: true,
  includePath: true,
  includeStatusCode: true,
  customLabels: { project: "my-app" },
  metricsPath: "/metrics",
});

app.use(metricsMiddleware);

app.get("/hello", (req, res) => {
  res.send("Hello World");
});

app.listen(3000);

Теперь по адресу /metrics будут доступны метрики в формате Prometheus:

http_requests_total{method="GET",path="/hello",status="200",project="my-app"} 42
http_request_duration_seconds_sum{method="GET",path="/hello"} 0.53

4. Встроенное логирование: Winston и Pino

Для структурированного логирования используйте Winston или Pino. Они поддерживают TypeScript и позволяют выводить логи в консоль, файлы или внешние системы (Elasticsearch,

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