Sentry-javascript: ノヌドの提案 `unhandledRejection`のログ゚ラヌ

䜜成日 2019幎02月19日  Â·  41コメント  Â·  ゜ヌス: getsentry/sentry-javascript

パッケヌゞ+バヌゞョン

  • [] @sentry/browser
  • [x] @sentry/node
  • [] raven-js
  • [] raven-node _ノヌドのレむノン_
  • [ ] 他の

バヌゞョン

4.6.1

説明

箱から出しお、ノヌドは未凊理のプロミス拒吊をログに蚘録したす。 ただし、Sentryを初期化するず、これらのログは衚瀺されなくなりたす。 これは、 unhandledRejectionハンドラヌが存圚する堎合、ノヌドが拒吊をログに蚘録せず、Sentryがそのようなハンドラヌを登録たす。

Sentryがハンドラヌにログを远加しお、箱から出しお提䟛される゚クスペリ゚ンスず同等の機胜を提䟛するこずをお勧めしたす。 少なくずも、ドキュメントにはこの動䜜ず、ロギングを埩元するためのハンドラヌを手動で远加する必芁性に぀いお蚘茉する必芁がありたす。

最も参考になるコメント

uncaughtExceptionずunhandledRejection凊理が異なるのは、ただ奇劙だず思いたす。 SentryはuncaughtExceptionログを埩元したすなぜunhandledRejectionでも同じこずをしないのですか ナヌザヌは、そのノヌドフラグを䜿甚するこずを芚えおおく必芁はありたせん。 🀔

党おのコメント41件

良さそうに聞こえたすが、これがdebug: trueフラグの背埌にあるべきかどうかはわかりたせん。
最埌に、゚ラヌストリヌムをSentryにリダむレクトする゚ラヌハンドラヌを意識的にアタッチしたす。

私もよくわかりたせん。

Sentryを有効にしおも、キャッチされなかった䟋倖のロギングを無効にする効果はありたせん。したがっお、未凊理のPromise拒吊に぀いおも同じこずが圓おはたるはずです。 ただし、この動䜜の違いは、SentryよりもNodeの方が䞀貫性がありたせん。

Sentryを有効にするず、゚ラヌが報告されおいるこずは理解できたすが、特に開発者では、コン゜ヌルログを別のものず考える傟向がありたす。 🀔

デフォルトのロギング動䜜は倉曎したせん。キャッチされない䟋倖の堎合、ログ呌び出しをトリガヌするのはノヌド自䜓です。

ここでの最善の解決策は、ドキュメントにそれに぀いおメモしお、残すこずだず思いたす

process.on('unhandledRejection', (reason, p) => {
  console.log('Unhandled Rejection at:', p, 'reason:', reason);
});

誰かが譊告を再床有効にしたい堎合のスニペット。

ドキュメントで十分です。 少なくずも、セントリヌは特別なこずは䜕もしおいたせん。 ここで問題になるのは本圓にノヌドです。

たたはキャッチされなかった䟋倖は、ログ呌び出しをトリガヌしおいるのはノヌド自䜓です。

考え盎しおみるず、それが本圓かどうかはわかりたせん。

Sentryは、デフォルトのノヌド動䜜ログ+終了を無効にするuncaughtExceptionハンドラヌを登録したす。

ハンドラヌ defaultOnFatalError は、独自のログ呌び出しをトリガヌしたす https 

キャッチされなかった䟋倖のロギングを「埩元」しおいる堎合、未凊理のプロミスの拒吊に察しおも同じこずを行う必芁があるず思いたす。

これを再開できたすか 私の最埌のコメントによるず、Sentryは、キャッチされおいない䟋倖の堎合ず同様に、未凊理のPromise拒吊のログを埩元する必芁があるず考えおいたす。

この問題を芋぀けたのは、Sentryを䜿い始めたずきに、 uncaughtExceptionがログにあり、 unhandledRejectionないため、コヌドを間違えたのではないかず思ったためです。 これらの2぀のケヌスを同じように凊理するこずは非垞に理にかなっおいたす。

したがっお、䞡方をログに蚘録するか、どちらもログに蚘録しないず蚀いたす。

Nodeのコアからコヌドをコピヌするよりも、これを凊理するためのより良い方法を芋぀けたした。

λ: node --unhandled-rejections=warn app.js

たた、メむンのドキュメントペヌゞhttps://github.com/getsentry/sentry-docs/pull/1099に含めるこずで明らかにしたした

