Două moduri de a număra greșit un jurnal de acces
O săptămână de modificări s-a sprijinit aici pe numărători făcute pe o zi din jurnalul de acces: un milion de linii, dintre care o sută de mii ale noastre. Pentru a afla dacă ceva din toate acestea a funcționat, aceleași numărători trebuie refăcute mai târziu — iar numărătorile asamblate manual a doua oară nu sunt niciodată exact cele de prima dată. O altă listă de boți, un alt interval de date, un alt grep.
Așa că numărarea s-a mutat într-un instrument, cu valoarea de referință scrisă în el ca o constantă. Prima rulare s-a făcut chiar pe jurnalul din care provenea valoarea de referință. Totul trebuia să iasă egal.
Două linii nu au ieșit. De ambele dăți, instrumentul a avut dreptate, iar numărătoarea inițială a fost greșită.
grep citește toată linia
Principala constatare a săptămânii a fost că tokenul de proprietar a apărut o dată într-o zi întreagă. A fost numărat cu un tipar aplicat pe linii întregi din jurnal — iar o linie de jurnal conține cererea, dar și sursa de trimitere și user agentul.
Singura potrivire a fost un &t= în URL-ul sursei de trimitere al unui motor de căutare. Cineva venise de la un rezultat de căutare pe mobil a cărui adresă conținea din întâmplare acele două caractere. În cererile propriu-zise, tokenul a apărut de zero ori.
Constatarea a devenit mai puternică, ceea ce este un mod ciudat de a greși. Tot greșeală rămâne. Extrageți mai întâi câmpul cererii — este al doilea câmp între ghilimele dintr-o linie de jurnal în format combined — și căutați în interiorul lui.
Un lanț else-if înghite cazul specific
A doua numărătoare spunea că feedul săptămânal fusese preluat de zero ori. Clasificarea părea rezonabilă:
if (url contains "/live/") ... else if (url contains "feed.xml") ...
Adresele feedului pe acest site sunt /live/<number>/feed.xml. Fiecare dintre ele s-a potrivit cu prima ramură și nu a ajuns niciodată la a doua. Cifra reală a fost 398.
Concluzia trasă din numărul greșit s-a întâmplat să rămână valabilă: cele 398 de cereri sunt distribuite uniform pe toate cele unsprezece prefixe de limbă, sub trei identificatori generici de browser, ceea ce înseamnă un crawler care preia fiecare traducere, nu un abonat. Nu se abonase nimeni. Dar „nu s-a abonat nimeni” și „zero cereri” sunt afirmații diferite, iar a doua a fost citată în repetate rânduri înainte ca cineva să o verifice.
Verificarea care le prinde pe amândouă
Rulați instrumentul de numărare pe exact ziua din care provine valoarea de referință. Fiecare linie trebuie să iasă egală. Orice nu iese egal este fie o eroare în instrument, fie o eroare în numărătoarea inițială, iar care dintre ele este iese la iveală înainte să conteze, nu după.
A fost nevoie de o rulare și de circa patru minute. Până atunci, ambele numere apăruseră deja în scris și niciunul nu ar fi fost prins printr-o citire mai atentă a codului — ci doar obligând măsurătoarea să răspundă pentru ea însăși.