Google Analyticsanalytics.js例外追跡からの例外のレポート


82

Google UniversalAnalyticsにはヒットタイプの例外があります

ga('send', 'exception', {
  'exDescription': 'DatabaseError'
});

Google Analyticsコンソールにアクセスして、「イベント」と同じレベルの例外レポートを見つけることができると期待していましたが、どこにも表示されません。

AndroidとiOSのAPIは言ってCrash and exception data is available primarily in the Crash and Exceptions reportいますが、その名前のレポートは見つかりません。

回答:


129

理解した。なぜ彼らがこれを組み込みのレポートにしないのかはわかりませんが、いつかはそうなるかもしれません。

ダッシュボードにException Description、ディメンション用のカスタムウィジェットと、指標用の「クラッシュ」を作成しました。

ここに画像の説明を入力してください

これは私にこのようなレポートを与えます:

ここに画像の説明を入力してください

Customizationタブに移動してカスタムレポートを作成し、エラーの表を表示して、ダッシュボードに追加することもできます。

ここに画像の説明を入力してください

このグローバル例外ハンドラーで使用されます

if (typeof window.onerror == "object")
{
    window.onerror = function (err, url, line)
    {
        if (ga) 
        {
           ga('send', 'exception', {
               'exDescription': line + " " + err
           });
        }
    };
}

このハンドラーは、Javascriptの初期化のどこにでも配置できます。これは、すべてのJSファイルをどのように構成しているかによって異なります。または、<script>htmlbodyタグの上部にあるタグ内に配置することもできます。



3
「クラッシュ」メトリックは私には機能しませんでした。しかし、このカスタムレポートは機能しましたimgur.com/a/Ux57LEE 私はgtagを使用しています
Jayesh

2
また、これはリアルタイムレポートには表示されません。お気の毒に。
stevemao 2018年