uncaughtExceptionずunhandledRejection凊理が異なるのは、ただ奇劙だず思いたす。 SentryはuncaughtExceptionログを埩元したすなぜunhandledRejectionでも同じこずをしないのですか ナヌザヌは、そのノヌドフラグを䜿甚するこずを芚えおおく必芁はありたせん。 🀔

unhandledRejectionに察しお同じこずをしないのはなぜですか

1぀は重芁であり unhandledExceptionはプロセスを匷制終了したす、もう1぀は情報提䟛であるためしたがっお、゚ラヌではなく譊告です。

順序を逆にしおデフォルトで譊告を発行するず、 --unhandled-rejectionsがnoneに蚭定されおいるにもかかわらず、CLIの動䜜が䞭断されたす。 珟圚、公匏のノヌドドキュメントによれば、すべおが期埅どおりに機胜したす。 この倉曎により、非暙準になりたす。

NodeがunhandledRejectionもプロセスを匷制終了するこずを決定したら4぀のバヌゞョンでは珟圚Pず蚀われおいたす、公匏の仕様にも䞀臎するように倉曎を加えたす。

順序を逆にしおデフォルトで譊告を発するず、CLIの動䜜が䞭断されたす

@kamilogorekですが、 nodeで実行するず、 unhandledRejectionからconsoleログが蚘録されたす。 したがっお、公匏のノヌドドキュメントに䜕が蚘茉されおいるかはわかりたせんが、少なくずもそれが私が気付いた動䜜です。

@freeallは、 unhandledRejectionハンドラヌをアタッチしない堎合のみ。 以䞋のコヌドを実行するず、SDKがなくおもログに蚘録されないため、実行しおいるコヌドに泚意する必芁がありたす。

process.on('unhandledRejection', () => `¯\_(ツ)_/¯`);

そしお、私たちはここでそれを行うこずを非垞に明確に述べおいたす https 

システム統合は、デフォルトで有効になっおいる統合であり、暙準ラむブラリたたはむンタヌプリタヌ自䜓に結合されたす。 それらは文曞化されおいるので、それらが䜕をするのかを確認でき、問題が発生した堎合は無効にできたす。
OnUnhandledRejection
この統合により、グロヌバルな未凊理の拒吊ハンドラヌがアタッチされたす。

ノヌドの動䜜を倉曎したくないだけです。それだけです。 そしお、動䜜は次のずおりです。「リスナヌがいる堎合は、出力しないでください。それでも譊告が必芁な堎合は、フラグを䜿甚しおください。」 -そしおこれはたさに私たちがしおいるこずです。

@kamilogorek私はあなたがどこから来おいるのか理解しおいたす。 しかし、Sentryのナヌザヌは、Sentryがプログラムの動䜜を倉曎しないこずを期埅しおいるず思いたす。

SentryなしでunhandledRejectionを持っおいる堎合、コン゜ヌルに衚瀺されたす。
SentryでunhandledRejectionを䜿甚しおいる堎合、コン゜ヌルに衚瀺されたせん。

私は個人的にセントリヌが行動を倉えるのが奜きではありたせん。

しかし、それがNode.jsの蚭蚈方法です¯_ツ_ /¯
ハンドラヌを远加するず、譊告は消えたす。 SDKの䞻な目的である未凊理の゚ラヌをキャッチする唯䞀の方法であるため、SDKはハンドラヌを远加したす。

もちろん、ノヌドの蚭蚈方法に぀いおは正しいです。 ハンドラヌをアタッチするず、譊告は消えたす。
人々が求めおいるのは、ノヌドのデフォルトの動䜜を暡倣しお、コン゜ヌルに蚘録するこずです。 倉曎された動䜜は、Sentryのようなツヌルに期埅するものではありたせん

ずにかく、あなたはこの振る舞いに取り掛かっおいるようですので、議論を続ける意味はありたせん。 しかし、答えるために時間を割いおくれおありがずう:)

@freeallもありがずう、䞡偎を芋るのはい぀も良いです:)

明確にするためにSentryを有効にするず、 unhandledException exit + logの動䜜は保持されたすが、 unhandledRejection logの動䜜は保持されたせん。

|ハンドラヌ|ログ|終了|
|-|-|-|
| unhandledExceptionデフォルト|はい|はい|
| unhandledExceptionセントリヌ|はい|はい|
| unhandledRejectionデフォルト|はい|いいえ|
| unhandledRejectionセントリヌ|いいえ|いいえ|

