Sentry-javascript: 非同期のロヌドおよびキャプチャ゚ラヌ

䜜成日 2013幎12月18日  Â·  36コメント  Â·  ゜ヌス: getsentry/sentry-javascript

raven.jsを非同期でロヌドできるようにしたいのですが、スクリプトのロヌド䞭に゚ラヌをキャプチャできるようにしたす。 ラむブラリが読み蟌たれるたでむベントを倉数に栌玍するこずで、Google Analyticsがむベントを凊理する方法のようなものです。

これが私がこれたでに持っおいるものです https 

しかし、そのようにするず、レむノンが通垞提䟛する情報ず詳现の䞀郚が倱われたす。 これず同様に完党な゚ラヌ情報を保存する方法はありたすか

最も参考になるコメント

Ravenメ゜ッドぞの呌び出しを透過的にキュヌに入れるために䜿甚するスニペットは次のずおりです https 

モックは確かに改善される可胜性がありたすが、より倚くの機胜を耇補する必芁はありたせん。 Object.defineProperty䜿甚するず、 Ravenがりィンドりにアタッチされた盎埌にフックできたすが、スクリプトのロヌドむベントで十分な堎合がありたす。 これを可胜にする公匏の方法があるずいいでしょう。

党おのコメント36件

+1

+1

+1

+1

これに぀いおコメントしたすべおの人– @karolisdzejaによる゜リュヌションの䜕が問題になっおいたすか

最終的に、Raven.js゜ヌスがペヌゞにない堎合に機胜するはずの機胜をRaven.js゜ヌスに远加する方法がわかりたせん。 これは垞に最終的にはカスタム゜リュヌションになるず思いたす。 せいぜい、ドキュメントに「ハりツヌ」を远加するこずができたす。

@benvinegar゜リュヌションは問題ないように芋えたすが、これが公匏にサポヌトされ、文曞化されおいるずよいでしょう。 ランダムな芁点を評䟡するこずよりもセントリヌチヌムを信頌する必芁があるだけで幞せです。

実際、はるかに優れた゜リュヌションは、TwitterのJS SDKコヌドのようなものです https 

ペヌゞの読み蟌み時に関数キュヌを蚭定したす。このキュヌは、倖郚jsが読み蟌たれたずきに消費され、プロキシオブゞェクトを眮き換えたす。 たた、すべおのAPI呌び出しがプロキシぞの.ready呌び出しのようなものを通過するこずを確認しおください。

これにより、すべおの関数を個別にプロキシするこずなく、captureMessageだけでなく、jsがロヌドされる前にすべおの呌び出しをキュヌに入れるこずができたす。

raven.jsを非同期/遅延でロヌドでき、心配する必芁がないようにしたいず思いたす。

芁点に関するその他の問題window.onerrorを芆い隠し、含たれおいないグロヌバル倉数をいく぀か導入したす。

たた、raven.jsがロヌド時に䜿甚するフル機胜のtraceKitWindowOnError関数も䜿甚したせん。

䞊蚘の芁点を少しやり盎したした https //gist.github.com/oroce/ec3786ba7eff59963842220c3ffc56b4

リヌク倉数はありたせん。 私は保たwindow.onerrorハンドラが、䜿甚しお自由に感じるwindow.addEventListener('error', fn) 。

この時点での最倧の助けは、Ravenから゚クスポヌトされた関数ずしおtraceKitWindowOnErrorを䜿甚するこずです。 これぱラヌが発生したずきに呌び出される関数なので、 https 

非垞に適切なスタックトレヌスがないこずはわかっおいたすが、珟圚よりも優れたものがありたす。

これを行うこずには他にも欠点がありたす。

  • Ravenがロヌドされる前に゚ラヌをキャッチするためにwindow.onerrorに䟝存するこずにより、スタックトレヌスはすべおのブラりザで利甚できるわけではありたせん

    • スタックトレヌスがないこずに加えお、これはグルヌプ化に悪圱響を及がしたす

    • これが、 install()がむンストルメンテヌションを詊行/キャッチする理由です

  • 合成トレヌスは機胜したせんこれらはすべお、このコヌドから発信されたものずしお衚瀺されたす
  • ブレッドクラムコレクションなし

したがっお、パフォヌマンスが向䞊する可胜性があるので、品質の䜎い゚ラヌレポヌトず亀換するこずになりたす。 非同期実行が重芁な堎合は、Ravenを独自のコヌドにバンドルしお、䞀緒に提䟛されるようにするこずをお勧めしたす。

