2014-04-10 11 views
9

Chcę otrzymywać powiadomienia o zgłoszeniu awarii z powodu niezatapianego wyjątku w moim Google Analytics dla mojej aplikacji na Androida. Wykonałem kroki podane w https://developers.google.com/analytics/devguides/collection/android/v4/exceptions#parsing , ale nadal nie otrzymuję żadnego raportu o awarii. Podczas uruchamiania aplikacji wystąpił wyjątek środowiska wykonawczego. Dodałem kod ga_reportUncaughtException jako prawdziwe:Uzyskaj raport o awariach w google analytics

prawdziwą

w moim analytics.xml. Czy jest coś jeszcze, co muszę dodać, aby uzyskać trafienie na koncie Google Analytics. Proszę pomóż!

+0

Mam ten sam problem. Znalazłeś rozwiązanie? – Shmuel

+0

@ David nie dostałem żadnego rozwiązania. Więc użyłem V3 – Anu

+0

Nie wiem, czy to ci pomoże, ale stwierdziłem, że popełniłem błąd - ga_reportUncaughtException ciąg znaków, gdy powinien być boolem true Shmuel

Odpowiedz

1

Z mojego doświadczenia trzeba zrozumieć dwie rzeczy o awarii i wyjątków w Google Analytics:

1) Tylko podstawowe informacje są przechowywane - Google Analytics będzie zapisać tylko nazwę wyjątku i lokalizację (plik kod i numer linii), w którym został zgłoszony wyjątek. Żadne informacje poza tym nie będą dostępne na GA. To zdecydowanie nie jest idealne i jeśli chcesz śledzić faktyczną treść swoich wyjątków (głównie stos połączeń), skorzystaj z Google Play lub zaimplementuj własne rozwiązanie.

2) Wyjątki nie są realizowane w czasie rzeczywistym. Informacje o wyjątkach są zbierane i aktualizowane raz dziennie, więc jeśli eksperymentujesz z wyjątkami i nie widzisz ich od razu, po prostu daj czas.

+0

nie jest to kwestia dyskutowana tutaj. wiemy, że przechowywane są tylko podstawowe informacje, a te wyjątki nie są w czasie rzeczywistym. Problem polega na tym, że w ogóle się nie zalogowali, nawet po kilku dniach. – Shmuel

6

W usłudze Analytics występuje otwarty problem. Mam przeżywa ten sam problem, ale na prawdziwych urządzeniach z API 10 do 19.

https://code.google.com/p/analytics-issues/issues/detail?id=443

Edit1: usunięto pytanie, wystarczy odpowiedzieć na pytanie opisany.

EDIT2: Próbowałem przechwycić i wysłać wyjątki za pomocą modułu Analytics ExceptionBuilder, ale nie zadziałało.

Wygląda na to, że raport został wysłany (przynajmniej LogCat pokazuje, że nastąpiła awaria), ale nie jest przetwarzany przez Analytics.

