|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Performance Monitoring" |
| 4 | +date: 2019-03-11 |
| 5 | +categories: ["Firebase"] |
| 6 | +image: firebase/performance_monitoring |
| 7 | +github: firebase/tree/master/performance_monitoring |
| 8 | +description: "Firebase" |
| 9 | +version: Firebase-Perf 16.2 |
| 10 | +keywords: "firebase, wydajność, performance, monitoring, trasa, trace, network, android, programowanie, programming" |
| 11 | +--- |
| 12 | + |
| 13 | +## Cechy |
| 14 | +`Firebase Performance Monitoring` jest usługą pomagającą uzyskać wgląd do wydajności aplikacji na urządzeniach użytkowników dzięki czemu możliwe jest zlokalizowanie i rozwiązanie problemów związanych z wydajnością, płynnością i szybkością działania. Automatycznie dokonuje pomiarów dla czasu startu aplikacji, działania w tle (i na pierwszym planie), renderowania ekranów czy też większości zapytań sieciowych. Przesłane raporty zawierają informacje nt użycia procesora i pamięci, a także metadane urządzenia (m.in. model, wersja systemu, wersja aplikacji, kraj) i szczegółów trasy zgłoszenia. Performance Monitoring nie zbiera żadnych danych personalnych użytkownika. Jeśli automatycznie przesyłane próbki to za mało istnieje również możliwość tworzenia personalizowanych tras śledzenia wydajności. Konsola Firebase automatycznie dokonuje analizy otrzymanych próbek na podstawie których generuje podpowiedzi o potencjalnie niewydajnych miejscach aplikacji. |
| 15 | + |
| 16 | +## Trasy personalizowane |
| 17 | +Rejestrowanie wydajności aplikacji zachodzi na tzw. trasach (`traces`), które opisane są między dwoma miejscami: punktem startowym i końcowym. Automatyczna trasa dla działania aplikacji w tle (`App in background`) rozpoczyna się od momentu kiedy ostatnia Aktywność (`Activity`) będąca w `foreground` wywoła `onStop`, a zakończy się w momencie wywołania `onResume` przez pierwszą Aktywność przechodzącą z trybu `background` do `foreground`. Podobnie rzecz ma się z trasami własnymi, które dotyczą wybranego przez programistę przedziału cyklu życia. |
| 18 | + |
| 19 | +//TODO |
| 20 | +{% highlight kotlin %} |
| 21 | +val myTrace = FirebasePerformance.getInstance().newTrace("test_trace") |
| 22 | +myTrace.start() |
| 23 | +myTrace.stop() |
| 24 | +{% endhighlight %} |
| 25 | + |
| 26 | +Trasy personalizowane mogą być dodatkowo opisane metrykami, których zadaniem jest liczenie wystąpień pewnych zdarzeń. |
| 27 | + |
| 28 | +//TODO |
| 29 | +{% highlight kotlin %} |
| 30 | +val item = cache.fetch("item") |
| 31 | +if (item != null) { |
| 32 | + myTrace.incrementMetric("item_cache_hit", 1) |
| 33 | +} else { |
| 34 | + myTrace.incrementMetric("item_cache_miss", 1) |
| 35 | +} |
| 36 | +{% endhighlight %} |
| 37 | + |
| 38 | +Dodanie adnotacji `@AddTrace` do metody wraz z jej nazwą powoduje rejestrowanie wydajności podczas wykonywania funkcji (trasa rozpoczyna się na początku metody, a kończy kiedy zostanie wykonana). Jednakże tak stworzone trasy nie mają możliwości dodawania metryk. |
| 39 | + |
| 40 | +//TODO |
| 41 | +{% highlight kotlin %} |
| 42 | +@AddTrace(name = "onCreateTrace", enabled = true /* optional */) |
| 43 | +override fun onCreate(savedInstanceState: Bundle?) { |
| 44 | + super.onCreate(savedInstanceState) |
| 45 | +} |
| 46 | +{% endhighlight %} |
| 47 | + |
| 48 | +## Zapytania sieciowe |
| 49 | +Wysyłane żądania sieciowe `HTTP/S` są przechwytywane i przetwarzane do postaci raportów zawierających informacje takie jak: czas odpowiedzi, rozmiar wysłanych żądań i otrzymanych odpowiedzi, wskaźnik sukcesu oraz metadane urządzenia. Ze względu na zachowanie polityki prywatności Performance Monitoring pomija parametry `URL` w procesie budowania anonimowych wzorców adresów wyświetlanych w `konsoli Firebase`. Rejestrowanie zdarzeń sieciowych wspierane jest tylko dla żądań stworzony przy użyciu `OkHttp3`. |
| 50 | + |
| 51 | +//TODO |
| 52 | +{% highlight kotlin %} |
| 53 | +val metric = FirebasePerformance.getInstance().newHttpMetric("https://www.google.com", |
| 54 | + FirebasePerformance.HttpMethod.GET) |
| 55 | +val url = URL("https://www.google.com") |
| 56 | +metric.start() |
| 57 | +val conn = url.openConnection() as HttpURLConnection |
| 58 | +conn.doOutput = true |
| 59 | +conn.setRequestProperty("Content-Type", "application/json") |
| 60 | +try { |
| 61 | + val outputStream = DataOutputStream(conn.outputStream) |
| 62 | + outputStream.write(data) |
| 63 | +} catch (ignored: IOException) { |
| 64 | +} |
| 65 | + |
| 66 | +metric.setRequestPayloadSize(data.size.toLong()) |
| 67 | +metric.setHttpResponseCode(conn.responseCode) |
| 68 | +printStreamContent(conn.inputStream) |
| 69 | + |
| 70 | +conn.disconnect() |
| 71 | +metric.stop() |
| 72 | +{% endhighlight %} |
| 73 | + |
| 74 | +## Debugowanie |
| 75 | +Tryb debugowania pozwala już na wczesnym etapie deweloperskim sprawdzić poprawność konfiguracji oraz otrzymywane rezultaty. Aby włączyć debugowanie należy dodać odpowiedni wpis `meta-data` do `AndroidManifest` oraz uruchomić właściwe polecenie w `adb`. |
| 76 | + |
| 77 | +{% highlight xml %} |
| 78 | +<meta-data |
| 79 | + android:name="firebase_performance_logcat_enabled" |
| 80 | + android:value="true" /> |
| 81 | +{% endhighlight %} |
| 82 | + |
| 83 | +{% highlight console %} |
| 84 | +adb logcat -s FirebasePerformance |
| 85 | +{% endhighlight %} |
| 86 | + |
| 87 | +## Automatyczne raportowanie |
| 88 | +Zbieranie i wysyłanie raportów jest domyślnie włączone dla wszystkich użytkowników i wersji aplikacji. W przypadku, gdy istnieje potrzeba opcjonalnego wyłączenia raportowania (np. dla wersji deweloperskich) należy dodać odpowiedni wpis `meta-data` do `AndroidManifest` lub zmienić wartość właściwości `firebasePerformanceInstrumentationEnabled` w `gradle.properties`. |
| 89 | + |
| 90 | +{% highlight xml %} |
| 91 | +<!-- disable at build time but allow to enable at runtime --> |
| 92 | +<meta-data |
| 93 | + android:name="firebase_performance_logcat_enabled" |
| 94 | + android:value="true" /> |
| 95 | + |
| 96 | +<!-- disable at build time and don't allow to enable at runtime --> |
| 97 | +<meta-data |
| 98 | + android:name="firebase_performance_collection_deactivated" |
| 99 | + android:value="true" /> |
| 100 | +{% endhighlight %} |
| 101 | + |
| 102 | +Aby dokonywać zmian (włączenia lub wyłączenia raportowania) w trakcie działania programu ze względu na ustawienia użytkownika lub zdalną konfigurację wystarczy zmienić wartość właściwości `isPerformanceCollectionEnabled`. |
| 103 | + |
| 104 | +{% highlight kotlin %} |
| 105 | +FirebasePerformance.getInstance().isPerformanceCollectionEnabled = true //get value from pref or remote config |
| 106 | +{% endhighlight %} |
0 commit comments