报告来自Google Analytics(分析)analytics.js异常跟踪的异常


81

Google Universal Analytics命中类型异常

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

我原本希望能够转到Google Analytics(分析)控制台,并在与“事件”相同的级别上找到出库报告,但无处可寻。

Android和iOS API会说,Crash and exception data is available primarily in the Crash and Exceptions report但找不到该名称的任何报告。

Answers:


128

弄清楚了。我不确定他们为什么不将其作为内置报告,但也许有一天。

我在信息中心中制作了一个自定义小部件,其中包含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>html body标签顶部附近的标签中。



2
“崩溃”指标对我不起作用。但是此自定义报告有效imgur.com/a/Ux57LEE 我正在使用gtag
Jayesh,

2
而且,这不会出现在实时报告中。太遗憾了。
stevemao

5
哦,这个问题是四年前提出的...他们还没有改善它:(
stevemao

1
在指标下,Crashes没有为我显示任何数据。我必须选择例外。
Pankaj

42

我采用了Simon_Weaver的指南,进一步制作了自定义报告,并构建了一个相当完整的Google Analytics(分析)自定义例外报告。我认为这可能值得分享,因此我将其上传到了GA“解决方案库”。

我的模板:Google Analytics(分析)例外报告

这是最终结果的图片:

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


3
这已成为我最喜欢的异常跟踪报告,我强烈建议其他人选择此报告(直到Google Analytics(分析)提供内置报告)。
GreatBlakes

如果您有机会在此处添加一些有关模板工作原理的屏幕截图,那就太好了。
Simon_Weaver

@Simon_Weaver我刚刚尝试了一下,然后添加了它的外观。过滤掉实际的异常描述,但它们确实出现了。希望对您
有所

7

我只是想扩展@Simon_Weaver的出色答案,以提供带有一些其他详细信息的错误报告:

  • ga()在尝试调用之前确保已定义(因为在加载Analytics库之前可能会触发错误)。
  • 在Google 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的,如果它是有效的投入appName,并appVersion在您发送的异常对象?我相信你必须明确地设置这些看这里
八月

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);
                }
            };
        }
    }
}));

嗨,迈克尔。我有一个快速的问题...我不确定是否需要这种结构-为什么将函数创建为第二个参数,然后传入窗口,然后返回原始函数?似乎这里有3个不必要的步骤。还是我想念的东西?
德雷奈

0

现在,您可以在“行为”下找到“崩溃和例外”视图(如果在Google Analytics(分析)中将属性创建为“移动应用”。

截至2018年5月的Google Analytics(分析)侧边选单


我没有在我的
Google

@technomage您的Google Analytics(分析)资产是作为“网站”还是“移动应用”创建的?
ajcurtis

它是作为网站创建的。最终,我找到了原始数据,但是我不得不为其创建一个定制报告。
technomage

我正在通过GA javascript手动发送“例外”信息。
technomage

好的,这很有意义,为什么您可能看不到相同的视图。屏幕截图来自作为移动应用程序创建的属性(也包括手动发送的例外)。
ajcurtis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.