mizdra's blog

ぽよぐらみんぐ

Sentry で IP アドレスの収集をやめる

@sentry/browser を使うと、ブラウザでエラーが発生した時にそのエラーを Sentry の集計サーバに送信して記録してくれます。送信されたエラーはエラーの種類ごとに Issue という単位にグルーピングされ、Issue ごとに何件発生しているのか、何人のユーザで発生しているのか、過去2週間にどれぐらいのエラー数の増減があったのか、などと簡潔に表示してくれます。便利ですね。セットアップも非常に簡単で、十数行程度のセットアップコードを書くだけで使い始めることができます。

f:id:mizdra:20210929005415p:plain
エラーが Issue ごとにグルーピングされている様子。画像は https://docs.sentry.io/product/issues/ から引用。

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 ごとのユーザ数を見ることができなくなってしまいます。

f:id:mizdra:20210929113314p:plain
ユーザが識別できなくて、ユーザ数が 0 埋めされてしまっている様子

ユーザ数はその Issue の深刻度を判断する上で非常に重要な情報ですから、これが見れないとなると Issue のトリアージが困難になってしまいます。IP アドレスの収集をやめたいとはいえ、流石にこれだと困りますね。

手動でユーザ情報を設定する

実は @sentry/browser では任意のユーザ情報を設定する Sentry.setUser という API が用意されています。これを使うと IP アドレス以外の任意のデータを、ユーザを区別するための情報として設定できるようになります。

例えば、以下のようにページアクセスの度にランダムで生成した文字列を id として設定しておけば、とりあえずユーザ数は表示されるようになります。もしセッションを跨いでも同じユーザであると判定したければ、localStorageid を保存しておけば良いです。

/** 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 アドレスを収集していないプロジェクトをやっていて、同様の問題でお困りの方が居ましたら、ぜひお試しください。

ポケットモンスター・ポケモン・Pokémon・は任天堂・クリーチャーズ・ゲームフリークの登録商標です.

当ブログは @mizdra 個人により運営されており, 株式会社ポケモン及びその関連会社とは一切関係ありません.