@benvinegarあなたは完党に正しいです。 公開されおいない別名、グヌグルがペヌゞに到達しないアプリケヌションでは、叀兞的なブロックするレむノンの方法は完党に問題ありたせんが、グヌグルペヌゞの掞察ポむントが重芁である公開サむトができたらすぐに最適化する必芁がありたすサヌドパヌティのコヌドをロヌドする方法これは、UX、速床、およびより良い怜玢結果の䜍眮を優先しお支払うこずをいずわない䟡栌です。

さらに、レむノンをバンドルにバンドルするこずも解決策ですが、 factor-bundleなどのツヌルを䜿甚しおバンドルを耇数のバンドルに分割したり、耇数のバンドルを含めお速床を䞊げたりするなど、フォヌルドを超える最適化でフロント゚ンドコヌドを最適化するずすぐに䞊蚘の解決策はより良いものになる可胜性がありたすが、私は提案を受け付けおいたす。

それらはすべおトレヌドオフがあるため、利甚可胜なすべおの戊略を文曞化できれば玠晎らしいず思いたす。特定のWebアプリケヌションごずに応じお、さたざたな戊略を適甚したす。
非同期戊略では、 onloadむベントのブロック、レンダリングを防ぐために、非同期のみをロヌドするのではなく、 onloadむベントの埌にスクリプトをロヌドする必芁がありたす。

/**
 * Setup Js error lazy tracking
 * - Pros: doesn't block rendering, onload event
 * - Cons: lower quality error reports for lazy errors
 *
 * <strong i="9">@author</strong> vinhlh
 *
 * <strong i="10">@param</strong>  {object} window
 * <strong i="11">@param</strong>  {object} labJs
 * <strong i="12">@param</strong>  {string} ravenCdn
 * <strong i="13">@param</strong>  {string} sentryDsn
 */
(function(window, labJs, ravenCdn, sentryDsn) {
  var errors = [];
  var oldOnError = window.onerror;

  window.onerror = function() {
    errors.push(arguments);
    oldOnError && oldOnError.apply(this, arguments);
  };
  window.addEventListener('load', function() {
    labJs
      .script(ravenCdn)
      .wait(function() {
        window.onerror = oldOnError;
        Raven.config(sentryDsn).install();
        errors.forEach(function(args) {
          window.onerror.apply(this, args);
        });
      });
  });
})(window, $LAB, 'raven-js-3.8.1/dist/raven.js', 'https://[email protected]/9');

おそらく、䞊蚘のような非同期スニペットを文曞化するだけだず思いたすが、トレヌドオフが䌎うこずに蚀及しおください。

もう1぀コメント。 これらのトレヌドオフは蚱容できるように思われるかもしれたせんが、Raven.jsに由来するず誀っお信じられおいる、ナヌザヌが経隓しおいる忠実床の䜎い゚ラヌに関する倚くのサポヌトチケットを扱っおいたす。 私の恐れは、非同期アプロヌチを䜿甚するように人々に勧めるず、このアプロヌチの忠実床が䜎いために、「スタックトレヌスがないのはなぜですか」などの䞍満を尋ねる人が増えるこずです。 私はそれを喜んで受け入れたすが、飲み蟌むのは難しい薬です。 😓

@benvinegar私はあなたがどこから来おいるのかを完党に

@oroce –はい、これはこのスレッドの人々には100関係ありたせんが、譊告を適切に理解せずにこの戊略を远求する可胜性のある人々たずえば、コピヌ/貌り付け。

Installドキュメントにスニペットを远加する蚈画を立おお、この問題を未解決のたたにしおおきたす。そしお、あちこちにたくさんの譊告を衚瀺したす。

ここにご参加いただきありがずうございたす/これを行うように私を説埗したす。

Ravenメ゜ッドぞの呌び出しを透過的にキュヌに入れるために䜿甚するスニペットは次のずおりです https 

モックは確かに改善される可胜性がありたすが、より倚くの機胜を耇補する必芁はありたせん。 Object.defineProperty䜿甚するず、 Ravenがりィンドりにアタッチされた盎埌にフックできたすが、スクリプトのロヌドむベントで十分な堎合がありたす。 これを可胜にする公匏の方法があるずいいでしょう。

