18 June 2015

Отправка Nginx-логов в Google Analytics

DriverPack Solution corporate blogDevelopment for Windows
image

С наших Download-серверов каждый день скачивается несколько миллионов драйверов (статичных .exe и .zip файлов). Для анализа поведения пользователей перед нами встала задача посчитать следующие параметры: когда, сколько, как часто и даже кто именно скачивает драйверы.

Самым очевидным решением было бы использовать инструменты типа AWstat, GoAccess, ELK stack или Splunk, а в крайнем случае собирать логи Nginx.

Но у каждого варианта есть свои минусы: неудобный интерфейс, скудность данных, сложность настройки и, самое главное, отсутствие возможности строить сегменты в пользовательских отчётах.

И тогда мы решили заставить Nginx самостоятельно отправлять события в Google Analytics сразу же после скачивания файла. Мы также смогли передать в GA уникальный идентификатор пользователя ClientID.
В результате мы получили аналитику по статичным файлам, к которым раньше невозможно было привязать счетчик GA.

Под катом готовый конфиг и примеры работы нашей системы.

В прошлом посте мы рассказали о том, как отправляем события из приложения DriverPack Online, используя Analytics Measurement Protocol.

Ну а сегодня мы покажем, как трекаются загрузки статических файлов на наших Download-серверах.

Информация по загрузкам приходит в режиме «реального времени».
image

Работает «из коробки»


Теперь можно мониторить, сколько реальных скачиваний нашего продукта происходит с серверов. Причём подсчет уникальных загрузок производится в разы точнее, чем если делать это по IP-адресу, т.к. к каждому пользователю привязан уникальный идентификатор — ClientID.

image

Ошибки 404 и 500 отслеживаются через события (events).

image

Благодаря тому, что мы передаем в события реальный IP-адрес юзера, мы можем использовать при анализе его местоположение.

image

Отчётам «по поведениям» можно верить, так как пробрасывается реальный ClientID пользователя, что позволяет оценить:
  • число новых и вернувшихся пользователей,
  • периодичность посещений пользователем и время с его последнего посещения,
  • вовлечение пользователей,
  • по каким ключевым словам пользователь пришел к нам на сайт с самого начала.

Nginx сам передаёт правильный User-Agent, что дает возможность построить отчеты по браузерам и ОС. В отчете можно встретить wget, которым наш DriverPack Online выкачивает драйверы, реальные браузеры, а также роботов и всяких парсеров.

image

Для кого-то окажется очень ценной информация о загрузках с мобильных устройств.

image

К большому сожалению, referrer передать в GA мы пока не можем, т.к. Nginx не поддерживает urlencode().
Поэтому отчёты по каналам работать не будут (подробности в конце поста).

image

Как настроить так же? Инструкция


1. Создаем отдельно счётчик GA, с которым будут работать все Download-серверы. Или используем номер существующего счетчика.

2. В настройках счётчика “Пользовательские параметры” добавляем специальные параметры:
  • dimension1. Название “ClientID”, уровень “Пользователь”;
  • dimension2. Название “request_time”, уровень “Hit”;
  • dimension3. Название “body_bytes_sent”, уровень “Hit”.


Это поможет нам рассчитать скорость закачки и даже процент оборванных скачиваний.

image

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 (не забудьте подставить номер своего счетчика и имя главного домена).

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXX-1', 'auto');

  ga(function(tracker) {
    var clientId = tracker.get('clientId'); // Get clientId from Google Analytics
    document.cookie = "_ga_cid=" + clientId + "; path=/; domain=.<ИМЯ ОСНОВНОГО ДОМЕНА>"; // Write cookie for web-server
    ga('set', 'dimension1', clientId); // Write clientId in custom dimension
  });

  ga('require', 'displayfeatures')
  ga('send', 'pageview');

</script>


Напоследок о точности


Точность статистики до 99%! Мы проанализировали несколько файлов и сравнили данные GA с данными из логов.

image

Сравнение показывает, что GA подсчитывает уникальные загрузки еще точнее, чем мы можем сделать это руками.

Недостатки


Скрипт работает отлично и на 100% соответствует нашим требованиям, но в него можно добавить несколько улучшений:
  1. Скрипт немного грузит сервер, но для нас это совсем не критично.
  2. Nginx не поддерживает urlencode(), поэтому ссылки вида example.com/?SomeOptions будут биться. Одним из способов решения данной проблемы является использование lua-скрипта.
  3. Не передаётся referrer в параметр GA (также необходимо использование urlencode()).
  4. В Nginx 1.8 не работает переменная $content_length, поэтому мы не можем передать в GA размер файла. Этот параметр позволил бы делать отчёты, содержащие информацию о проценте недокачанных файлов.
  5. Отправлять служебную информацию из Nginx. Например, количество коннектов и т.п.
  6. Можно было бы отправлять время закачки напрямую в Google Analytics, используя параметр &plt, но Nginx возвращает время в секундах, а GA такой формат не устраивает (ожидаются миллисекунды). Поэтому приходится отправлять эти данные в dimension2.
  7. Скрипт использует недокументированную функцию post_action. Существует риск, что в новых версиях эта функция будет устранена.


Друзья, пожалуйста, напишите в комментариях, какие проблемы поможет вам решить описанный способ?
Реальные примеры использования будут очень полезны для дальнейшего улучшения нашего продукта.

Ну и заранее – спасибо!
Only registered users can participate in poll. Log in, please.
Веб-аналитика на Nginx+GA? Это:
47.77% Замечательно 161
11.28% Ужасно 38
40.95% Полезно 138
337 users voted. 122 users abstained.
Tags:drpdriverpack solutionnginxgoogle analyticsлоги
Hubs: DriverPack Solution corporate blog Development for Windows
+32
19.4k 291
Comments 14
Information
Founded

22 July 2008

Location

Россия

Website

drp.su

Employees

2–10 employees

Registered

19 August 2014