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