5
ああ、この質問は4年前に尋ねられました...彼らはまだそれを改善していません:(
stevemao 2018年

1
指標の下では、クラッシュは私にデータを表示していませんでした。例外を選択する必要がありました。
パンカジ

42

Simon_Weaverのガイドを使用して、カスタムレポートをさらに数ステップ作成し、かなり完全なGoogleAnalyticsカスタム例外レポートを作成しました。共有する価値があると思ったので、GA「SolutionsGallery」にアップロードしました。

私のテンプレート:GoogleAnalytics例外レポート

これが最終結果の写真です:

https://imgur.com/a/1UYIzrZ


3
これは例外追跡の私のお気に入りのレポートになりました。他の人がこれを選択することを強くお勧めします(Google Analyticsが組み込みのレポートを提供するまで)。
GreatBlakes 2017年

テンプレートがどのように機能するかを示すスクリーンショットをここに追加する機会があれば、それは素晴らしいことです。
Simon_Weaver 2018年

@Simon_Weaver試してみて、先に進んで、どのように見えるかを追加しました。実際の例外の説明を除外しましたが、表示されます。うまくいけば、それが役立つことを願っています
2018年

7

@Simon_Weaverの優れた回答を少し拡張して、いくつかの追加の詳細を含むエラーレポートを提供したかっただけです。

  • ga()呼び出す前に、が定義されていることを確認してください(Analyticsライブラリがロードされる前にエラーがトリガーされる可能性があるため)。
  • アナリティクスレポートに例外の行番号と列インデックスを記録します(ただし、本番環境で使用される縮小されたJavaScriptコードは読みにくい場合があります)。
  • 以前に定義されたwindow.onerrorコールバックを実行します。
/**
 * Send JavaScript error information to Google Analytics.
 * 
 * @param  {Window} window A reference to the "window".
 * @return {void}
 * @author Philippe Sawicki <https://github.com/philsawicki>
 */
(function (window) {
    // Retain a reference to the previous global error handler, in case it has been set:
    var originalWindowErrorCallback = window.onerror;

    /**
     * Log any script error to Google Analytics.
     *
     * Third-party scripts without CORS will only provide "Script Error." as an error message.
     * 
     * @param  {String}           errorMessage Error message.
     * @param  {String}           url          URL where error was raised.
     * @param  {Number}           lineNumber   Line number where error was raised.
     * @param  {Number|undefined} columnNumber Column number for the line where the error occurred.
     * @param  {Object|undefined} errorObject  Error Object.
     * @return {Boolean}                       When the function returns true, this prevents the 
     *                                         firing of the default event handler.
     */
    window.onerror = function customErrorHandler (errorMessage, url, lineNumber, columnNumber, errorObject) {
        // Send error details to Google Analytics, if the library is already available:
        if (typeof ga === 'function') {
            // In case the "errorObject" is available, use its data, else fallback 
            // on the default "errorMessage" provided:
            var exceptionDescription = errorMessage;
            if (typeof errorObject !== 'undefined' && typeof errorObject.message !== 'undefined') {
                exceptionDescription = errorObject.message;
            }

            // Format the message to log to Analytics (might also use "errorObject.stack" if defined):
            exceptionDescription += ' @ ' + url + ':' + lineNumber + ':' + columnNumber;

            ga('send', 'exception', {
                'exDescription': exceptionDescription,
                'exFatal': false, // Some Error types might be considered as fatal.
                'appName': 'Application_Name',
                'appVersion': '1.0'
            });
        }

        // If the previous "window.onerror" callback can be called, pass it the data:
        if (typeof originalWindowErrorCallback === 'function') {
            return originalWindowErrorCallback(errorMessage, url, lineNumber, columnNumber, errorObject);
        }
        // Otherwise, Let the default handler run:
        return false;
    };
})(window);

// Generate an error, for demonstration purposes:
//throw new Error('Crash!');

編集: @Simon_Weaverが正式に指摘したように、Google Analyticsには、例外追跡に関するドキュメントがあります(元の回答でリンクする必要がありました-申し訳ありませんが、新人の間違いです!):


それは置くために有効かどうIDKのappNameappVersionあなたが送っ例外オブジェクトに?私はあなたが明示的にそれらを参照設定する必要が信じてここに
8月

1

これは私が思いついたものなので、どこにでもコードを含める必要はありません。new ErrorHandler();各.jsファイルに追加するだけです。これはChrome拡張機能に対して行われましたが、どこでも機能するはずです。実際のga()のものを別のファイル(したがってapp.GA)に実装しますが、ここでベイクすることもできます。

/*
 *  Copyright (c) 2015-2017, Michael A. Updike All rights reserved.
 *  Licensed under the BSD-3-Clause
 *  https://opensource.org/licenses/BSD-3-Clause
 *  https://github.com/opus1269/photo-screen-saver/blob/master/LICENSE.md
 */
// noinspection ThisExpressionReferencesGlobalObjectJS
(function(window, factory) {
    window.ExceptionHandler = factory(window);
}(this, function(window) {
    'use strict';

    return ExceptionHandler;

    /**
     * Log Exceptions with analytics. Include: new ExceptionHandler();<br />
     * at top of every js file
     * @constructor
     * @alias ExceptionHandler
     */
    function ExceptionHandler() {
        if (typeof window.onerror === 'object') {
            // global error handler
            window.onerror = function(message, url, line, col, errObject) {
                if (app && app.GA) {
                    let msg = message;
                    let stack = null;
                    if (errObject && errObject.message && errObject.stack) {
                        msg = errObject.message;
                        stack = errObject.stack;
                    }
                    app.GA.exception(msg, stack);
                }
            };
        }
    }
}));

こんにちはマイケル。簡単な質問があります...この構造の必要性についてはよくわかりません-なぜ関数を2番目のパラメーターとして作成し、ウィンドウを渡してから元の関数を返すのですか?ここには不要なステップが3つあるようです。それとも私が欠けているものはありますか?
Drenai 2017

0

[動作]の下に[クラッシュと例外]ビューが表示されるようになりました(プロパティがGoogle Analyticsで「モバイルアプリ」として作成されている場合)。

2018年5月現在のGoogleAnalyticsのサイドメニュー


GAダッシュボードにこれが表示されない
technomage 2018年

@technomage GAプロパティは「ウェブサイト」または「モバイルアプリ」として作成されましたか?
ajcurtis

それはウェブサイトとして作成されました。最終的に生データを見つけましたが、そのためのカスタムレポートを作成する必要がありました。
technomage

GAjavascriptを介して「例外」情報を手動で送信しています。
technomage

わかりました。同じビューが表示されない理由は理にかなっています。スクリーンショットは、モバイルアプリとして作成されたプロパティから取得されました(手動で送信された例外もあります)。
ajcurtis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.