Ok Яндекс! А где наши «Reach Goals»?

в 9:30, , рубрики: javascript, история из жизни, яндекс.метрика

История про Yandex.Metrika ReachGoal, девушку Лиду и про то, что не бывает неразрешимых проблем

Ok Яндекс! А где наши «Reach Goals»? - 1

Мир неидеален, мир world wide web неидеален еще больше. Иногда, на это можно закрыть глаза. Но только не тогда, когда красивая девушка по имени Лида из «отдела маркетинга» стоит перед тобой, смотрит тебе в глаза и задает вопрос: «Почему-то у нас в Я.Метрике данные, которые я вижу воронке заказа, отличаются от тех, которые я вижу в нашей учетной системе. И у нас заказов больше».

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

Особо не надеясь на какой-либо интересный эффект и поэтому не мудря лукаво, был быстро дописан сервис, регистрирующий события возникающие на фронтенде в браузерах посетителей нашего сайта.

Прежде всего, нас интересовали события, которые могли возникнуть при выполнении кода Я.Метрики, а именно yaCounterXXXXXX.reachGoal().

Итак, ставим везде где нужно перехват исключения и отправляем эти события на сервер:

 try {
    yaCounterXXXXXX.reachGoal("EVENT_XXX");
 } catch(e) {
    $.get("/front/service/event", {event: "YM-warning", goal: " EVENT_XXX ", message: e.message});
 }

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

[2018-04-17 09:04:51.431]  [BASKET_LOAD] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36]
 [2018-04-17 09:09:18.082]  [BASKET_LOAD] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
[2018-04-17 09:09:21.369]  [BASKET_LOAD] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
[2018-04-17 09:09:24.990]  [BASKET_LOAD] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
[2018-04-17 09:09:27.001]  [] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
[2018-04-17 09:12:44.778]  [ORDER_CREATED] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
... и так далее

Быстрый подсчет показал, что порядка 3..4..5% событий в корзине проходят мимо Я.Метрики. Лида была права. А раз девушка права, надо что-то делать. Хотя когда девушка неправа, то делать все равно что-то надо.

Начинаем искать причину. Счетчик установлен корректно, подавляющая часть событий регистрируется им правильно. Пытаемся нагуглить наличие похожих проблем у коллег по цеху. Ничего похожего не нашлось.

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

Не буду описывать все гипотезы, которые мы перепробовали. В сухом остатке получается, что на момент загрузки страницы, код счетчика Яндекс.Метрики не загружен в браузер клиента и не инициализирован там. Может быть это блокировщик рекламы и/или трекеров отслеживания, может быть какие-то сетевые проблемы между клиентом и сервером Яндекса (это маловероятно).

Пришлось взять Лиду за руки, заглянуть в ее бездонные глаза и скрепя сердце сказать суровую правду: «Лида, придется смириться с тем, что у некоторых посетителей нашего сайта, события «оформления/отказа от оформления заказа» в Я.Метрику попадать не будут. Но мы обязательно, что-нибудь придумаем.»

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

Сердце дрогнуло. Был собран весь коллектив группы фронтенда, и ему в жесткой форме было приказано «копать отсюда и до обеда!» была поставлена задача любыми путями решить сию проблему! А не то!!! А не то Лида не сможет поехать в Таиланд…

«Фронтенду» не хотелось копать долго и практически сразу было предложено быстрое решение:


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

     var n = document.getElementsByTagName("script")[0],
         s = document.createElement("script");
     s.src = "/js/yaScriptLocal.js";
     n.parentNode.insertBefore(s, n);

Результат этого решения можно увидеть на графике, это анализ того самого лога событий

Как видно, количество ошибок упало практически до 0

Если вы на своем сайте еще не проверяете успешность загрузки скриптов Яндекс.Метрики, проверьте обязательно. Вас тоже могут ждать интересные открытия.

Disclaimer: У меня есть понимание, что приведенное выше решение далеко не оптимальное. Был бы рад выслушать мысли и мнения по этому поводу.

Автор: tuxi

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js