Два начина да преброите грешно дневник на достъпа
Цяла седмица промени тук почиваше на преброявания от един ден в дневника на достъпа: милион реда, сто хиляди от тях наши. За да се разбере дали нещо от това е проработило, същите преброявания трябва да се направят отново по-късно — а преброявания, сглобени на ръка втори път, никога не са съвсем същите като първите. Друг списък с роботи, друг период от дати, друг grep.
Затова броенето беше преместено в инструмент, в който изходната база е записана като константа. Първото изпълнение беше срещу същия дневник, от който идва изходната база. Всичко трябваше да излезе равно.
Два реда не излязоха равни. И двата пъти инструментът беше прав, а първоначалното преброяване беше грешно.
grep чете целия ред
Основната находка на седмицата беше, че токенът на собственика се е появил веднъж за цял ден. Той беше преброен с шаблон, сравняван с цели редове от дневника — а редът в дневника съдържа заявката, но също и препращащия сайт и идентификатора на браузъра.
Единственото съвпадение беше &t= в препращащия адрес на търсачка. Някой беше дошъл от резултат при мобилно търсене, чийто адрес случайно съдържаше тези два знака. В самите заявки токенът се е появил нула пъти.
Находката стана по-силна, което е странен начин да грешиш. Но пак е грешка. Първо изрежете полето със заявката — това е второто поле в кавички в ред от дневник във формат combined — и търсете в него.
Верига от else-if поглъща конкретния случай
Второто преброяване казваше, че седмичната емисия е била изтеглена нула пъти. Класификацията изглеждаше разумна:
if (url contains "/live/") ... else if (url contains "feed.xml") ...
Адресите на емисиите в този сайт са /live/<number>/feed.xml. Всеки един от тях съвпадна с първия клон и така и не стигна до втория. Истинската стойност беше 398.
Изводът, направен от грешното число, случайно оцеля: тези 398 заявки са равномерно разпределени между всичките единадесет езикови префикса под три общи идентификатора на браузъри, което означава робот, обхождащ всеки превод, а не абонат. Никой не се беше абонирал. Но „никой не се е абонирал“ и „нула заявки“ са различни твърдения, а второто беше цитирано многократно, преди някой да го провери.
Проверката, която хваща и двете
Пуснете инструмента за броене срещу точно онзи ден, от който идва изходната база. Всеки ред трябва да излезе равен. Всичко, което не излиза равно, е или грешка в инструмента, или грешка в първоначалното преброяване, а коя от двете е, става ясно, преди да е от значение, а не след това.
Беше нужно едно изпълнение и около четири минути. Дотогава и двете числа вече се бяха появили в писмен вид и нито едно не би било хванато с по-внимателно четене на кода — само като се накара измерването само да отговаря за себе си.