Monitoramento de aplicações TypeScript: de erros a desempenho
O monitoramento de aplicações TypeScript é um conjunto de práticas e ferramentas que garantem a observabilidade (observability) do sistema em tempo real. Diferentemente do registro simples, o monitoramento profissional inclui coleta de métricas, rastreamento de requisições, agregação de erros e notificação automática. Para TypeScript, que roda tanto no servidor (Node.js) quanto no navegador, é fundamental ter um sistema de observação unificado. Neste artigo, abordaremos as principais ferramentas e exemplos de sua integração.
Por que monitorar aplicações TypeScript?
TypeScript é compilado para JavaScript, o que impõe particularidades na depuração. O código-fonte com tipos se transforma em JS dinâmico, e erros de tipo podem se manifestar apenas em tempo de execução. Sem monitoramento, você corre o risco de:
- Perder um
TypeErrorouReferenceErrorem produção - Não perceber degradação de desempenho (requisições lentas, vazamentos de memória)
- Perder o contexto do erro (stack trace, dados do usuário, ambiente)
Componentes principais de um sistema de monitoramento
O stack moderno de monitoramento é construído sobre três pilares: logs, métricas (metrics) e traces. Para aplicações TypeScript, veremos bibliotecas específicas:
1. Sentry — o rei do rastreamento de erros
Sentry é uma plataforma SaaS para monitoramento de erros e desempenho. Para TypeScript, estão disponíveis os pacotes oficiais @sentry/node e @sentry/react. Ele captura automaticamente exceções, coleta stack traces e contexto.
Instalação:
npm install @sentry/node @sentry/tracingInicialização básica em 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, // frequência de coleta de traces (0-1) profilesSampleRate: 1.0, // perfilamento de desempenho});
// Chamada manual em caso de erroapp.get('/api/users', async (req, res) => { try { const users = await getUsers(); res.json(users); } catch (error) { Sentry.captureException(error); res.status(500).send('Internal Server Error'); }});Vantagens:
- Vinculação automática de erros a versões
- Suporte a source maps para TypeScript
- Desempenho: monitoramento de transações lentas
2. OpenTelemetry — padrão de observability
OpenTelemetry (OTel) é um padrão aberto para coleta de telemetria. Para TypeScript, utiliza-se o pacote @opentelemetry/sdk-node. OTel permite coletar traces e métricas e, em seguida, enviá-los para qualquer sistema (Jaeger, Prometheus, Datadog).
Exemplo de integração com Express:
import { NodeSDK } from '@opentelemetry/sdk-node';import { getNodeAutoInstrumentations } from '@opentelemetry/instrumentation-node';
const sdk = new NodeSDK({ instrumentations: [getNodeAutoInstrumentations()], // exportador pode ser configurado para OTLP ou console});
sdk.start();
// Toda a lógica do Express é rastreada automaticamenteimport express from 'express';const app = express();app.get('/data', (req, res) => { res.json({ status: 'ok' });});OpenTelemetry instrumenta automaticamente bibliotecas populares: Express, MongoDB, Redis, gRPC. Isso fornece uma visão completa do percurso da requisição através dos serviços.
3. Prometheus + Grafana — métricas e visualização
Para coleta de métricas (RPS, latência, erros) em TypeScript, utiliza-se a biblioteca