Мониторинг приложений TypeScript: от диагностики до observability
Разработка на TypeScript сегодня охватывает как серверную часть (Node.js, Deno, Bun), так и клиентскую (React, Angular, Vue). Однако чем сложнее приложение, тем важнее понимать, что происходит в production. Мониторинг TypeScript-приложений — это не просто сбор логов, а полноценная система observability, включающая метрики, трейсинг и алерты. В этой статье разберём ключевые библиотеки и подходы для настройки мониторинга.
Почему TypeScript требует особого подхода
TypeScript компилируется в JavaScript, поэтому стандартные инструменты для JS работают и с TS. Однако есть нюансы:
- Стек ошибок может указывать на скомпилированный код, а не на исходный TS.
- Source maps обязательны для корректного трейсинга ошибок.
- Типизация позволяет более точно аннотировать метрики и спаны.
1. Sentry — король ошибок для фронтенда и бэкенда
Sentry — самая популярная платформа для отслеживания ошибок и производительности. Для TypeScript есть официальный SDK.
Установка:
npm install @sentry/node @sentry/tracing
# или для React:
npm install @sentry/react @sentry/tracing
Пример для 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, // профилирование
});
// Автоматический capture ошибок
app.get("/api/data", async (req, res) => {
try {
const data = await fetchData();
res.json(data);
} catch (err) {
Sentry.captureException(err);
res.status(500).send("Error");
}
});
Особенности для TypeScript:
- Поддержка source maps: загружайте их через
sentry-cliили плагин webpack. - Типизация: SDK экспортирует типы для всех методов.
- Профилирование: видно, какие функции тормозят.
2. OpenTelemetry — универсальный стандарт observability
OpenTelemetry (OTel) — это набор API и SDK для сбора трейсов, метрик и логов. Отлично подходит для микросервисов на TypeScript.
Установка:
npm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/instrumentation-http @opentelemetry/instrumentation-express
Пример настройки трейсинга:
import { NodeSDK } from "@opentelemetry/sdk-node";
import { ConsoleSpanExporter } from "@opentelemetry/sdk-trace-node";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
const sdk = new NodeSDK({
traceExporter: new ConsoleSpanExporter(),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();
// Приложение
import express from "express";
const app = express();
app.get("/", (req, res) => {
res.send("Hello OTel!");
});
app.listen(3000);
Преимущества:
- Вендор-нейтральность: данные можно отправлять в Jaeger, Zipkin, Datadog, Grafana.
- Автоматическая инструментация популярных библиотек (Express, gRPC, MongoDB).
- TypeScript-first: все SDK написаны на TS с полной типизацией.
3. Prometheus + клиент для метрик
Для сбора метрик (RPS, latency, memory) используйте Prometheus с клиентом prom-client.
Установка:
npm install prom-client
Пример с Express и TypeScript:
import express from "express";
import client from "prom-client";
const app = express();
const register = new client.Registry();
client.collectDefaultMetrics({ register });
const httpRequestDuration = new client.Histogram({
name: "http_request_duration_seconds",
help: "Duration of HTTP requests in seconds",
labelNames: ["method", "route", "status"],
buckets: [0.1, 0.5, 1, 2, 5],
});
register.registerMetric(httpRequestDuration);
app.get("/metrics", async (req, res) => {
res.set("Content-Type", register.contentType);
res.end(await