Como usar / integrar o Sentry no NestJS

marcelozapatta

Marcelo Zapatta

Posted on April 27, 2023

Como usar / integrar o Sentry no NestJS

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

Página do sentry para criar um projeto

2. Guarde a URL que foi gerada na parte do DNS:

Local no sentry para pegar a URL DNS

3. Instale as dependências



yarn add @sentry/node @sentry/tracing

// or

npm install @sentry/node @sentry/tracing


Enter fullscreen mode Exit fullscreen mode

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


Enter fullscreen mode Exit fullscreen mode

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);
  }
}


Enter fullscreen mode Exit fullscreen mode

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();


Enter fullscreen mode Exit fullscreen mode

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

💖 💪 🙅 🚩
marcelozapatta
Marcelo Zapatta

Posted on April 27, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related