Ο μετρητής προβολών που μετέτρεψε τον κατάλογό μας σε σφάλμα 502
Αποστολή
Η σελίδα που παραθέτει κάθε Εργαλειοθήκη που πουλάμε απαντούσε σε κάθε επισκέπτη με σφάλμα 502 Bad Gateway για περίπου 41 ώρες μετά την κυκλοφορία. Η σελίδα κάθε Εργαλειοθήκης λειτουργούσε, η αρχική σελίδα λειτουργούσε, η ολοκλήρωση αγοράς λειτουργούσε. Το προβληματικό μέρος ήταν μερικές γραμμές που μετρούσαν τις προβολές σελίδας.
Το σφάλμα
Ο διακομιστής του καταστήματός μας μετρά τις επισκέψεις στις σελίδες των Εργαλειοθηκών. Για να βρει σε ποια Εργαλειοθήκη αφορά το αίτημα, έπαιρνε το δεύτερο μέρος της διαδρομής:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Για το /kits/studio/ αυτό είναι το studio. Για τον ίδιο τον κατάλογο, /kits/, η διαδρομή έχει δύο καθέτους, οπότε ο μηχανισμός ασφαλείας την άφηνε να περάσει, αλλά μετά την αφαίρεση των καθέτων υπάρχει μόνο ένα μέρος, και το [1] προκάλεσε IndexError. Ο χειριστής είναι το τυπικό http.server της Python: μια εξαίρεση στο do_GET κλείνει τη σύνδεση χωρίς απάντηση, και το Cloudflare εμφάνισε στον επισκέπτη ένα 502.
Η διόρθωση είναι μια μικρή συνάρτηση που επιστρέφει μια κενή συμβολοσειρά όταν λείπει το μέρος. Ο αριθμός προβολών χρειαζόταν μόνο το όνομα της Εργαλειοθήκης· δεν χρειαζόταν ποτέ να μπορεί να χαλάσει τη σελίδα που μετρούσε.
Γιατί κανένας από τους ελέγχους μας δεν το εντόπισε
- Η παρακολούθηση διαθεσιμότητας άνοιγε μόνο τις αρχικές σελίδες. Η αρχική σελίδα ήταν εντάξει.
- Το βήμα έκδοσης ελέγχει κάθε Εργαλειοθήκη που διανέμει: τη σελίδα της, την ανακατεύθυνση ολοκλήρωσης αγοράς, τη διαδρομή πληρωμής από άκρη σε άκρη. Ποτέ δεν άνοιγε τη λίστα με όλες τις Εργαλειοθήκες.
- Τα αναλυτικά στοιχεία δεν μπορούσαν να το δείξουν. Ο κώδικας που θα μετρούσε τους επισκέπτες του καταλόγου ήταν ο κώδικας που κατέρρεε. Το αρχείο καταγραφής του διακομιστή είχε την απάντηση από την αρχή: 17 tracebacks σε αυτές τις 41 ώρες, το καθένα ένα αίτημα, από κάποιο πρόσωπο ή crawler, που έλαβε σφάλμα αντί για τη σελίδα.
Τι άλλαξε
- Κάθε σελίδα, από έξω, κάθε ώρα. Μια μικρή εργασία διαβάζει τον χάρτη ιστότοπου και ανοίγει κάθε αγγλική σελίδα και, στη συνέχεια, μία από τις άλλες 42 γλώσσες, μέσω του Cloudflare σαν επισκέπτης. Δύο αποτυχημένες εκτελέσεις στη σειρά στέλνουν ένα email· η αποκατάσταση στέλνει ένα άλλο.
- Το βήμα έκδοσης ανοίγει κάθε αγγλική σελίδα αφού αναδομήσει τον ιστότοπο, και αρνείται να ολοκληρωθεί αν μία δεν απαντήσει με 200.
- Οι σελίδες ευρετηρίου μετρούν ως σελίδες. Οι σελίδες που παραθέτουν άλλες σελίδες είναι αυτές στις οποίες φτάνει πρώτος ένας επισκέπτης, και ήταν αυτές που κανείς δεν δοκίμασε.
Το συμπέρασμα
Οι δευτερεύουσες εργασίες σε έναν χειριστή αιτημάτων, όπως η αρίθμηση, η καταγραφή ή η παρακολούθηση, δεν πρέπει ποτέ να μπορούν να ακυρώσουν το αίτημα, ενώ ένας έλεγχος σελίδας που καλύπτει μόνο τις σελίδες που μόλις αλλάξατε παραλείπει αυτές που συνδέονται με αυτές. Ο Φύλακας στο Night Watch δέχεται οποιαδήποτε λίστα σελίδων, καθεμία με το κείμενο που πρέπει να περιέχει, όχι μόνο τις αρχικές σελίδες.