🔭

SentryのReplayを任意のタイミングで取得する

2025/03/09に公開

始めに

Sentryではフロントでエラーが発生したときに、エラーを調査しやすくなるようにReplay機能があります。この機能は非常に便利なのですが、エラーは発生していないがお客様環境で端末の性能不足やネットワーク性能不足等で正常動作しない場合を追跡できません。

その場合に、任意のタイミングでReplayを取得できる機能がありますので紹介します。

環境

  • Sentry
    • 2025/03/08時点
  • @sentry/angular
    • 8.47.0

ユースケース

  • 端末のスペックやネットワークによる不利益を調べたい
    • 特にサーバサイドで取得できないログが欲しいときに

実装

Replayの開始

※ 実運用ではreplaysOnErrorSampleRateを設定しているので明示的な開始をしていません。


SentryのReplayを記録する割合には、通常操作を記録する割合のreplaySessionSampleRateとエラー時の操作を記録する割合のreplaysOnErrorSampleRateの2種類があります。

どちらも0の場合、Replayの記録開始を明示的に行う必要があります。

Replayには2つのモードがあります。

  • sesion
    • 継続的にデータを記録してSentryに送信する。15分間または最大60分間操作がないとセッション終了し、新しいセッションが開始される。
  • buffer
    • エラーReplay時のモード。継続的にデータを記録するがSentryに送信しない。エラーを検知したらreplaysOnErrorSampleRateをチェックしてSentryに送信する。エラー発生前60秒からユーザーの操作停止して15分間または最大60分間まで記録してくれる。

Replayの開始時にどちらのモードで起動するかを選べます。

Sentry.init({
  dsn: "...",
  replaysSessionSampleRate: 0,
  replaysOnErrorSampleRate: 0,
  integrations: [Sentry.replayIntegration()],
});

const replay = Sentry.getReplay();
// This starts in `session` mode, regardless of sample rates
replay.start();
// OR
// This starts in `buffer` mode, regardless of sample rates
replay.startBuffering();

ReplayのManualでアップロード

今回の記事の一番伝えたい箇所になります。flushを行うことで、その時点でのReplayがアップロードされま
す。stopもありますが再度起動する必要がありますし、停止していてもflushを呼び出せばReplayの記録が開始されるので、こちらのほうが便利です。

記録したいタイミングでflushを呼び出してください。

const replay = Sentry.getReplay();
replay.flush();

ReplayIDの取得

既存のサービスにお問い合わせ機能がある場合、Replay IDを紐づけることができれば、お客様のテキストやスクショだけでなく、Replayを見ることでより多くの情報を得ることができます。

bufferモードのとおり、Replay開始前の60秒しか取得できないので、お問い合わせ文言を入力している最中に欲しいエラーの操作が消えてしまう可能性があるのですが、ネットワーク情報やデバイス情報等々も得られるので、ないよりはいいかなと思ってます。

個人的には綺麗なReplayを見るためにも、「お問い合わせ後操作ログを調査しますので、お手数ですが再度操作をしていただけますと迅速な解決につながります。」等々の文言も付け加えたいのですが、お客さまに対して不安を与えそうなのでできていないです。

この辺をうまく工夫している例があれば教えていただけますと幸いです。

ソースコード

なし。

終わりに

この記事を書く前はUser Feedback機能にReplayを紐づける方法で記事を書こうと思っていたのですが、自分が勉強不足だったせいで任意のタイミングでReplayを取得できるようになったのを知りませんでした。

Sentryがどんどん進化しているので、調査コストが下がっているのはありがたいです。

参考情報

Discussion