@sentry/browser を使うと、ブラウザでエラーが発生した時にそのエラーを Sentry の集計サーバに送信して記録してくれます。送信されたエラーはエラーの種類ごとに Issue という単位にグルーピングされ、Issue ごとに何件発生しているのか、何人のユーザで発生しているのか、過去2週間にどれぐらいのエラー数の増減があったのか、などと簡潔に表示してくれます。便利ですね。セットアップも非常に簡単で、十数行程度のセットアップコードを書くだけで使い始めることができます。
IP アドレス の収集をやめる
ところでこのエラーが発生したユーザ数 (画像の USERS
のカラムの部分) なのですが、デフォルトではエラーの送信元の IP アドレスを元に割り出しています。ブラウザから Sentry の集計サーバにエラーが送信されると、集計サーバ側で送信元の IP アドレスを取得し、それをキーにユーザを識別しています *1。何もしなくても勝手にユーザ識別してくれて便利ですね。
一方でプロダクトによっては諸事情で IP アドレスの収集をやめたいということもあると思います。実は管理画面から IP アドレスの収集をやめるオプションがちゃんと用意されています。
- プロジェクトごとに収集停止する場合
Settings -> オーガニゼーション -> プロジェクト -> セキュリティとプライバシー > Prevent Storing of IP Addresses
を ON に
- オーガニゼーション全体で収集停止する場合
Settings -> オーガニゼーション -> セキュリティとプライバシー > Prevent Storing of IP Addresses
を ON に- オーガニゼーション全体で収集停止すると、オーガニゼーション全体で強制的に収集停止になりプロジェクトごとに ON/OFF の切り替えさえできなくなってしまうので注意してください
IP アドレスの収集停止による弊害
IP アドレスの収集をやめると、Sentry からユーザを識別できなくなってしまいます。その結果として当然といえば当然なのですが、Issue ごとのユーザ数を見ることができなくなってしまいます。
ユーザ数はその Issue の深刻度を判断する上で非常に重要な情報ですから、これが見れないとなると Issue のトリアージが困難になってしまいます。IP アドレスの収集をやめたいとはいえ、流石にこれだと困りますね。
手動でユーザ情報を設定する
実は @sentry/browser では任意のユーザ情報を設定する Sentry.setUser
という API が用意されています。これを使うと IP アドレス以外の任意のデータを、ユーザを区別するための情報として設定できるようになります。
例えば、以下のようにページアクセスの度にランダムで生成した文字列を id
として設定しておけば、とりあえずユーザ数は表示されるようになります。もしセッションを跨いでも同じユーザであると判定したければ、localStorage
に id
を保存しておけば良いです。
/** 0 以上 max 未満の整数をランダムで返す */ function getRandomInt(max: number): number { return Math.floor(Math.random() * max); } // Sentry SDK の初期化 Sentry.init({ // ... }); // ユーザ情報をセット Sentry.setUser({ id: getRandomInt(0xffff_ffff).toString() });
もし IP アドレスを収集していないプロジェクトをやっていて、同様の問題でお困りの方が居ましたら、ぜひお試しください。