ReduxのMiddlewareを使ってSentryにReduxのstate情報を送りつける

Sentryというエラー収集サービスがあります.

ここには例外などが収集されるのですが,エラーが起きたときのReduxのstateが入るとエラー調査に役立ちますね.

SentryにはSentry.setExtraContext(旧版ではSentryClient.setContext)という関数があって,ここに任意のJSONを入れることが出来ます.

しかし,適当に初期化時に設定しても,初期状態のstateが入るだけで何も役に立ちません.

onFatalError関数を追加すればエラー時にフックをかけることが出来るようですが,今使っている@sentry/electron 0.4.1ではこのオプションが無いことがわかりました.

そして最新版はエラーになって使えないという事情があります.I update to 0.5.4, error on MODULE_NOT_FOUND · Issue #81 · getsentry/sentry-electron

なので,ReduxのMiddlewareを使ってstateが更新されるたびにSentryClient.setContextすることでデータを付加するようにしました.

ミドルウェアは以下のようになりました.

const setSentryExtraContextRedux = store => next => action => {
  next(action);
  SentryClient.setContext({
    extra: { action, state: store.getState() },
  });
};

これでSentryのエラーダッシュボードにReduxのactionとstateが含まれます.

jestがSentry起動しようとしてエラー出すようになったので以下のモックで黙殺するようにしました.

"@sentry/electron": "<rootDir>/__mocks__/@sentry/electron.js"
/* eslint-disable import/prefer-default-export */
// jestがelectron起動せずにreduxをテストするので,ダミーのSentryAPIを用意する
export class SentryClient {
  static setContext() {}
}
このエントリーをはてなブックマークに追加 fb-like g-plusone pocket