Podczas gdy Google odpowiada na problem, używam tego obejścia. Myślę, że nie jest to najlepsze rozwiązanie, a kod można poprawić, ale to działa na mnie:

  1. stworzyłem niestandardowy wymiar w Analytics po to kroki https://support.google.com/analytics/answer/2709829?hl=en

  2. w moim app, stworzyłem niestandardową procedurę obsługi wyjątków, korzystając z klasy Analytics ExceptionReporter. Gdy zostanie wychwycony wyjątek, otrzymuję ślad stosu i obcina go do 150 bajtów (w rzeczywistości otrzymuję tylko pierwszą linię stosu i obcina ją do 150 znaków, zakładam, że 1Char = 1 Bajt). Muszę go skrócić, ponieważ jest to maksymalna długość dozwolona przez Analytics przy wysyłaniu wartości niestandardowych wymiarów. Śledzenie stosu jest przechowywane we współużytkowanej preferencji, a nie wysyłane. Próbowałem wysłać go bezpośrednio, ale nie działa, gdy aplikacja się zawiesiła.

    package com.company.package; 
    
    import java.lang.Thread.UncaughtExceptionHandler; 
    
    import android.content.Context; 
    
    import com.google.android.gms.analytics.ExceptionParser; 
    import com.google.android.gms.analytics.ExceptionReporter; 
    import com.google.android.gms.analytics.GoogleAnalytics; 
    import com.google.android.gms.analytics.HitBuilders; 
    import com.google.android.gms.analytics.Tracker; 
    
    public class GoogleAnalyticsTracker { 
    
        private static Tracker mTracker; 
        private static GoogleAnalytics mGa; 
        private Context mContext; 
    
        public GoogleAnalyticsTracker(Context context, int resource) { 
         mContext = context; 
         mGa = GoogleAnalytics.getInstance(context); 
         mTracker = getTracker(resource); 
    
         Thread.setDefaultUncaughtExceptionHandler(new AnalyticsExceptionReporter(mTracker, 
          Thread.getDefaultUncaughtExceptionHandler(), context)); 
        } 
    
        synchronized Tracker getTracker(int xmlResource) { 
         return mGa.newTracker(xmlResource); 
        } 
    
        public void sendScreenLabel(String screenLabel) { 
         mTracker.setScreenName(screenLabel); 
         mTracker.send(new HitBuilders.AppViewBuilder().build()); 
        } 
    
        public void sendCustomDimension(int index, String value) { 
         mTracker.send(new HitBuilders.AppViewBuilder().setCustomDimension(index, value).build()); 
        } 
    
        private class AnalyticsExceptionReporter extends ExceptionReporter { 
    
         public AnalyticsExceptionReporter(Tracker tracker, UncaughtExceptionHandler originalHandler, Context context) { 
          super(tracker, originalHandler, context); 
          setExceptionParser(new AnalyticsExceptionParser()); 
         } 
    
         @Override 
         public void uncaughtException(Thread t, Throwable e) { 
         String exceptionDescription = getExceptionParser().getDescription(t.getName(), e); 
    
          //Add code to store the exception stack trace in shared preferences 
    
          super.uncaughtException(t, e); 
         } 
        } 
    
        private class AnalyticsExceptionParser implements ExceptionParser { 
    
         @Override 
         public String getDescription(String arg0, Throwable arg1) { 
          StringBuilder exceptionFirsLine = new StringBuilder(); 
          for (StackTraceElement element : arg1.getStackTrace()) { 
           exceptionFirsLine.append(element.toString()); 
           break; 
          } 
    
          //150 Bytes is the maximum allowed by Analytics for custom dimensions values. Assumed that 1 Byte = 1 Character (UTF-8) 
          String exceptionDescription = exceptionFirsLine.toString(); 
          if(exceptionDescription.length() > 150) 
           exceptionDescription = exceptionDescription.substring(0, 149); 
    
          return exceptionDescription; 
         } 
        } 
    } 
    
  3. W główną działalność gdy OnStart(), to sprawdzić, czy istnieje jakikolwiek ślad stosu przechowywane we wspólnych upodobań. Jeśli tak, wysyłam niestandardowy wymiar i usuwam udostępnione preferencje.

    @Override 
    protected void onStart() { 
        super.onStart(); 
        String exception = getExceptionFromSharedPreferences(this); 
        if(exception != null && !exception.isEmpty()) { 
         MainApplication.googleAnalyticsTracker.sendCustomDimension(1, exception); 
        } 
        clearExceptionFromSharedPreferences(this); 
    } 
    
  4. końcu stworzył raport niestandardowy w Analytics

Custom report configuration in Google Analytics

EDIT 3:

zdałem sobie sprawę, że wysyłał tylko nazwę pliku i LineNumber, ale nie ExceptionName i pochodzenie wyjątku w moim pakiecie. Poprawiłem odpowiedź, dodając kod, aby również wysłać te informacje.

private class AnalyticsExceptionParser implements ExceptionParser { 

    @Override 
    public String getDescription(String arg0, Throwable arg1) { 
     String exceptionDescription = getExceptionInfo(arg1, "", true) + getCauseExceptionInfo(arg1.getCause()); 

     //150 Bytes is the maximum allowed by Analytics for custom dimensions values. Assumed that 1 Byte = 1 Character (UTF-8) 
     if(exceptionDescription.length() > 150) 
      exceptionDescription = exceptionDescription.substring(0, 150); 

     return exceptionDescription; 
    } 
} 
//#endregion 

//#region PRIVATE METHODS 
private String getCauseExceptionInfo(Throwable t) { 
    String causeDescription = ""; 
    while(t != null && causeDescription.isEmpty()) { 
     causeDescription = getExceptionInfo(t, "com.myPackageName", false); 
     t = t.getCause(); 
    } 
    return causeDescription; 
} 

private String getExceptionInfo(Throwable t, String packageName, boolean includeExceptionName) { 
    String exceptionName = ""; 
    String fileName = ""; 
    String lineNumber = ""; 

    for (StackTraceElement element : t.getStackTrace()) { 
     String className = element.getClassName().toString().toLowerCase(); 
     if(packageName.isEmpty() || (!packageName.isEmpty() && className.contains(packageName))){ 
      exceptionName = includeExceptionName ? t.toString() : ""; 
      fileName = element.getFileName(); 
      lineNumber = String.valueOf(element.getLineNumber()); 
      return exceptionName + "@" + fileName + ":" + lineNumber; 
     } 
    } 
    return ""; 
} 
+0

Dzięki za odpowiedź, naprawdę mi pomogło. I tak, odpowiada na pytanie. – ol0

Powiązane problemy