🐡

Sentryでエラーを監視できるようにしてみました

2023/09/15に公開

はじめに

はじめまして。アスエネ株式会社でバックエンドエンジニアをしています、吉田です。
Node.js(Express)の環境でSentryによる監視ができるようにしてみました。
最低限の対応なので、今後カスタムしつつ運用していきたいです。

やったこと

【準備】

SentryでDSNを発行する

DSN(Data Source Name)とはどのプロジェクトに通知をするかのキーとなるものです。
今回は、Sentryの設定画面のProjectsから[Create Project]でプロジェクトを追加して、DSNを発行しました。

【ソースの修正】

パッケージを追加する

@sentry/node を追加します。

Sentryを初期化する

公式のドキュメント(参考のリンクを参照)を見ると、なるべく早く初期化した方がよいとのことで、今回はサーバー初期処理の中に追記しました。

sentry.init({
  dsn: process.env.SENTRY_DSN, // dsn(最低限これだけあればOK)
  environment: process.env.APP_ENV,  // 環境
  beforeSend(event) {
    // requestbodyの特定の内容をマスキング処理する
    if (event?.request?.data) {
      event.request.data = [requestbodyのJSONのキーを判断し、マスクする処理]
    }
    return event;
  }
});

リクエストハンドラ、エラーハンドラを登録する

middlewareロード時にSenty用のハンドラを登録しました。

import * as sentry from "@sentry/node";

@Configuration({
  middlewares: [
    sentry.Handlers.requestHandler() as RequestHandler, // 追加
    sentry.Handlers.errorHandler() as ErrorRequestHandler, // 追加
    cors(),
    cookieParser(),
    compress({}),
    methodOverride(),
  ]
...

補足

今回はSentryにパスワードなど、秘匿情報を渡したくなかったので、sentryの初期化処理内にて、beforeSendを使って、マスク処理を追加しています。

Sentry側で秘匿情報にfilterをかけるという方法もあり、

[project] > setting > Security & Privacy を開いてAdditional Sensitive Fields に秘匿情報のフィルタをかければ、sentryのエラー画面上はその項目がマスクされます。

もしくは、requestbodyをそもそもSentryへ送らないという場合は以下記述で対応できました。

integrations: [
  new sentry.Integrations.RequestData({
    include: { data: false, headers: true } // ヘッダは含むが、bodyは除く
  })
]

結果

エラーが連携されました!

マスク処理のテストとして、requestbodyの「address1」と「firstName」にマスク処理がかかるようにevent.request.dataを加工してセットする処理とし、動作確認してみると、無事マスクがかかって表示されています。

参考

https://docs.sentry.io/platforms/node/guides/express/

まとめ

無事に連携できて、エラーが発生した際にSentryを見れば、どこでどんなエラーが発生したか分かるようになりました。

あまりSentryにお世話にならないようにしたいですが、エラーが発生した際の調査時間削減の準備はできたと思うので、さらにチューニングしてうまく使えるようになっていきたいです。

Discussion