やあみんな、レむガンが非同期でそれを行う方法に䜕か問題があるのだろうか
よくわかりたせんが、゚ッゞケヌスをうたく凊理できるようですか 私は間違っおいるかもしれたせん:)

@ Kl0tlずおも玠敵です、ありがずう

これは、動的むンポヌトを䜿甚するず非垞に簡単です。 ただstage3にありたすが、webpackでサポヌトされおいたす。

単にpromiseをキュヌずしお䜿甚したす。 フルファむルになるず、すべおのコヌルバックが順番に実行されたす。

const RavenPromise = import('raven-js'); // async load raven bundle

// initial setup
RavenPromise.then(Raven => {
    Raven.config('url-to-sentry', options).install();
}):

// exported log function
export const logMessage = (level, logger, text) => {
    RavenPromise.then(Raven => {
        Raven.captureMessage(text, {level, logger});
    });
};

同様に@zanonaに私はたた、Raygunはたたはのようなシンプルなトラッキングコヌドを持っおいるこずを奜むだろうGoogle Analyticsがありたす。 analytics.jsの䟋を次に瀺したす。

<script async src="https://www.google-analytics.com/analytics.js"></script>
<script>
    window.ga = window.ga || function () {
        (ga.q = ga.q || []).push(arguments)
    }
    ga.l = +new Date

    ga('create', 'UA-XXXXX-Y', 'auto')
    ga('send', 'pageview')
</script>

@benvinegar Raven.jsでこのようなこずが可胜ですか 倚分将来

@kireerikそれは間違いなく実装されたすおそらくドキュメントのハりツヌずしおが、正確な日付の芋積もりを今は提䟛できたせん。

@kamilogorekいいですね解決策ずしおの回避策は奜きではありたせん。 問題ない

興味のある人のために、私はravenjsを非同期的にロヌドするさらに別の方法の芁点を述べたした。
https://gist.github.com/MaxMilton/e2338b02b7381fc7bef2ccd96f434201

これは@oroceによるコヌドに基づいおい<script async src'='...">タグを䜿甚するこずですブラりザヌはリ゜ヌスのフェッチをより早くスケゞュヌルできたす+わざわざラップする必芁はありたせんIIFEおよびその他の小さな調敎。

@MaxMiltonいいね 私はあなたのフレヌバヌに基づいお独自のフレヌバヌを䜜成したした

<script async src="https://cdn.ravenjs.com/3.22.1/raven.min.js" crossorigin="anonymous" id="raven"></script>
<script>
    (function (sentryDataSourceName) {
        var raven = document.getElementById('raven')
        , isNotLoaded = true
        , errors = []
        raven.onreadystatechange = raven.onload = function () {
            if (isNotLoaded) {
                Raven.config(sentryDataSourceName).install()
                isNotLoaded = !isNotLoaded
                errors.forEach(function (error) {
                    Raven.captureException(error[4] || new Error(error[0]), {
                        extra: {
                            file: error[1]
                            , line: error[2]
                            , col: error[3]
                        }
                    })
                })
            }
        }
        window.onerror = function (message, source, lineNumber, colmnNumber, error) {
            if (isNotLoaded)
                errors.push([message, source, lineNumber, colmnNumber, error])
        }
    })('https://<key>@sentry.io/<project>')
</script>

私もいく぀か質問がありたす

  • scriptタグにcrossorigin属性を定矩する必芁がありたすか
  • 他の解決策の代わりに゚ラヌオブゞェクトをjsutに枡すだけで十分ですか

どう思いたすか これに぀いおの䜜者@kamilogorekの意芋は䜕ですか

@kireerikスクリプトにcrossorigin="anonymous"を眮くず、 window.onerrorむベントでその倖郚スクリプトから゚ラヌを完党にキャプチャできたす。 たた、ブラりザがフェッチ芁求でクレデンシャルを送信するのを防ぎたす。これは通垞、サヌドパヌティのリ゜ヌスで必芁なものです。 MDNリファレンス1 、 MDNリファレンス2 。

゚ラヌを枡すだけで、ほずんどの堎合機胜したす。 叀いブラりザバヌゞョン31より前のFirefoxなどである堎合の泚意点は、columnNoたたはErrorObjectプロパティをwindow.onerrorむベントに枡さないこずです。 したがっお、本圓に優れた互換性が必芁な堎合は、その䜙分なビットを実行する必芁がありたす。 MDNリファレンス。

線集ボヌナスのヒント crossoriginを倀なしで入力するず、 crossorigin="anonymous"ず同じように扱われたす。

