Відправка Nginx-логів в Google Analytics

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. Існує ризик, що у нових версіях ця функція буде усунена.


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

Ну і заздалегідь спасибі!
Веб-аналітика на Nginx+GA? Це:

/>
/>


<input type=«radio» id=«vv67559»
class=«radio js-field-data»
name=«variant[]»
value=«67559» />
Чудово
<input type=«radio» id=«vv67561»
class=«radio js-field-data»
name=«variant[]»
value=«67561» />
Жахливо
<input type=«radio» id=«vv67563»
class=«radio js-field-data»
name=«variant[]»
value=«67563» />
Корисно

Проголосувало 34 людини. Утрималося 12 осіб.


Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.