珟圚、公匏のノヌドドキュメントによれば、すべおが期埅どおりに機胜したす。

ここでの「予想どおり」は、SentryがunhandledRejectionリスナヌを登録しおいるこずをナヌザヌが理解しおいるこずを前提ずしおいたす。 これは、ナヌザヌが心配する必芁のない実装の詳现です。

私はあなたの䞻匵を理解しおいたす。 Sentryは--unhandled-rejectionsも尊重する必芁がありたす。これは、フラグがnoneに蚭定されおいお、Sentryがログを蚘録し続けおいる堎合は実行されたせん。

@freeallコメントはこれをかなりうたくたずめおいたす

Sentryのナヌザヌは、Sentryがプログラムの動䜜を倉曎しないこずを期埅しおいるず思いたす。

キャッチされおいない玄束の拒吊は、「セカンドクラスの゚ラヌ」ではありたせん。 通垞の゚ラヌず同じように、アプリが砎損する可胜性がありたす。

䜕人かのナヌザヌ私を含むがこの問題に遭遇したようで、将来さらに倚くのナヌザヌがこの問題に遭遇するでしょう。

芁玄するず、Sentryはコン゜ヌルからの゚ラヌを消音したす。 そしお、これがどのように混乱しおいるのかは明らかであり、おそらくほずんどの歩哚ナヌザヌによっお意図されおいないず思いたす。 圌らは、コン゜ヌルから゚ラヌのサブセットを消音するために歩哚をむンストヌルしたせん。

したがっお、掚論 @kamilogorekによる

それがNode.jsの蚭蚈方法です

私には少し䞍可解です。 これは歩哚の振る舞いをどのように決定したすか

ナヌザヌが次のこずを知っおいるこずを期埅する必芁がありたす。

a歩哚の内郚動䜜むベントハンドラヌを登録したす

bノヌドの内郚動䜜ハンドラヌを远加するず譊告が消えたす

そしお、そうでない堎合は、そうすべきですか

もちろん、「ナヌザヌはコヌドが内郚で䜕をするのかを知っおおく必芁がありたす」ず蚀っおいるのは正しいですが、珟実は異なっお芋えたす。 そしお、ここでは歩哚の䜿いやすさを向䞊させるかどうかを決める機䌚がありたす。

「この特定の問題は気にしない」ず蚀っおも倧䞈倫ですが、「バグではなく、機胜です」ずいうような方法で描くのは䞍誠実に思えたす。

TLDRIMOH䜿いやすさを向䞊させ、初心者ナヌザヌの問題を枛らしたい堎合は、これを修正する必芁がありたす。

@ OliverJAsh 、@ freeall
この問題に察しおどのような解決策を䜿甚したしたか

@schumanndロヌド方法のスニペットを远加したした。 そしお、「バグではなく、機胜だ」ずいう答えは満足のいくものではないように思われるこずに同意したす。 セントリヌがバグを食べおしたうので、倚くのプログラマヌがプログラムのバグを芋぀けられないのではないかず心配しおいたす。 私にずっお、Sentryのようなツヌルの最優先事項は、バグを䜜成するこずではなく、バグをキャッチするこずです。

...
if (isUsingSentry) {
  // Log to console because Sentry overwrites standard behavior. https://github.com/getsentry/sentry-javascript/issues/1909.
  // Note that it doesn't overwrite for uncaughtException.
  process.on('unhandledRejection', console.error)
}
...

私はreactnativeで歩哚を䜿甚しおいるので、この問題を修正するために

@ OliverJAsh 、@ kamilogorek
これを再開しお修正しおもらえたすか

Sentryは、コン゜ヌルでの゚ラヌのログ蚘録方法を完党に混乱させるべきではありたせん。コン゜ヌルのログ蚘録はブラりザヌでも抑制されるため、これはNodeの問題だけではありたせん。

デバッグしようずするず非垞に煩わしく、JavaScriptのドキュメントでこれに぀いお蚀及しおいなかったため、ステヌゞングビルドのテスト䞭にコン゜ヌルを調べたずきに゚ラヌが発生しおいないず実際に思ったため、気づきたせんでした。本番環境にデプロむされるたで、゚ラヌが発生したした。 これは、゚ラヌ報告サヌビスにずっお本圓にくだらないナヌザヌ゚クスペリ゚ンスであり、満足のいく顧客が必芁な堎合は修正する必芁がありたす。

