Задания и customTask в Google Analytics

Многие специалисты обходят стороной вопросы того, как изнутри работают инструменты, с которыми они взаимодействуют. Иногда даже незначительное погружение «под капот» может дать массу информации, которая поможет лучше понимать и эффективнее работать с инструментом.

Например, в Google Analytics (библиотека analytics.js) есть понятие заданий и их очереди.

На этот вопрос стоит обратить внимание, как минимум, по двум причинам:

  1. Тут происходит работа по сбору данных о хите (просмотр страницы, событие, тайминг и др.). На этом этапе данные могут быть искажены, изменены, потеряны и т. п.
  2. На этом этапе аналитик со своей стороны может изменить передаваемые данные. Добавив информацию, удалив ее или, например, отправив дубликат данных в другой счетчик.

В этой статье, опираясь на статью Simo Ahava «CUSTOMTASK – THE GUIDE» разберемся:

  1. Какие задания и в какой очередности выполняются при активации Google Analytics.
  2. Что такое customTask и как с ним работать.
  3. Рассмотрим примеры задач, которые можно реализовать с использованием customTask.

Сам customTask – это функция библиотеки analytics.js. Она позволяет получать и устанавливать значения по мере их генерации.

Важно сказать, что в Google Tag Manager customTask добавляет дополнительную ценность. В GTM всегда было довольно сложно получить доступ к процессу генерации хита при использовании тега. customTask предлагает решение этой проблемы и позволяет взглянуть по-новому на процесс настройки Google Analytics.

Как работают задания

