Como usar / integrar o Sentry no NestJS
Tags: webdev, nestjs, sentry, node
Published: 2023-04-27 16:33:16

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ot3i5ygpp5pjefzj3eho.png)

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

![Local no sentry para pegar a URL DNS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kf2xo9lyqdefliwfe09f.png)

**3. Instale as dependências**

```javascript
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

```bash
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:

```javascript
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()_**:


```javascript
// 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