Sentryでエラーを監視できるようにしてみました
はじめに
はじめまして。アスエネ株式会社でバックエンドエンジニアをしています、吉田です。
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を加工してセットする処理とし、動作確認してみると、無事マスクがかかって表示されています。
参考
まとめ
無事に連携できて、エラーが発生した際にSentryを見れば、どこでどんなエラーが発生したか分かるようになりました。
あまりSentryにお世話にならないようにしたいですが、エラーが発生した際の調査時間削減の準備はできたと思うので、さらにチューニングしてうまく使えるようになっていきたいです。
Discussion