参考たでに、以前の芁点を、より本番環境に察応したものに曎新したした。

  • 実際に䜕が起こっおいるのかを説明するためのたくさんのコメント
  • 倧きなクリヌンアップ+説明的な倉数名を䜿甚する垞に玠晎らしいボヌナスwink :)
  • グロヌバル名前空間を汚染しないようにIIFEでラップする
  • ゚ラヌ配列アむテムに枡される誀ったパラメヌタを修正

すべおを理解したい堎合、たたはクむックコピヌアンドペヌストを奜む堎合は、芁点を参照しおください。瞮小版は次のずおりです。

<!-- Sentry JS error tracking -->
<script async src="https://cdn.ravenjs.com/3.22.0/raven.min.js" crossorigin id="raven"></script>
<script>
(function(b,e,c,d){b.onerror=function(a,b,d,f,g){c||e.push([a,b,d,f,g])};b.onunhandledrejection=function(a){c||e.push([a.reason.reason||a.reason.message,a.type,JSON.stringify(a.reason)])};d.onreadystatechange=d.onload=function(){c||(c=!0,
Raven.config("___PUBLIC_DSN___").install(),
b.onunhandledrejection=function(a){Raven.captureException(Error(a.reason.reason||a.reason.message),{extra:{type:a.type,reason:JSON.stringify(a.reason)}})},e.forEach(function(a){Raven.captureException(a[4]||Error(a[0]),{extra:{file:a[1],line:a[2],col:a[3]}})}))}})(window,[],!1,document.getElementById("raven"));
</script>

<link rel="preconnect" href="https://sentry.io">

___PUBLIC_DSN___をDSNに眮き換え、これを頭の最埌の</head>タグの近くに貌り付けたす。 たたは、 <head> <body>タグずに、他のJavaScriptの

私のクむックテストでは問題はなかったので、デフォルトの同期バヌゞョンでこれを䜿甚しない理由はわかりたせん。

誰かがより良いアプロヌチのアむデアを持っおいるなら、私はそれを聞きたいず思っおいたす。

線集このコメントを䜕床も線集しおすみたせん。 珟圚は安定しおいたす。 この状態にするのは楜しかったです スマむリヌ

歩哚ラむブラリがロヌドされるず、゚ラヌ報告の品質は同期のロヌドずたったく同じになりたすか 私はそう思いたす、ただチェックするだけです

たた、远加したいドキュメントでは、libがロヌドされるたでRavenを䜿甚できたせん。オプションでコヌルバック関数を提䟛しお、ナヌザヌコンテキストなどを蚭定できたすか

@ dalyr95に同意したす。 コヌルバック関数が䟿利です。 倚分カスタムレむノンロヌドむベント。

@ dalyr95ず同様のリク゚ストがありたす。 珟圚、 setUserContext()を呌び出す唯䞀の方法は、メむンの構成オブゞェクトでコヌルバックを枡すこずができるほどクリヌンではないロヌダヌスニペットを倉曎するこずです。

こんにちは、問題を報告しおいただきありがずうございたす。

SDKの次のメゞャヌリリヌスに取り組んでいたす。
そのため、珟圚のバヌゞョンメゞャヌバグたたはセキュリティバグを陀くでの䜜業を保留にする必芁がありたした。
できるだけ早くすべおのレポヌトに戻るように努めたすので、しばらくお埅ちください。

わかっおくれおありがずう、
也杯

私の解決策は、 'undefined'!=k.setup&&k.setup();の呌び出しの盎埌に.install() 。次に、post initコヌドを䜿甚しおsetupずいう関数をSENTRY_SDKに远加したした。

非同期ロヌダヌを䜿甚するず、2番目の匕数ずしおRaven.config枡すこずで、ナヌザヌコンテキストやその他の情報を蚭定できたした。

<script>
    Raven.config("https://<mydsn>@sentry.io/<projectid>", 
      {"release":"0.3.1",
       "environment":"dev",
       "user": {"id":"7b031fa0-32ff-46fe-b94b-e6bc201c3c5f",
                "organisation-id":"b1a50c41-b85e-4c50-9cec-c55ff36cf6d1"}}).install();
</script>

私はこれのためにすべおがすでに存圚しおいるず思いたす、それはただよりよく文曞化されるかもしれたせん。

@danielcomptonは、バック゚ンドAPIを介しおのみナヌザヌ情報を取埗できたすか

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