Полные трассировки стека в Google Analytics v4 через Tag-Manager

Меня немного смущает отслеживание сбоев в Google Analytics. AFIK можно хранить только в строках Analytics, длина которых не превышает 200 байт (для каждого свойства). Таким образом, невозможно увидеть трассировки с полным стеком, поскольку они обычно намного длиннее 200 символов.

Однако с помощью Analytics v2 API это возможно с EasyTracker, как описано здесь. Есть также некоторые полудублированные, которые используют ga_reportUncaughtExceptions свойство, подобное этому: отчет о сбое Google Analytics показывает только первую строку трассировки стека или трассировки стека исключений, потерянную в Google Analytics v2 для Android?

Поскольку я использую Tag-Manager, я не могу использовать эти решения, я уже понял, как правильно отследить сбой для первых 200 байт с помощью Tag-Manager, но как насчет полной трассировки стека?

Я также использую ACRA, чтобы предоставить пользователю способ связаться с нами напрямую (с трассировкой стека в качестве вложения), поэтому прямое подключение к репортеру сбоев Google прервано, а в консоли Google Play нет сбоев.

2 ответа

В Google Analytics v4 можно отправить полную трассировку стека для всех необработанных исключений в Android.

Установите для автоматического отслеживания активности значение true в своем классе приложений.

    // Enable automatic activity tracking for your app
    tracker.enableAutoActivityTracking(true);

Далее переопределите метод getDescription класса StandardExceptionParser. Throwable содержит массив элементов трассировки стека, которые при преобразовании в формат строки будут вашей трассировкой стека, как мы видим в журналах.

    public class AnalyticsExceptionParser extends StandardExceptionParser {

    public AnalyticsExceptionParser(Context context, Collection<String> additionalPackages) {
        super(context, additionalPackages);
    }

    @Override
    protected String getDescription(Throwable cause,
        StackTraceElement element, String threadName) {

        StringBuilder descriptionBuilder = new StringBuilder();
        final Writer writer = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(writer);
        cause.printStackTrace(printWriter);
        descriptionBuilder.append(writer.toString());
        printWriter.close();

        return descriptionBuilder.toString();
    }
}

Наконец, предоставьте свой AnalyticsExceptionParser экземпляру ExceptionReporter.

    public class MyApplication extends Application {

        @Override
        public void onCreate() {
        ...

            ExceptionReporter reporter = new ExceptionReporter(getTracker(), Thread.getDefaultUncaughtExceptionHandler(), this);
            reporter.setExceptionParser(new AnalyticsExceptionParser(this, packages));
            Thread.setDefaultUncaughtExceptionHandler(reporter);
        }
    }

Это оно. Смотрите отчеты о сбоях на консоли GA в разделе " Поведение> Сбои и исключения".

Вы можете переопределить ExceptionParser это используется основным потоком, чтобы настроить его, чтобы сообщить о полной трассировке стека:

final Thread.UncaughtExceptionHandler uncaughtExceptionHandler =
        Thread.getDefaultUncaughtExceptionHandler();
if (uncaughtExceptionHandler instanceof ExceptionReporter) {
    ExceptionReporter exceptionReporter = (ExceptionReporter) uncaughtExceptionHandler;
    exceptionReporter.setExceptionParser(new ExceptionParser() {
        @Override
        public String getDescription(String s, Throwable throwable) {
            return "Thread: " + s + ", Stacktrace: " + ExceptionUtils.getStackTrace(throwable);
        }
    });
}

Поместите это туда, где вы создаете экземпляр своего экземпляра Google Analytics. ExceptionUtils Я использую класс из библиотеки apache common-lang3.

Другие вопросы по тегам