なになれ

IT系のことを記録していきます

NestJSでSentryを使う方法

最近はNestJSでWeb APIを作ってます。NestJSでは、大体以下の公式サイトにWeb APIを作成する際に必要となる機能の実装が書かれています。DBへの問い合わせやロギング処理など
Documentation | NestJS - A progressive Node.js framework

ただSentryの使い方の記述はなかったため、調べて実装してみました。エラートラッキングする際にSentryを使用すると便利なので基本的にはSentryを入れるようにしています。

やり方

探すといくつかNestJS向けのSentryのモジュールが見つかるのですが、以下が良さそうだったのでこちらで実装してみました。

github.com

npmモジュールのインストールは以下でできます。

npm install --save @ntegral/nestjs-sentry @sentry/node

そして、以下のようにNestJSのモジュールで利用します。ここではルートのモジュールであるapp.module.tsで適用します。

src/app.module.ts

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { SentryInterceptor, SentryModule } from '@ntegral/nestjs-sentry';

@Module({
  imports: [
    SentryModule.forRoot({
      dsn: process.env.SENTRY_DSN,
      debug: false,
      logLevels: ['error'],
    }),
  ],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useFactory: () => new SentryInterceptor(),
    },
  ],
})
export class AppModule {}

SentryModule.forRootで利用できます。dsn,debug,logLevelsといったSentry向けのパラメータを設定します。NestJSをWeb APIとして利用する場合、グローバルのインターセプターを利用することで全てのAPIの実行時の例外をキャッチすることができます。その部分をSentryのインターセプターにすることで例外が発生した場合にSentryにエラーを送信することができます。その部分がnew SentryInterceptor()の部分になります。

ちなみにWeb APIではなくて、スケジュール実行するプログラムの場合ではインターセプターがないので、以下のようにします。 例外をキャッチする実装とともにclient.instance().captureExceptionメソッドを利用するとSentryにエラーを送信することができます。

src/app.service.ts

...

@Injectable()
export class AppService {
  public constructor(@InjectSentry() private readonly client: SentryService) {}

  @Interval(10000)
  handleInterval() {
    try {
...
    } catch (e) {
      this.client.instance().captureException(e);
      throw e;
    }
  }
}

本番環境でSentryにエラーを送信するようにし、開発環境では送信しないといった条件分岐をしたいといったことが考えられます。
以下のdsnのパラメータを渡す際に環境変数化して、本番環境ではdsnの値を与える、開発環境では環境変数を設定しない(値をなし)とすると本番環境のみでSentryにエラーを送信することが可能です。

src/app.module.ts

...
    SentryModule.forRoot({
      dsn: process.env.SENTRY_DSN,
      debug: false,
      logLevels: ['error'],
    }),
...

まとめ

このようにSentryは簡単に導入できてエラーをトラッキングするのに優れているので導入することをオススメします。