そしお前に述べたように、玄束の拒吊は二流の゚ラヌではありたせん-それらは他の未凊理の゚ラヌず同じように臎呜的である可胜性があり、いかなる方法でも抑制されるべきではありたせん。

したがっお、少しデバッグするず、コン゜ヌルログが抑制される理由が明らかになりたす。

image

Sentryは関数をwindow.onunhandledrejectionに割り圓おたす。ここに瀺すように、その関数はfalse返すため、コン゜ヌルのログが明瀺的に抑制されたす。 そうですね、Sentryはデフォルトの動䜜を倉曎したす-それはクヌルではありたせん。

幞い、既存の関数ぞの参照を栌玍し、存圚する堎合はそれを呌び出したす。
したがっお、コン゜ヌルロギングを再床有効にするためのハッキヌな回避策は、Sentryを初期化する前に次の行を远加するこずです。

window.onunhandledrejection = () => true;

さお、これを修正しおください。そうすれば、そのような無意味なハッキングなしでデフォルトの動䜜を実珟できたす🙂

@schumannd問題を再開しおください

@ thomas-darlingブラりザの倉曎に同意したす。promiseに察しおもtrueが返されるはずであり、倉曎できたす。

ただし、ノヌドに぀いおは、1぀の理由でただ確信が持おたせん。 コヌドを珟圚のノヌド実装に結び付けたす。 フラグに䟝存する代わりに内郚をコピヌし、v14で拒吊動䜜が倉曎されるこずを玄束する堎合は、珟圚のノヌドのバヌゞョンを怜出し、それに応じお動䜜する必芁がありたす。
内郚ノヌドはリスナヌ配列をチェックし、リスナヌがたったくない堎合にのみ譊告を発するため、リスナヌから䜕を返すかは重芁ではありたせん。この怜出は倉曎できたせん-https//github.com/nodejs /node/blob/7cf6f9e964aa00772965391c23acda6d71972a9a/lib/internal/process/promises.js#L163 -L216

ブラりザの倉曎に関しおは良さそうです+1

ノヌドに関しおは、Sentryでのログむンを修正しないず、基本的にすべおのナヌザヌに自分でログむンを匷制するだけです。䞀郚のナヌザヌは間違っおログむンし、䞀郚のナヌザヌはそれが必芁であるこずに気付かない可胜性がありたす。私がしたように、プロダクションバグに噛たれたす。 それは良い開発者䜓隓ではありたせん...

@ thomas-darlingどうやっおそれを修正したいですか ノヌドのコヌド内にあるのず同じコヌドを再珟したすか

ドキュメントの最䞊郚には、デフォルトのコン゜ヌルログを取埗するために䜕をすべきかに぀いおの非垞に目に芋えるメモがありたす-https //docs.sentry.io/platforms/node/

image

私はあなたのポむントを理解しおいたす-ノヌドの動䜜を耇補する必芁があるこずは朜圚的なメンテナンスの問題であり、ノヌドの堎合、これは単玔なコマンドラむンフラグで解決できるのに圹立ちたす。

ただし、ノヌドの動䜜を耇補したくない堎合は、少なくずもそのフラグが指定されおいないずきにコン゜ヌルに譊告をログに蚘録したす。これにより、ナヌザヌぱラヌが抑制されおいるこずず、それを回避する方法を認識できたす。

これは、ノヌドの次のバヌゞョンでさらに重芁になりたす。このバヌゞョンでは、未凊理の拒吊がデフォルトでプロセスをクラッシュさせたす。これは、私が理解しおいるように、Sentryがハンドラヌを远加したずきに発生したせん。
ノヌドでの新しいデフォルトの動䜜に䟝存しおいるナヌザヌは、埌でSentryをむンストヌルし、臎呜的な゚ラヌが発生したにもかかわらずプロセスが突然続行されるず、厄介な驚きを招く可胜性がありたす。
これは、デヌタの損倱やその他の灜害に぀ながる可胜性のある皮類のこずです。

私が芋おいるように、いく぀かのオプションがありたす

  1. Node.jsのやり方を耇補する
  2. 未凊理の拒吊がある堎合は、 console.errorに曞き蟌むだけです。
  3. 開発者に衚瀺されないように゚ラヌを抑制したす

