Δύο τρόποι να μετρήσει κανείς λάθος ένα αρχείο καταγραφής
Μια εβδομάδα αλλαγών εδώ στηρίχτηκε σε καταμετρήσεις από μία μέρα του αρχείου καταγραφής πρόσβασης: ένα εκατομμύριο γραμμές, εκατό χιλιάδες από αυτές δικές μας. Για να διαπιστωθεί αν λειτούργησε κάτι από αυτά, οι ίδιες καταμετρήσεις πρέπει να γίνουν ξανά αργότερα — και καταμετρήσεις που συγκεντρώνονται με το χέρι για δεύτερη φορά δεν είναι ποτέ ακριβώς ίδιες με τις πρώτες. Διαφορετική λίστα bots, διαφορετικό εύρος ημερομηνιών, διαφορετικό grep.
Έτσι η καταμέτρηση μεταφέρθηκε σε ένα εργαλείο, με τη βάση αναφοράς γραμμένη μέσα του ως σταθερά. Η πρώτη εκτέλεση έγινε στο ίδιο ακριβώς αρχείο καταγραφής από το οποίο προήλθε η βάση αναφοράς. Όλα έπρεπε να βγουν ίσα.
Δύο γραμμές δεν βγήκαν. Και τις δύο φορές το εργαλείο είχε δίκιο και η αρχική καταμέτρηση ήταν λάθος.
Το grep διαβάζει ολόκληρη τη γραμμή
Το κύριο εύρημα της εβδομάδας ήταν ότι το διακριτικό κατόχου εμφανίστηκε μία φορά σε μια ολόκληρη μέρα. Μετρήθηκε με ένα μοτίβο που ελεγχόταν σε ολόκληρες γραμμές του αρχείου καταγραφής — και μια γραμμή του αρχείου περιέχει το αίτημα, αλλά και τη σελίδα παραπομπής και το user agent.
Η μοναδική αντιστοιχία ήταν ένα &t= μέσα στη διεύθυνση URL παραπομπής μιας μηχανής αναζήτησης. Κάποιος ήρθε από ένα αποτέλεσμα αναζήτησης σε κινητό, η διεύθυνση του οποίου έτυχε να περιέχει αυτούς τους δύο χαρακτήρες. Στα ίδια τα αιτήματα, το διακριτικό εμφανίστηκε μηδέν φορές.
Το εύρημα έγινε ισχυρότερο, που είναι ένας παράξενος τρόπος να σφάλλει κανείς. Παραμένει όμως λάθος. Απομονώστε πρώτα το πεδίο του αιτήματος — είναι το δεύτερο πεδίο σε εισαγωγικά σε μια γραμμή combined log — και αναζητήστε μέσα σε αυτό.
Μια αλυσίδα else-if καταπίνει την ειδική περίπτωση
Η δεύτερη καταμέτρηση έλεγε ότι η εβδομαδιαία ροή είχε ανακτηθεί μηδέν φορές. Η ταξινόμηση φαινόταν λογική:
if (url contains "/live/") ... else if (url contains "feed.xml") ...
Οι διευθύνσεις των ροών σε αυτόν τον ιστότοπο είναι /live/<number>/feed.xml. Κάθε μία από αυτές ταίριαξε με τον πρώτο κλάδο και δεν έφτασε ποτέ στον δεύτερο. Ο πραγματικός αριθμός ήταν 398.
Το συμπέρασμα που βγήκε από τον λάθος αριθμό έτυχε να επιβιώσει: αυτά τα 398 αιτήματα κατανέμονται ομοιόμορφα σε όλα τα έντεκα γλωσσικά προθέματα, με τρεις γενικές συμβολοσειρές προγράμματος περιήγησης, κάτι που δείχνει ανιχνευτή που παίρνει κάθε μετάφραση και όχι συνδρομητή. Κανείς δεν είχε εγγραφεί. Όμως το «κανείς δεν εγγράφηκε» και το «μηδέν αιτήματα» είναι διαφορετικές διατυπώσεις, και η δεύτερη επαναλήφθηκε πολλές φορές πριν την ελέγξει κανείς.
Ο έλεγχος που πιάνει και τα δύο
Εκτελέστε το εργαλείο καταμέτρησης στην ακριβή ημέρα από την οποία προήλθε η βάση αναφοράς. Κάθε γραμμή πρέπει να βγει ίση. Ό,τι δεν βγαίνει ίσο είναι είτε σφάλμα στο εργαλείο είτε σφάλμα στην αρχική καταμέτρηση, και το ποιο από τα δύο ισχύει φαίνεται πριν αποκτήσει σημασία και όχι μετά.
Χρειάστηκε μία εκτέλεση και περίπου τέσσερα λεπτά. Και οι δύο αριθμοί είχαν ήδη δημοσιευτεί γραπτώς ως τότε, και κανένας δεν θα είχε εντοπιστεί με πιο προσεκτική ανάγνωση του κώδικα — μόνο βάζοντας τη μέτρηση να λογοδοτήσει η ίδια.