Отправка Nginx-логов в Google Analytics
С наших Download-серверов каждый день скачивается несколько миллионов драйверов (статичные .exe и .zip файлов). Для анализа поведения пользователей перед нами встала задача посчитать следующие параметры: когда, сколько, как часто и даже кто именно скачивает драйверы.
Самым очевидным решением было бы использовать инструменты типа AWstat, GoAccess, ELK stack или Splunk, а в крайнем случае собирать логи Nginx.
Но у каждого варианта есть свои минусы: неудобный интерфейс, скудность данных, сложность настройки и, самое главное, отсутствие возможности строить сегменты в пользовательских отчётах.
И тогда мы решили заставить Nginx самостоятельно отправлять события в Google Analytics сразу же после скачивания файла. Мы также смогли передать в GA уникальный идентификатор пользователя ClientID.В результате мы получили аналитику по статичным файлам, к которым раньше невозможно было привязать счетчик GA.
Под катом готовый конфиг и примеры работы нашей системы.В прошлом посте мы рассказали о том, как отправляем события из приложения DriverPack Online, используя Analytics Measurement Protocol.
Ну, а сегодня мы покажем, как трекаются загрузки статических файлов на наших Download-серверах.
Информация по загрузкам приходит в режиме «реального времени».
Работает «из коробки»
Теперь можно мониторить, сколько реальных скачиваний нашего продукта происходит с серверов. Причём подсчет уникальных загрузок производится в разы точнее, чем если делать это по IP-адресу, т.к. к каждому пользователю привязан уникальный идентификатор — ClientID.
Ошибки 404 и 500 отслеживаются через события (events).
Благодаря тому, что мы передаем в события реальный IP-адрес юзера, мы можем использовать при анализе его местоположение.
Отчётам «по поведениям» можно верить, так как пробрасывается реальный ClientID пользователя, что позволяет оценить:
- число новых и вернувшихся пользователей,
- периодичность посещений пользователем и время с его последнего посещения,
- вовлечение пользователей,
- по каким ключевым словам пользователь пришел к нам на сайт с самого начала.
Nginx сам передаёт правильный User-Agent, что дает возможность построить отчеты по браузерам и ОС. В отчете можно встретить wget, которым наш DriverPack Online выкачивает драйверы, реальные браузеры, а также роботов и всяких парсеров.
Для кого-то окажется очень ценной информация о загрузках с мобильных устройств.
К большому сожалению, referrer передать в GA мы пока не можем, т.к. Nginx не поддерживает urlencode ().Поэтому отчёты по каналам работать не будут (подробности в конце поста).
Как настроить так же? Инструкция
1. Создаем отдельно счётчик GA, с которым будут работать все Download-серверы. Или используем номер существующего счетчика.
2. В настройках счётчика «Пользовательские параметры» добавляем специальные параметры:
- dimension1. Название «ClientID», уровень «Пользователь»;
- dimension2. Название «request_time», уровень «Hit»;
- dimension3. Название «body_bytes_sent», уровень «Hit».
Это поможет нам рассчитать скорость закачки и даже процент оборванных скачиваний.
3. Создаём конфиг с названием «google-analytics» в директории »/etc/nginx/»
# Номер нашего счетчика и основного домена set $gaID 'UA-XXXXXX-1'; set $mainDomain 'example.com'; # Пробрасываем ClientID через cookie »_ga_cid» # Важно, чтобы cookie была установлена для всех субдоменов set $cid $cookie__ga_cid; if ($cid = '') {
set $cid »$request_time$request_length.$msec$connection»; } add_header Set-Cookie »_ga_cid=$cid; path=/; domain=.$mainDomain» always;
set $postURI $uri; set $postRequestURI $request_uri; set $postIP $remote_addr; set $postHOST $host; # Отправка события pageview location @GAlog { resolver 8.8.8.8 ipv6=off internal; proxy_ignore_client_abort on; proxy_next_upstream timeout; proxy_pass http://google-analytics.com/collect? v=1&dh=$postHOST&dt=$postHOST&tid=$gaID&cid=$cid&cd1=$cid&uip=$postIP&cd2=$request_time&cd3=$body_bytes_sent&t=pageview&dp=$postURI; } # Отправка события 404 location @GAlog404 { resolver 8.8.8.8 ipv6=off; internal; proxy_ignore_client_abort on; proxy_next_upstream timeout; proxy_pass http://google-analytics.com/collect? v=1&tid=$gaID&cid=$cid&cd1=$cid&uip=$postIP&t=event&el=nginx&ec=404&ea=$postHOST$postRequestURI; } # Отправка события 500 location @GAlog500 { resolver 8.8.8.8 ipv6=off; internal; proxy_ignore_client_abort on; proxy_next_upstream timeout; proxy_pass http://google-analytics.com/collect? v=1&tid=$gaID&cid=$cid&cd1=$cid&uip=$postIP&t=event&el=nginx&ec=500&ea=$postHOST$postRequestURI; }
4. Получаем конфигурационный файл »/etc/nginx/conf.d/default.config» (на примере нашего)
server { include google-analytics;
listen 80; server_name localhost; autoindex on; autoindex_exact_size off;
access_log off;
location / { root /usr/share/nginx/html; index index.html index.htm; post_action @GAlog; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; post_action @GAlog404; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; post_action @GAlog500; } }
5. Перезапускаем nginx
$ sudo service nginx reload
6. Настраиваем счетчик на сайте таким образом, чтобы ClientID сохранялся в Cookie (не забудьте подставить номер своего счетчика и имя главного домена).
Напоследок о точности
Точность статистики до 99%! Мы проанализировали несколько файлов и сравнили данные GA с данными из логов.
Сравнение показывает, что GA подсчитывает уникальные загрузки еще точнее, чем мы можем сделать это руками.
Недостатки
Скрипт работает отлично и на 100% соответствует нашим требованиям, но в него можно добавить несколько улучшений:
- Скрипт немного грузит сервер, но для нас это совсем не критично.
- Nginx не поддерживает urlencode (), поэтому ссылки вида example.com/? SomeOptions будут биться. Одним из способов решения данной проблемы является использование lua-скрипта.
- Не передаётся referrer в параметр GA (также необходимо использование urlencode ()).
- В Nginx 1.8 не работает переменная $content_length, поэтому мы не можем передать в GA размер файла. Этот параметр позволил бы делать отчёты, содержащие информацию о проценте недокачанных файлов.
- Отправлять служебную информацию из Nginx. Например, количество коннектов и т.п.
- Можно было бы отправлять время закачки напрямую в Google Analytics, используя параметр &plt, но Nginx возвращает время в секундах, а GA такой формат не устраивает (ожидаются миллисекунды). Поэтому приходится отправлять эти данные в dimension2.
- Скрипт использует недокументированную функцию post_action. Существует риск, что в новых версиях эта функция будет устранена.
Друзья, пожалуйста, напишите в комментариях, какие проблемы поможет вам решить описанный способ? Реальные примеры использования будут очень полезны для дальнейшего улучшения нашего продукта.
Ну и заранее — спасибо!
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.