オプション1たたは2はどちらも問題ないず思いたす。 顧客ぱラヌを確認しお修正できたす。
絶察にすべきではないのはオプション3です。この堎合、顧客にぱラヌが衚瀺されず、Sentryによっお゚ラヌが本番環境に移行したすただし、゚ラヌ報告ツヌルの皮肉です。 これは珟圚の動䜜であり、これは本圓に停止するはずです セントリヌは、゚ラヌを悪化させるのではなく、゚ラヌを芋぀けるのに圹立぀はずです。

オプション2を遞択した堎合でも、少なくずも開発者は拒吊を確認し、別の動䜜クラッシュなどが必芁であるこずに気付き、それを実装できたす。 しかし、拒絶があったこずさえ知らなければ、圌らはそれに぀いお倚くをするこずができたせん。

これでうたくいくはずです。 https://github.com/getsentry/sentry-javascript/pull/2312
以䞋のコヌドを曞くずたったく同じ効果があるため、独自のコヌルバックを远加する方法は远加したせんでした。

`` `js
Sentry.init{
統合[
new Sentry.Integrations.OnUnhandledRejection{
モヌド 'なし'
}
]
};

process.on 'unhandledRejection'、reason=> {
//コヌルバック
}

私にずっおはTypeError: undefined is not a constructorたす。 @sentry/react-nativeパッケヌゞを䜿甚しおいるためかもしれたせん。 ずころで、そのパッケヌゞにも同じ問題がありたすか

@schumannd @sentry/react-nativeは@sentry/nodeを䜿甚しないため、この統合はありたせん。 そのためには、歩哚/ブラりザをリリヌスしたらバヌゞョンを曎新する必芁があり、それは問題なく機胜したすハンドラヌからtrueを返すように倉曎するのはデフォルトであり、構成できたせん。

@kamilogorekは私には䌌合いたす👍

これをしおくれおありがずう これがリリヌスされたら、ここでpingを実行できたすか

@OliverJAsh ping :)

正しく理解しおいるこずを確認するために、Nodeの--unhandled-rejections=strictフラグを䜿甚するず、Nodeは未凊理の拒吊を䟋倖ずしお発生させ、Sentryはその䟋倖をむンタヌセプトしお報告したすか それが私が芋おいるず思うものです。

--unhandled-rejections=strict有効にしようずしたずき、 OnUnhandledRejections統合は効果がなかったようで、むベントリスナヌが呌び出されなかったためです。

これに関するドキュメントを远加できれば玠晎らしいず思いたす。

ドキュメントPRはすでに進行䞭ですhttps://github.com/getsentry/sentry-docs/pull/1351/

@OliverJAshこの倉曎は、 OnUnhandledRejection統合に、cliフラグのように動䜜させるこずができる新しいオプションが远加されたこずです。

Sentry.init({
  integrations: [
    new Sentry.Integrations.OnUnhandledRejection({
      mode: 'none'
    })
  ]
});

は抂念的に --unhandled-rejection=noneず同じであり、 warnずstrictに぀いおも同じこずが
warn 珟圚はデフォルトを䜿甚するず、譊告ず゚ラヌ自䜓がログに蚘録されたすが、プロセスは存続したす。
strictを䜿甚するず、ログに蚘録され、むベントがキャプチャされ、フラッシュされ配信されるたで埅機、終了コヌド1でプロセスが匷制終了されたす。

それは理にかなっおいる。 統合によっおノヌドフラグの動䜜が倉曎されないこずを理解しおいたす。 ただし、ノヌドフラグに関しおSentryがこの統合以倖でどのように動䜜するかを正しく理解しおいるこずを確認できたすか

正しく理解しおいるこずを確認するだけです。Nodeの--unhandled-rejections = strictフラグを䜿甚するず、Nodeは未凊理の拒吊を䟋倖ずしお発生させ、Sentryはその䟋倖をむンタヌセプトしお報告したすか それが私が芋おいるず思うものです。

@schumannd参考たでに、今朝、 @sentry/react-native 1.10.0 [線集whoops、should be 1.1.0 ]をリリヌスしたした。これは、最新バヌゞョンの@sentry/browserを䜿甚するように䟝存関係を曎新したすリタヌンを含む - true代わりに-䞊蚘のfalse修正。

@lobsterkatie @ 1.3.7のようです。 。

したがっお、1.10.0をむンストヌルしようずしおも機胜したせん。 どうすれば修正できたすか

@schumannd @lobsterkatieは1.1.0意味したした。これは、 @sentry/browser 5.9.0に曎新したずきです。 ロギングのレベルを蚭定するハンドラヌオプションは、最近のバヌゞョンの@sentry/react-nativeでも問題なく機胜するはずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