Marcelo Zapatta
Posted on April 27, 2023
Fala galera, tudo bem? Como o Sentry não tem um suporte nativo para o framework NestJS, criei esse passo a passo de como realizar sua integração. Há alguns tutoriais utilizando Interceptors do Nest mas o correto seria utilizar as ExceptionFilter, devido o sentry capturar apenas Exceptions, além de ficar um código bem mais simples e fácil de configurar 😊
1. Primeiro crie um projeto no Sentry como NodeJS
2. Guarde a URL que foi gerada na parte do DNS:
3. Instale as dependências
yarn add @sentry/node @sentry/tracing
// or
npm install @sentry/node @sentry/tracing
4. Inclua uma chave SENTRY_DNS dentro do seu .env contendo a url do seu projeto:
Utilize a URL que foi obtida no passo 2 após a geração do projeto
SENTRY_DNS=https://xxx@xxx.ingest.sentry.io/xxx
5. Crie uma ExceptionFilter
Iremos criar uma ExceptionFilter dentro do Nest. para isso dentro de src inclua um arquivo chamado sentry.filter.ts com o seguinte conteúdo:
import { Catch, ArgumentsHost } from '@nestjs/common';
import { BaseExceptionFilter } from '@nestjs/core';
import * as Sentry from '@sentry/node';
@Catch()
export class SentryFilter extends BaseExceptionFilter {
catch(exception: unknown, host: ArgumentsHost) {
Sentry.captureException(exception);
super.catch(exception, host);
}
}
Estamos gerando uma ExceptionFilter genérica que pega qualquer tipo de Exception devido o decorator @Catch() estar vazio. Além disso estamos estendendo ela a partir da BaseExceptionFilter que é a classe padrão do Nest que lida com exceptions. Dessa forma, não iremos alterar o comportamento original quando uma exception for lançada, devido no final do código é chamado o método da classe pai que lida com as exceptions: super.catch(exception, host);
6. Incluir script do Sentry no main.ts do Nest
Agora basta chamar o método de inicialização do Sentry e realizar a importação do ExceptionFilter criado globalmente dentro do seu main.ts no método bootstrap():
// outros importers
import { HttpAdapterHost, NestFactory } from '@nestjs/core';
import * as Sentry from '@sentry/node';
import { SentryFilter } from './filters/sentry.filter';
async function bootstrap() {
// …
// Inicia o Sentry passando o DNS incluso no .env
Sentry.init({
dsn: process.env.SENTRY_DNS,
});
// Importa o filtro globalmente capturando todas as exceptions em todas as rotas
const { httpAdapter } = app.get(HttpAdapterHost);
app.useGlobalFilters(new SentryFilter(httpAdapter));
// …
}
bootstrap();
Pronto! Finalizada a configuração🎉🎉, dessa forma estamos pegando todas as exceptions do sistema mas você pode customizar o ExceptionFilter para barrar e obter apenas exceptions específicas.
Referências
Sentry docs Node.JS: https://docs.sentry.io/platforms/node/
ExceptionFilters NestJS: https://docs.nestjs.com/exception-filters
Posted on April 27, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.