Когда запускается генерация хита Google Analytics (например: ga('send', 'pageview'), не важно как: через JavaScript-код счетчика на сайте или через тег в Google Tag Manager, вы – фактически говорите библиотеке analytics.js сгенерировать HTTP-запрос на сервер Google Analytics.

Конечная точка (эндпоинт), на который отправляются обращения, обычно – /collect на стороне домена Google Analytics collector.

Процесс создания и отправки обращений на серверы GA работает через Measurement Protocol (MP). Фактически MP является основным процессом, используемым всеми механизмами отслеживания Google Analytics, будь то ga('send'...) в JavaScript SDK, теги GA в Google Tag Manager, собственные SDK для Android и iOS и пользовательские HTTP-запросы из систем управления.

Когда вы используете JavaScript SDK, запуская ga('send', 'pageview'), или запускаете тег Google Analytics в GTM, вы инициируете очередь процессов, конечным результатом которых является отправленный MP запрос в Google Analytics. Эта очередь включает в себя ряд заданий, из которых customTask выполняется первым.

В таблице ниже все эти задания перечислены в порядке их выполнения.

Задание

Описание

customTask

Не имеет собственной функциональности.

Может быть переопределен для управления объектом модели до того, как он будет обработан другими задачами.

previewTask

Прерывает выполнение запроса, если страница запрашивается только для того, чтобы создать превью-значок в блоке «Топ-сайты» для браузера Safari.

checkProtocolTask

Прерывает выполнение запроса, если на странице не используется ни http, ни https.

validationTask

Проверяет, имеют ли поля в запросе допустимые и ожидаемые значения.

Прерывает запрос, если это не так (например, попытка отправить строчные данные в event value (может принимать только числовые данные)).

checkStorageTask

Прерывает выполнение запроса, если в трекере настроено использование файлов cookie, но в браузере пользователя они отключены.

historyImportTask

Импортирует информацию из файлов cookie от устаревших версий счетчика GA (ga.js и urchin.js).

samplerTask

Производит выборку посетителей для семплирования в соответствии со значением sampleRate, установленным для этого счетчика.

buildHitTask

Генерирует строку hitPayload, которая представляет собой словарь, состоящий из параметров и их значений, для передачи в запрос Measurement Protocol.

sendHitTask

Отправляет на серверы Google Analytics запрос Measurement Protocol из поля hitPayload.

timingTask

Если производится автоматическая выборка страниц для измерения скорости страниц, эта задача отправит в GA время генерации.

displayFeaturesTask

Если в настройках GA включена функция отчетов о рекламе, эта задача сгенерирует запрос на серверы DoubleClick.

Каждая задача получает объект модели в качестве параметра. Объект модели содержит все поля, заданные в трекере, а также любые дополнения, создаваемые в самих задачах.

Прелесть customTask заключается в том, что поскольку она выполняется первой в очереди задач, можно использовать ее для изменения поведения других задач. Например, если вы хотите запустить Google Analytics локально или в расширении Chrome, надо сделать так, чтобы задача checkProtocolTask никогда не запустилась, потому что она прерывает выполнения запроса, если протокол страницы не является http или https. customTask будет выглядеть следующим образом:

var customTask = function(model) {
  model.set('checkProtocolTask', null);
};

Как вы можете видеть, задача представляет собой поле в объекте модели, которым вы можете управлять точно так же, как вы можете управлять любым другим полем в модели. Например, если вы хотите получить идентификатор отслеживания (UA-XXXXXX-Y) и отправить его в пользовательский параметр с индексом 15, вы можете использовать следующий customTask:

var customTask = function(model) {
  // Получаем ID из объекта модели
  var trackingId = model.get('trackingId');
 
  // Устанавливаем ID в пользовательский параметр
  model.set('dimension15', trackingId);
};

Чтобы узнать, какие поля доступны в объекте модели, ознакомьтесь с документацией для разработчика. Обратите внимание, что документ не полный, так как в нем отсутствуют некоторые задания.

Выполняя взаимодействие модели с customTask, вы получаете дополнительный контроль над тем, как выполняется очередь заданий.

Как добавить customTask в хит

Чтобы добавить customTask в теги Google Tag Manager, вам необходимо создать пользовательскую переменную JavaScript, которая возвращает метод customTask в теле переменной.

Добавить переменную customTask в теги можно или с помощью переменной настроек Google Analytics (рекомендуется), или напрямую, переопределив настройки тега.

Вам нужно прокрутить вниз до блока «More settingsFields to Set» и добавить новое поле:

Если вы используете Универсальную аналитику на странице (analytics.js) фрагмент кода, вы добавляете пользовательскую задачу вот так, например.

Если Universal Analytics (analytics.js) у вас установлен непосредственно в коде страницы, customTask можно добавить так:

var _customTask = function() {
  // Устанавливает Client ID в пользовательскую переменную с индексом 199
  return function(customTaskModel) {
    customTaskModel.set('dimension199', customTaskModel.get('clientId'));
  };
};

ga('create', 'UA-12345-1');
ga('set', 'customTask', _customTask());
ga('send', 'pageview');

Обратите внимание, что вы можете установить только один customTask для каждого трекера / хита / тега. Если вы хотите добавить более одного задания в функцию customTask, вам нужно написать JavaScript, который объединит все задачи в одну.

Примеры задач, которые можно реализовать с помощью customTask

Как было написано выше, customTask является особенным по двум причинам.

  1. Он не имеет собственной специальной функциональности. Очередь заданий может и будет отлично работать без определения customTask.
  2. Он запускается перед любой другой задачей, что означает, что у вас есть полный контроль над тем, как обрабатывается очередь.

Пример задач, которые можно решить с customTask описал в своей статье «CUSTOMTASK - THE GUIDE» Simo Ahava. Рассмотрим некоторые из них (в этой же статье можно найти и саму последовательность настройки указанным customTask.

1. Отправка Client ID в качестве пользовательского параметра

Одна из самых простых задач. Она не изменяет саму очередь заданий, просто получает Client ID из объекта модели, а затем устанавливает его в качестве значения указанного пользовательского параметра.

Простое решение сложной проблемы. Без customTask получить и установить Client ID в теге Google Analytics было бы сложно. Если тег запускается для посетителя, зашедшего на сайт впервые (еще не получил Client ID), фактическое поле Client ID недоступно. Типичным решением для этой задачи было получение Client ID путем создания фиктивного трекера или отправки идентификатора клиента с тегом события, который срабатывал после просмотра страницы.

Но customTask позволяет решить эту задачу проще.

2. Отправка событий в два и более счетчика Google Analytics

Алгоритм задачи: функция customTask сначала сохраняет ссылку на sendHitTask в глобальной переменной, после чего перезаписывает sendHitTask в текущем объекте модели с помощью кода дубликатора.

Дубликатор сначала отправляет исходный хит в основной счетчик Google Analytics, после чего заменяет ID в hitPayload на ID второго счетчика. Затем снова вызывается глобальная задача sendHitTask, и хит отправляется во второе свойство с идентичным наполнением.

Обратите внимание! Ссылка на sendHitTask должна храниться в глобальной переменной, чтобы избежать дубликации полей. Например, вы всегда получаете исходную ссылку на sendHitTask так:

var originalSendTask = model.get('sendHitTask');

Каждый раз при запуске этого кода customTask будет получать ссылку на содержимое объекта модели sendHitTask. При создании стандартных хитов к электронной торговле или при автоматической выборке хитов по времени тег будет отправлен несколько раз. Таким образом, ссылка на исходную задачу sendHitTask рекурсивно дублируется с каждой итерацией model.set('sendHitTask');, что приводит к проблемам выполнения кода.

Если глобальная переменная хранит ссылку на исходную задачу sendHitTask, этой проблемы не будет.

3. Отслеживание хитов при разрыве соединения

David Vallejo реализовал решение проблемы потери хитов из-за разрыва подключения к интернету. Он использует customTask для проверки, находится ли пользователь в автономном режиме – если да, хиты будут сохраняться в очереди. Как только подключение восстанавливается, очередь обрабатывается, и хиты отправляются в GA.

4. Удаление персональных данных из отправляемой в GA информации

Некоторые законодательные акты, например GDPR и сам Google Analytics в «Условиях предоставления услуг» запрещают передачу персональных данных пользователей в счетчик Google Analytics.

В этой задаче customTask проверяет содержимое PayLoad хита перед отправкой в GA и удаляет из него все данные, которые совпадают с указанными в настройке регулярными выражениями. Регулярные выражения могут составляться таким образом, чтобы, например, соответствовать адресам электронной почты.

5. Автоматическое связывание доменов через регулярные выражения

Этот customTask позволяет Google Tag Manager получить ту же возможность, что по умолчанию встроена в analytics.js – связывание доменов по регулярным выражениям. Стандартная настройка отслеживания Google Analytics позволяет связывать домены, используя регулярные выражения. Но настройка междоменного отслеживания GTM принимает только строковые значения.

В этой задаче customTask фактически применяет плагин автоматической разметки к самому объекту трекера, позволяя передать регулярное выражение. Таким образом домены можно связать на основе соответствия регулярным выражениям, а не списку из строки.

6. Отправка размера PayLoad в пользовательский параметр

Это решение позволяет отправлять размер PayLoad для каждого хита в Google Analytics в качестве пользовательского параметра в Google Analytics.

Максимальный размер PayLoad для Google Analytics составляет 8192 байта.

Полезно проверять, приближаетесь ли вы к пороговому значению при отправке хита, потому что если размер PayLoad будет превышен, этот хит не отправится в Google Analytics.

7. Автоматическое уменьшение длины PayLoad

Этот customTask анализирует отправляемый в Google Analytics PayLoad и при необходимости «урезает» его до максимально допустимого размера (8192 байта).

В Google Analytics может отправиться длинный PayLoad, особенно если настроена расширенная электронная торговля. Но, к сожалению, PayLoad, размер которого превышает максимально допустимый, не будет отправлен в GA. Это, в свою очередь, приведет к потере части данных.

Это решение использует рекурсивный анализ PayLoad и удаления из него ненужной информации, которая занимает место.

8. Отправка типа хита в качестве пользовательского параметра

Это решение позволяет отправлять тип хита (просмотр страницы (pageview), событие (event), время (timing) и т. п.) в качестве пользовательского параметра с каждым хитом, к которому прикреплен этот customTask.

Эта задача полезна для отладки, так как можно создать сегмент с учетом типа отправляемого хита.

9. Создание и обновление сессионных cookie

Решение для создания и/или обновления файла cookie, срок действия которого истекает после установленного тайм-аута (по умолчанию 30 минут).

Все хиты, к которым прикреплен этот customTask, будут обновлять файл cookie при каждом срабатывании.

Наличие этого файла cookie в браузере будет указывать, что для текущего пользователя все еще активен сеанс Google Analytics.

Файл cookie можно использовать, например, чтобы блокировать отправку событий в Google Analytics, в случае отсутствия активного сеанса.

10. Предотвращение отправки дублирующих транзакций

В этом решении customTask сохраняет все отправленные идентификаторы транзакций в браузере. Когда хит с новой транзакцией попадает в очередь для отправки в Google Analytcs, customTask проверяет, существует ли идентификатор этой транзакции в списке идентификаторов, отправленных ранее. Если совпадение находится, хит блокируется, что предотвращает отправку дубликата данных в GA.

Если совпадение не найдено, хит отправляется в обычном режиме, а идентификатор транзакции записывается в список отправленных идентификаторов, таким образом, любая попытка отправить транзакцию с этим же идентификатором будет заблокирована.

11. Дублирование с последующим контролируемым искажением данных

Скрипт полностью дублирует все данные Google Analytics, к которым прикреплен customTask, и отправляет их в ID другого ресурса, указанного в настройках скрипта.

Прелесть в том, что в дополнение к дублированию данные также искажаются. В конечном наборе все строки преобразуются в другие строки, и это делается контролируемо (то есть любая заданная строка всегда преобразуется в одну и ту же другую строку). Все цены также искажаются на рандомизированное процентное значение.

Такие данные можно использовать для создания демонстрационного или обучающего набора данных GA из другого реального набора данных, не раскрывая реальные данные и их источник.

Объединение нескольких customTask

Как видно, есть множество интересных применений customTask. Часть из которых можно применить в том или ином проекте. Но есть одна проблема. Это javaScript, и у него есть правила, которые надо соблюдать:

  • Можно задать только одно поле один раз для каждого тега. Поэтому можно задать только одно поле customTask для каждого тега.
  • Можно задать только один параметр модели один раз для каждого тега, поэтому, например, можно задать только один атрибут sendHitTask для каждого тега.

Итак, допустим, надо реализовать два трюка (2. Отправить событие в два, и более счетчика Google Analytics) и (4. Удалить персональные данные из отправляемой в GA информации). Первое, что приходит в голову – просто объединить оба решения в последовательный код:

function() {
  return function(model) {
 
    // Определяем регулярное выражения для персональных данных
    var piiRegEx = [{
      name: 'EMAIL',
      regex: /.{4}@.{4}/g
    }];
   
    var globalSendTaskName = '_' + model.get('trackingId') + '_originalSendTask';
   
    var originalSendTask = window[globalSendTaskName] = window[globalSendTaskName] || model.get('sendHitTask');
   
    // Очищаем персональные данные из payload
    model.set('sendHitTask', function(sendModel) {
     
      ...
     
    });
   
    // Отправляем хит в другой счетчик:
    model.set('sendHitTask', function(sendModel) {
     
      ...
     
    });
   
  };
}

Это не сработает. Поле sendHitTask тут задается дважды, а это значит, что данные сохранятся только из второго пункта (поскольку он перезапишет первый набор).

Вместо этого надо реализовать решение на JavaScript и объединить оба взаимодействия с sendHitTask в одно. Вам надо будет определить порядок, в котором код должен выполняться.

Проведем очистку персональных данных до того, как отправили дубликат хита. В итоге код будет выглядеть так:

function() {
  return function(model) {
 
    // Определяем регулярное выражения для персональных данных
    var piiRegEx = [{
      name: 'EMAIL',
      regex: /.{4}@.{4}/g
    }];
 
    // Определяем ID счетчика в который надо отправить дубликат хита
    var newTrackingId = 'UA-12345-2';
 
    var globalSendTaskName = '_' + model.get('trackingId') + '_originalSendTask';
 
    var originalSendTask = window[globalSendTaskName] = window[globalSendTaskName] || model.get('sendHitTask');
 
    var i, hitPayload, parts, val, oldTrackingId;
 
    model.set('sendHitTask', function(sendModel) {
 
      // Очищаем персональные данные из payload
      hitPayload = sendModel.get('hitPayload').split('&');
   
      for (i = 0; i
        parts = hitPayload[i].split('=');
     
        // Двойное декодирование для учета кодирования сервера + analytics.js
        val = decodeURIComponent(decodeURIComponent(parts[1]));
     
        piiRegEx.forEach(function(pii) {
          val = val.replace(pii.regex, '[REDACTED ' + pii.name + ']');
        });
     
        parts[1] = encodeURIComponent(val);
        hitPayload[i] = parts.join('=');
      }
   
      sendModel.set('hitPayload', hitPayload.join('&'), true);
      originalSendTask(sendModel);
   
      // Перезапись ID
      hitPayload = sendModel.get('hitPayload');
      oldTrackingId = new RegExp(sendModel.get('trackingId'), 'gi');
      sendModel.set('hitPayload', hitPayload.replace(oldTrackingId, newTrackingId), true);
      originalSendTask(sendModel);
    });
  };
}

Код достаточно сложный, и сложность его возрастает с каждой добавленной задачей, которую надо выполнить. Это ограничения JavaScript и того факта, что можно выполнить только один customTask.

В конце концов, сложность действий будет зависеть от навыков работы с JavaScript. Вам нужно знать, как браузер выполняет код построчно, и, следовательно, вам нужно будет убедиться, что все, что вы хотите запустить первым, также выполняется браузером первым. Вот почему в приведенном выше примере выполняется очистка PII перед дублированием попадания. Если бы очистка PII произошла ПОСЛЕ дублирования попадания, это было бы излишним, так как это все равно позволило бы PII потенциально поступать в Google Analytics.

Заключение

customTask – одна из самых крутых функций, появившихся в Google Analytics за последнее время. А при совместном использовании с Google Tag Manager она становится еще круче.

Советуем ознакомиться с общей информацией о задачах. Понимание того, как они работают, даст представление о том, как analytics.js собирает и отправляет запросы в Google Analytics.

(Голосов: 6, Рейтинг: 4.67)