Nest.js に React.js 版パッケージの Sentry を導入する

Nest.js に React.js 版パッケージの Sentry を導入する

January 23, 2022

Sentry には Next.js 用のパッケージがありますが、ここでは React.js 版のパッケージを導入します。

Next.js 用パッケージの説明にもありますが、Next.js 版は @sentry/react@sentry/node をラッピングしたものです。

This package is a wrapper around @sentry/node for the server and @sentry/react for the client, with added functionality related to Next.js.

@sentry/nextjs - npm

Next.js は クライアントおよびサーバサイドで動かすことが標準なので、両環境に対応したパッケージとなっています。

私は Next.js をクライアントサイドのみで使用しているため、その場合は React.js 版の @sentry/react で十分です。

FYI:

パッケージをインストールする #

パッケージをインストールします。

npm i @sentry/react @sentry/tracing

使用例 #

これは公式の React でのサンプル例です。以下のように初期化処理を行います。

import React from 'react';
import ReactDOM from 'react-dom';
import * as Sentry from '@sentry/react';
import { Integrations } from '@sentry/tracing';
import App from './App';

Sentry.init({
  dsn: 'https://abcdefghijklmnopqrstuvwxyz012345678999999.ingest.sentry.io/0123456',
  integrations: [new Integrations.BrowserTracing()],

  // Set tracesSampleRate to 1.0 to capture 100%
  // of transactions for performance monitoring.
  // We recommend adjusting this value in production
  tracesSampleRate: 1.0,
});

ReactDOM.render(<App />, document.getElementById('root'));

// Can also use with React Concurrent Mode
// ReactDOM.createRoot(document.getElementById('root')).render(<App />);

あとはコンポーネントのなかでエラーを throw したり、通知用のメソッドを呼び出せば Sentry に通知されます。

なお、DSN は Data Source Name の略のようです。データの発生元の意ですが、Sentry のどのプロジェクトに対してエラーを報告するかと捉えた方がわかりやすいかもしれません。つまりここに自分のプロジェクトの DSN を指定します。

Data Source Name (DSN) | Sentry Documentation

DSN は Sentry の設定画面から確認できます。

使用確認 #

さっそく使用してみます。

import * as Sentry from '@sentry/react';
import { Integrations } from '@sentry/tracing';

const SENTRY_DSN = 'https://abcdefghijklmnopqrstuvwxyz012345678999999.ingest.sentry.io/0123456';

export class Logger {
  public static init = () => {
    Sentry.init({
      dsn: SENTRY_DSN,
      integrations: [new Integrations.BrowserTracing()],
      tracesSampleRate: 1.0,
    });
  };

  public static error = (e?: Error) => {
    Sentry.captureException(e);
  };
}

そして _app.tsxLogger.init() を実行します。

その後は各コンポーネントの中でエラーを通知します。

エラーを throw すると自動的に Sentry に通知されるほか、throw 以外で通知したいケースは Logger.error() を使用します。

useEffect(() => {
  throw new Error('Report an error automatically.');
}, []);
useEffect(() => {
  Sentry.error(new Error('Report an error manually.'));
}, []);

補足 #

実際には本番環境からのみエラーを通知し、開発環境では通知を止めたいはずです。その場合は Sentry.init()dsnundefined か空文字 "" を渡します。これでエラーは通知されません。