Минус одна система аналитики данных

Количество систем аналитики и визуализации данных, необходимых для повседневной работы, давно превысило все разумные пределы. С появлением Firebase их стан пополнился на одну. В данной статье мы расскажем как подружить мобильную платформу от Google с другим, более привычным инструментом аналитики — Google Analytics. Площадкой для экспериментов стал наш новый продукт Tviggo (мобильное приложение + набор мессенджер ботов для международных звонков по GSM — www tviggo. net).

bbcc3cfd402d449aa745315a9872a4de.jpg

Насколько вам известно, Google Tag Manager (GTM) в декабре 2016 выпустил обновление — GTM V5 для iOS и Android, заточенное под работу с Firebase. В настоящее время, реальных примеров кода использования 5 версии практически нет, поэтому помимо достаточно скудного напутствия на странице Quick Start необходимо собирать информацию по крупицам. Так, одним из важных отличий от v4 и более ранних версий является порядок инициализации GTM. Теперь от разработчика не требуется писать никакого boilerplate кода по инициализации и надо забыть о loadContainerPreferNonDefault. В то же время, можно сосредоточиться только на отправке событий в Firebase, не забыв при этом поместить в assets/containers JSON файл с базовой версией контейнера, который можно скачать из GTM сразу после первой публикации.

Firebase может передавать GTM любое имя события и параметры (помимо всех штатных которые генерируются приложением автоматически) для сбора аналитических данных по приложению.

Посредством логики GTM, данные события могут транслироваться во внешние системы, такие как Google Analytics.
Для осуществления подобной манипуляции, необходимо в коде, в местах, принципиальных для контроля аналитикой, расставить параметры для выгрузки данных в Firebase (например, отгрузка события «Start» с параметрами A=1, B=2).

Далее, в GTM необходимо завести переменные A и B, настроить конфигурацию переменной, затем завести триггер (например, «запуск приложения»), и создать тег (например, как только Firebase вызовет событие Start — необходимо выгрузить в GA заданный контент).

Теперь визуально и пошагово:

1. Заводим пользовательскую переменную

886f41f356b64faa875d6a2b8de2ec8f.png

2. Прописываем конфигурацию переменной

12e3d2106dbc4373896080dc2d07b0c5.png

3. Заводим триггер

0a6abd72b7a74448be695ee5226f8d9f.png

4. Создаем тег

9c46336ff2384ab69d83f31478b3b1c3.jpg

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

class TviggoAnalytics(context: Context) {

   val TviggoStart = Event("TviggoStart")

   object Params {
       val call_uid = Param("call_uid")
       val call_medium = Param("call_medium")
   }

   private val firebase: FirebaseAnalytics = FirebaseAnalytics.getInstance(context)

   inner class Event(val name: String) {

       fun push(vararg params: Pair) {
           push(HashMap() + params)
       }

       fun push(baseParams: Map, vararg params: Pair) {
           push(baseParams + params)
       }

       fun push(params: Map) {
           val bundle = Bundle()
           params.forEach {
               if (it.value != null) {
                   when (it.value) {
                       is String -> bundle.putString(it.key.name, it.value as String)
                       is Int -> bundle.putInt(it.key.name, it.value as Int)
                       is Long -> bundle.putLong(it.key.name, it.value as Long)
                       is Float -> bundle.putFloat(it.key.name, it.value as Float)
                       is Byte -> bundle.putByte(it.key.name, it.value as Byte)
                       is Short -> bundle.putShort(it.key.name, it.value as Short)
                       is Double -> bundle.putDouble(it.key.name, it.value as Double)
                       is Boolean -> bundle.putBoolean(it.key.name, it.value as Boolean)
                       is Char -> bundle.putChar(it.key.name, it.value as Char)
                       else -> bundle.putString(it.key.name, it.value.toString())
                   }
               }
           }
           firebase.logEvent(name, bundle)
       }
   }

   class Param(val name: String)
}

И далее, допустим в классе Application, при создании экземпляра приложения, прописываем отправку в Firebase события с параметром Идентификатора звонка равным 2.

val analytics = TviggoAnalytics(applicationContext)

override fun onCreate() {
   super.onCreate()
   analytics.TviggoStart.push(
           TviggoAnalytics.Params.call_uid to 2,
           TviggoAnalytics.Params.call_medium to "GSM"
   )
}

Параметр «идентификатор звонка» использован для примера — на самом деле никакого идентификатора звонка в момент старта еще нет.

Что получаем в итоге:
1. Выполнено некоторое действие в приложении, отчет о выполнении которого мы и видим в GA, посредством трансформации исходного события Firebase через контейнер Google Tag Manager.

9767f9684bc74fffa01f4deaee59ed83.png

2. Если проанализировать еще глубже, мы увидим, что в Label отобразился созданный нами параметр со значением 2 (именно так как это указано в теге).

73529ebcac694db794294c91d12fe8e5.png

3. При этом, все оригинальные события в начальном виде также загружаются в Firebase.

Таким образом, посредством GTM вы получаете механизм, позволяющий сохранять в любой удобной системе аналитики и анализировать весь поток данных, поступающих от Firebase.

Подобная система позволяет оперативно править выгрузки в GA без пересборки приложения.

Надеюсь, объяснение было понятным и полезным для хабро-сообщества.

P.S. да, наш проект написан на Kotlin, поэтому Android код будет выглядеть не совсем привычно, но, думаю, Вы справитесь :)

С радостью отвечу на ваши вопросы!

Комментарии (0)

© Habrahabr.ru