• 作成:

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() {}
}