Мониторинг приложений 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,
Также в библиотеке
Обработка JSON в JavaScript (Node.js): Полное руководство
Интеграция Prometheus метрик в Java: библиотека simpleclient
Планировщик задач на Go (Golang): гайд по реализации cron-задач
Rate Limiting в Swift: управление частотой запросов в iOS/macOS