Η ειδοποίηση δεν προήλθε από μια υπηρεσία παρακολούθησης. Δεν προήλθε από μια αυτοματοποιημένη ειδοποίηση ή ένα webhook που έπεσε στο Slack. Προήλθε από το πιο πρωτόγονο σύστημα παρακολούθησης που υπάρχει: το άνοιγμα ενός περιηγητή, η πληκτρολόγηση της διεύθυνσης URL και το κοίταγμα μιας κενής σελίδας. Ήταν μια Τρίτη απόγευμα. Το site είχε κατέβει κάπου γύρω στις εννέα το πρωί, και ήταν τώρα αρκετά αργά το απόγευμα. Πέντε ώρες απόλυτης σιωπής από μια εφαρμογή ιστού που συνήθως εξυπηρετούσε χιλιάδες αιτήματα ανά ημέρα. Πέντε ώρες κατά τις οποίες κάθε επισκέπτης είδε μια σελίδα σφάλματος, κάθε κλήση API επέστρεψε τίποτα, και κάθε προγραμματισμένη εργασία απέτυχε σιωπηλά στο παρασκήνιο. Ο διακομιστής δεν είχε σταματήσει δραματικά. Δεν υπήρχε kernel panic, καμία αποτυχία δίσκου, καμία διανυσματική επίθεση που άφησε εγκληματολογικά στοιχεία. Το VPS του Contabo απλώς σταμάτησε να ανταποκρίνεται στα αιτήματα HTTP, κάθεται εκεί με μια έγκυρη διεύθυνση IP και ένα σφύγμα στο επίπεδο δικτύου, αλλά αρνούμενο να εξυπηρετήσει κάποια ιστική κίνηση.

Η ανακάλυψη συνέβη λόγω μιας εντελώς άσχετης εργασίας. Υπήρχε ανάγκη να ελεγχθεί μια συγκεκριμένη διάταξη σελίδας για μια αλλαγή σχεδίασης, οπότε ο περιηγητής πήγε στη διεύθυνση URL και επέστρεψε τίποτα. Η πρώτη ένστασία ήταν να κατηγορήσει το τοπικό δίκτυο. Ανανέωσα τη σελίδα. Ακόμα τίποτα. Προσπάθησα ένας διαφορετικός περιηγητής. Ακόμα τίποτα. Άνοιξα το τερματικό και έκανα ping στον διακομιστή. Τα πακέτα επέστρεψαν κανονικά. Σύνδεση SSH; Λειτουργεί σωστά. Κατάσταση Apache; Νεκρό. Η διαδικασία του διακομιστή ιστού είχε σταματήσει κάποια στιγμή κατά τις πρώιμες πρωινές ώρες και δεν ξανακίνησε ποτέ, επειδή δεν υπήρχε διευπολιτής διαδικασίας που να είχε ρυθμιστεί για να χειριστεί αυτή τη συγκεκριμένη λειτουργία αποτυχίας. Η επιδιόρθωση πήρε τριάντα δευτερόλεπτα. Η συνειδητοποίηση ότι αυτό θα μπορούσε να συμβεί ξανά, και πιθανώς είχε συμβεί και πριν χωρίς κανείς να το προσέξει, πήρε αρκετά περισσότερο χρόνο για να χωνευθεί.

Κάθε προγραμματιστής που έχει τρέξει υπηρεσίες παραγωγής σε ένα VPS έχει μια εκδοχή αυτής της ιστορίας. Ίσως δεν ήταν πέντε ώρες. Ίσως ήταν δύο, ή οκτώ, ή ένα πλήρες σαββατοκύριακο. Οι ιδιαιτερότητες ποικίλουν αλλά το μοτίβο είναι ίδιο. Ο διακομιστής κατέβηκε, κανείς δεν το προσέξε, και η ανακάλυψη ήταν τυχαία. Το θεμελιώδες πρόβλημα δεν είναι η αξιοπιστία του διακομιστή. Οι διακομιστές αποτυγχάνουν, οι διαδικασίες σταματούν, οι δίσκοι γεμίζουν, οι διαρροές μνήμης συσσωρεύονται. Αυτή είναι η φύση της εκτέλεσης λογισμικού σε φυσικό υλικό. Το θεμελιώδες πρόβλημα είναι η απουσία παρακολούθησης, και πιο συγκεκριμένα, το κενό μεταξύ του γνώση ότι ο διακομιστής είναι online και του γνώση ότι η εφαρμογή πραγματικά λειτουργεί.

Η Διαφορά Ανάμεσα στην Παρακολούθηση Διαθεσιμότητας και την Γνώση ότι το Site σας Πραγματικά Λειτουργεί

Οι παραδοσιακές παρακολουθήσεις διαθεσιμότητας κάνουν ένα πράγμα καλά. Στέλνουν ένα αίτημα HTTP σε μια διεύθυνση URL σε τακτά διαστήματα και ελέγχουν εάν ο κωδικός απόκρισης είναι 200. Εάν ο κώδικας είναι κάτι άλλο, ή εάν το αίτημα λήξει, μια ειδοποίηση πυροβολεί. Αυτό συλλαμβάνει τις περισσότερες καταστροφικές αποτυχίες: ο διακομιστής είναι εντελώς απρόσιτος, ο τομέας έχει λήξει, το πιστοποιητικό SSL είναι άκυρο. Αλλά χάνει μια τεράστια κατηγορία προβλημάτων που είναι ίσως πιο κοινά και πιο επιζήμια.

Θεωρήστε ένα σενάριο όπου ο διακομιστής επιστρέφει έναν κωδικό κατάστασης 200, αλλά η σελίδα είναι σπασμένη. Η σύνδεση με τη βάση δεδομένων απέτυχε, οπότε η περιοχή περιεχομένου δείχνει ένα μήνυμα σφάλματος αντί της αναμενόμενης λίστας προϊόντων. Το αρχείο CSS απέτυχε να φορτωθεί, οπότε η σελίδα αποδίδεται ως μη στυλ HTML. Ένα σφάλμα JavaScript εμποδίζει την κύρια εφαρμογή από την αρχικοποίηση, αφήνοντας τον χρήστη να κοιτάζει έναν δείκτη φόρτωσης που δεν επιλύεται ποτέ. Ένα γραφικό στοιχείο τρίτου κατασκευαστή εγχέει ένα περιτύλιγμα που καλύπτει ολόκληρο το περιεχόμενο της σελίδας. Σε όλες αυτές τις περιπτώσεις, το παρακολούθηση διαθεσιμότητας αναφέρει ότι όλα είναι υγιή επειδή έλαβε απόκριση 200. Ο διακομιστής είναι ανοικτός. Το site είναι σπασμένο. Κανείς δεν γνωρίζει.

Αυτό το κενό μεταξύ «ο διακομιστής αποκρίνεται» και «το site λειτουργεί» είναι όπου η παρακολούθηση στιγμιοτύπων γίνεται απαραίτητη. Ένα προγραμματισμένο στιγμιότυπο καταγράφει το πώς η σελίδα πραγματικά φαίνεται σε τακτά διαστήματα. Εάν η σελίδα ξαφνικά δείχνει ένα μήνυμα σφάλματος, μια σπασμένη διάταξη, ή μια κενή λευκή οθόνη, το στιγμιότυπο κάνει αυτό αμέσως ορατό. Συνδυάστε προγραμματισμένα στιγμιότυπα με σύγκριση pixel diff, και το σύστημα μπορεί να ανιχνεύσει αυτόματα όταν μια σελίδα έχει αλλάξει με απροσδόκητους τρόπους. Λίγα pixel να μετατοπίζονται λόγω ενημέρωσης περιεχομένου είναι φυσιολογικό. Ολόκληρη η σελίδα να γίνει λευκή ή να εμφανίζει ένα ίχνος σφάλματος δεν είναι, και ο αλγόριθμος diff μπορεί να διακρίνει ανάμεσα στα δύο με ρυθμιζόμενα κατώφλια ευαισθησίας.

Μετά τη διακοπή πέντε ωρών, το πρώτο πράγμα που ρυθμίστηκε ήταν μια παρακολούθηση διαθεσιμότητας για κάθε κρίσιμη υπηρεσία. Αλλά η πιο ενδιαφέρουσα προσθήκη ήταν η προγραμματισμένη παρακολούθηση στιγμιοτύπων που καταγράφει την πραγματική οπτική κατάσταση των βασικών σελίδων κάθε δεκαπέντε λεπτά. Η παρακολούθηση διαθεσιμότητας συλλαμβάνει τις προφανείς συντριβές. Η παρακολούθηση στιγμιοτύπων συλλαμβάνει όλα τα άλλα: τις λεπτές αποτυχίες που επιστρέφουν έναν κωδικό κατάστασης 200 ενώ δείχνουν μια σπασμένη σελίδα, τα γραφικά στοιχεία τρίτου κατασκευαστή που εγχέουν απροσδόκητο περιεχόμενο, τα σφάλματα βάσης δεδομένων που εμφανίζονται μόνο υπό συγκεκριμένες συνθήκες.

Κατασκευή του Pipeline Ειδοποιήσης που Θα Έπρεπε να Υπάρχει από την Πρώτη Μέρα

Η αρχιτεκτονική ενός σωστού συστήματος παρακολούθησης δεν είναι περίπλοκη θεωρητικά. Ένας χρονοδιακόπτης ενεργοποιεί έναν έλεγχο σε καθορισμένα διαστήματα. Ο έλεγχος καταγράφει την τρέχουσα κατάσταση του στόχου. Η κατάσταση συγκρίνεται με τη βασική γραμμή που αναμένεται. Εάν η σύγκριση υπερβεί ένα κατώφλι, μια ειδοποίηση πυροβολεί. Η πρόκληση δεν είναι στην αρχιτεκτονική αλλά στην αξιοπιστία κάθε συστατικού. Ένα σύστημα παρακολούθησης που αυτό κατέβαίνει είναι χειρότερο από το καθόλου σύστημα παρακολούθησης, επειδή δημιουργεί μια ψευδή αίσθηση ασφάλειας.

Το pipeline παρακολούθησης στιγμιοτύπων λειτουργεί σε στάδια. Ο χρονοδιακόπτης αποστέλλει μια εργασία σύλληψης σε καθορισμένο διάστημα, συνήθως κάθε πέντε, δέκα, ή δεκαπέντε λεπτά ανάλογα με τη σημασία της σελίδας. Η εργασία σύλληψης εκτελεί μια χωρίς περιήγηση instance του Chromium που φορτώνει τη σελίδα, περιμένει για να ολοκληρωθεί η απόδοση, και αποθηκεύει το προκύπτον στιγμιότυπο. Το νέο στιγμιότυπο συγκρίνεται στη συνέχεια με την προηγούμενη σύλληψη χρησιμοποιώντας ένα αλγόριθμο pixel diff που αναγνωρίζει αλλαγμένες περιοχές και υπολογίζει το συνολικό ποσοστό αλλαγής. Εάν η αλλαγή υπερβεί το καθορισμένο κατώφλι, μια ειδοποίηση αποστέλλεται μέσω των καθορισμένων καναλιών: email, webhook, Slack, ή κάποιο προσαρμοσμένο endpoint.

Η σύγκριση diff είναι όπου τα πράγματα γίνονται πραγματικά ενδιαφέροντα από τεχνική άποψη. Μια αφελής σύγκριση pixel θα σημαίωνε κάθε στιγμιότυπο ως αλλαγμένο λόγω δυναμικού περιεχομένου όπως χρονοσημάνσεις, διαφημίσεις, ή κινούμενα στοιχεία. Ο κινητήρας diff λαμβάνει υπόψη αυτό υποστηρίζοντας ζώνες αποκλεισμού, ορθογώνιες περιοχές της σελίδας που καλύπτονται πριν από τη σύγκριση. Η χρονοσήμανση στην κεφαλίδα, το περιστρεφόμενο banner ad, το widget ζωντανής συνομιλίας στη γωνία: όλα αυτά μπορούν να αποκλειστούν ώστε μόνο οι ουσιώδεις αλλαγές να ενεργοποιούν ειδοποιήσεις. Αυτό που παραμένει μετά το αποκλεισμό είναι η σταθερή περιοχή περιεχομένου, και όλες οι αλλαγές εκεί είναι σχεδόν σίγουρα άξιες διερεύνησης.

Η διακοπή πέντε ωρών θα είχε συλληφθεί μέσα σε λεπτά υπό αυτό το σύστημα. Το πρώτο προγραμματισμένο στιγμιότυπο μετά τη κατάβαση του διακομιστή θα είχε επιστρέψει είτε μια κενή εικόνα είτε μια σελίδα σφάλματος, και τα δύο θα είχαν διαφέρει δραματικά από τη βασική γραμμή. Το ποσοστό diff θα ήταν κοντά στο 100%, πολύ πάνω από οποιοδήποτε λογικό κατώφλι, και η ειδοποίηση θα είχε ενεργοποιηθεί αμέσως. Πέντε ώρες διακοπής θα ήταν πέντε λεπτά, και αυτά τα πέντε λεπτά θα ήταν το ίδιο το διάστημα παρακολούθησης, όχι ο χρόνος που χρειάστηκε σε ένα ανθρώπινο να τυχαία συναντήσει το πρόβλημα.

Ποιο είναι το Πραγματικό Κόστος Πέντε Ωρών Αόρατης Διακοπής

Το άμεσο κόστος πέντε ωρών διακοπής είναι εύκολο να υπολογιστεί όταν οι αριθμοί είναι διαθέσιμοι. Για ένα site που χειρίζεται χιλιάδες καθημερινά αιτήματα, πέντε ώρες αντιπροσωπεύουν ένα σημαντικό μέρος της καθημερινής κίνησης. Κάθε αίτημα που επέστρεψε σφάλμα ήταν ένας χρήστης που δεν έλαβε αυτό που ήρθε για να πάρει. Ορισμένοι από αυτούς τους χρήστες ήταν νέοι επισκέπτες που δεν θα επέστρεφαν ποτέ. Ορισμένοι ήταν υπάρχοντες χρήστες που θα έχαναν μικρή ποσότητα εμπιστοσύνης. Ορισμένοι ήταν καταναλωτές API των οποίων οι δικές τους εφαρμογές απέτυχαν λόγω της εξάρτησης. Η άμεση επίδραση εσόδων εξαρτάται από τη φύση του site, αλλά ακόμη και για μια μικρή εφαρμογή SaaS, πέντε ώρες διακοπής κατά τις ώρες εργασίας μπορούν εύκολα να αντιπροσωπεύουν εκατοντάδες δολάρια σε χαμένες μετατροπές.

Το κρυμμένο κόστος είναι πιο δύσκολο να ποσοτικοποιηθεί αλλά ίσως μεγαλύτερο. Οι μηχανές αναζήτησης που σύρθηκαν στο site κατά τις πέντε ώρες αυτές έλαβαν αποκρίσεις σφάλματος, και ενώ μια σύντομη διακοπή γενικά ανέχεται από την υποδομή ανίχνευσης της Google, η επεκτεταμένη διακοπή μπορεί να έχει ως αποτέλεσμα την προσωρινή αποδεικτοποίηση των επηρεασμένων σελίδων. Οι ηλεκτρονικές εκστρατείες που τρέχαν κατά τη διακοπή οδήγησαν κίνηση σε ένα νεκρό endpoint, σπαταλώντας ολόκληρο το κόστος εκστρατείας. Οι προγραμματισμένες εργασίες που εξαρτώνται από την εφαρμογή ιστού, πράγματα όπως παραδόσεις webhook, παραγωγή αναφορών, και επεξεργασία παρτίδων, όλα απέτυχαν σιωπηλά και χρειάστηκε να αναγνωριστούν και να εκτελεστούν ξανά χειροκίνητα μετά την επαναφορά του διακομιστή.

Το πιο λανθασμένο κόστος είναι το φημολογικό. Οι χρήστες που συναντούν έναν κατεβασμένο site συνήθως δεν στέλνουν ένα email λέγοντας «το site σας είναι κατεβασμένο». Απλώς φεύγουν και ίσως ή δεν επιστρέψουν. Δεν υπάρχει μηχανισμός ανάδρασης για διακοπή επειδή ο ίδιος ο μηχανισμός ανάδρασης είναι κατεβασμένος. Το παράθυρο των πέντε ωρών ήταν αρκετά μεγάλο ώστε ορισμένοι χρήστες σχεδόν σίγουρα δοκίμασαν το site, το βρήκαν σπασμένο, και μετακίνησαν σε έναν ανταγωνιστή χωρίς να παράγουν ένα σημείο δεδομένων που θα υποδείκνυε τι συνέβη. Απλώς εξαφανίστηκαν, και δεν υπάρχει τρόπος να ξέρουμε πόσοι ή ποιοι ήταν.

Από Αντιδραστική σε Ενεργητική και Ποτέ Παρά Δεν Ανακάλυψη κατά Λάθος Πάλι

Το μάθημα από εκείνο το απόγευμα της Τρίτης δεν ήταν ότι οι διακομιστές σταματούν. Αυτό ήταν ήδη γνωστό. Το μάθημα ήταν ότι κάθε λεπτό μεταξύ μιας αποτυχίας και της ανακάλυψής της είναι ένα λεπτό σύνθετης ζημιάς, και ο μόνος τρόπος για να ελαχιστοποιήσετε αυτό το παράθυρο είναι να αυτοματοποιήσετε τον εντοπισμό. Η ανθρώπινη παρακολούθηση δεν κλιμακώνεται. Ο έλεγχος ενός site χειροκίνητα μία φορά την ημέρα σημαίνει ότι ο μέσος χρόνος ανίχνευσης για μια διακοπή είναι δώδεκα ώρες. Ο έλεγχος του μία φορά την ώρα φέρνει αυτό σε τριάντα λεπτά, αλλά κανένας ανθρώπος δεν μπορεί ρεαλιστικά να ελέγχει κάθε σελίδα κάθε εφαρμογής μία φορά την ώρα όλο το εικοσιτετράωρο.

Ο συνδυασμός παρακολούθησης διαθεσιμότητας και οπτικής παρακολούθησης στιγμιοτύπων καλύπτει και τα δύο στρώματα του προβλήματος. Η παρακολούθηση διαθεσιμότητας συλλαμβάνει τον διακομιστή που πηγαίνει εντελώς offline. Η παρακολούθηση στιγμιοτύπων συλλαμβάνει την εφαρμογή που σπάει ενώ ο διακομιστής παραμένει ενεργός. Μαζί, μειώνουν το παράθυρο ανίχνευσης από «κάποτε κάποιος προσέχει» στο ίδιο το διάστημα παρακολούθησης, το οποίο μπορεί να είναι τόσο σύντομο όσο ένα λεπτό για κρίσιμες υπηρεσίες. Η ειδοποίηση πυροβολεί, η ειδοποίηση φτάνει, και η επιδιόρθωση ξεκινά μέσα σε λεπτά αντί ωρών.

Ο διακομιστής έχει κατέβει δύο φορές ακόμα από το αρχικό περιστατικό. Και τις δύο φορές, η ειδοποίηση έφτασε μέσα σε τρία λεπτά. Και τις δύο φορές, η επιδιόρθωση εφαρμόστηκε πριν να χαθεί σημαντική κίνηση. Η υποδομή παρακολούθησης αποπληρώθηκε με το πολύ πρώτο περιστατικό που συνέλαβε, και όλα μετά από αυτό ήταν καθαρό κέρδος. Η εποχή της ανακάλυψης διακοπών κατά λάθος είναι τελειωμένη, και κοιτώντας πίσω, το μόνο πραγματικό ερώτημα είναι γιατί χρειάστηκε μια διακοπή πέντε ωρών για να κάνει την επένδυση προφανή.

Συχνές Ερωτήσεις

Ποια είναι η διαφορά ανάμεσα στην παρακολούθηση διαθεσιμότητας και τη στιγμιότυπη παρακολούθησης;

Η παρακολούθηση διαθεσιμότητας ελέγχει εάν ένας διακομιστής επιστρέφει ένα έγκυρο κωδικό απόκρισης HTTP, συνήθως 200. Η παρακολούθηση στιγμιοτύπων καταγράφει την πραγματική οπτική εμφάνιση της σελίδας και τη συγκρίνει με μια βασική γραμμή. Ένας διακομιστής μπορεί να επιστρέψει έναν κωδικό κατάστασης 200 ενώ εμφανίζει μια σπασμένη σελίδα, την οποία η παρακολούθηση διαθεσιμότητας θα χάσει αλλά η παρακολούθηση στιγμιοτύπων θα συλλάβει.

Πόσο συχνά πρέπει να λαμβάνονται στιγμιότυπα για σκοπούς παρακολούθησης;

Το διάστημα εξαρτάται από τη σημασία της σελίδας. Ζωτικής σημασίας σελίδες όπως ροές ταμείων και οθόνες σύνδεσης ωφελούνται από διαστήματα ενός έως πέντε λεπτών. Σελίδες περιεχομένου και ιστοσελίδες μάρκετινγκ μπορούν συχνά να χρησιμοποιούν διαστήματα δεκαπέντε έως τριάντα λεπτών. Το ανταλλάγμα είναι ανάμεσα στην ταχύτητα ανίχνευσης και το υπολογιστικό κόστος των συχνών σύλληψης.

Μπορεί η παρακολούθηση στιγμιοτύπων να ανιχνεύσει προβλήματα που δεν είναι πλήρεις διακοπές;

Ναι. Η παρακολούθηση στιγμιοτύπων ανιχνεύει οποιαδήποτε οπτική αλλαγή στη σελίδα, συμπεριλαμβανομένων σπασμένων διατάξεων, χαμένων εικόνων, μηνυμάτων σφάλματος που εμφανίζονται σε μια διαφορετικά λειτουργική σελίδα, εγχύσεις γραφικών στοιχείων τρίτου κατασκευαστή, και αποτυχίες φόρτωσης CSS. Αυτές οι μερικές αποτυχίες είναι συχνά αόρατες για παραδοσιακές παρακολουθήσεις διαθεσιμότητας.

Τι είναι η σύγκριση pixel diff και πώς λειτουργεί;

Η σύγκριση pixel diff συγκρίνει δύο στιγμιότυπα σε επίπεδο pixel για να αναγνωρίσει τις περιοχές που έχουν αλλάξει. Ο αλγόριθμος υπολογίζει το συνολικό ποσοστό αλλαγμένων pixel και μπορεί να επισημάνει τις συγκεκριμένες περιοχές όπου υπάρχουν διαφορές. Τα ρυθμιζόμενα κατώφλια ευαισθησίας και οι ζώνες αποκλεισμού αποτρέπουν ψευδείς ειδοποιήσεις από δυναμικό περιεχόμενο όπως διαφημίσεις ή χρονοσημάνσεις.

Πόσο γρήγορα μπορεί το σύστημα παρακολούθησης να με ειδοποιήσει όταν κάτι πάει στραβά;

Η ταχύτητα ειδοποίησης εξαρτάται από το διάστημα παρακολούθησης. Με ένα διάστημα ενός λεπτού, ο μέγιστος χρόνος ανίχνευσης είναι ένα λεπτό συν το χρόνο για σύλληψη και σύγκριση του στιγμιοτύπου, ο οποίος συνήθως προσθέτει δύο έως πέντε δευτερόλεπτα. Οι ειδοποιήσεις μπορούν να παραδοθούν μέσω email, webhooks Slack, ή προσαρμοσμένα HTTP endpoints μέσα σε δευτερόλεπτα της ανίχνευσης.

Λειτουργεί η παρακολούθηση στιγμιοτύπων για εφαρμογές ενιαίας σελίδας που βασίζονται σε μεγάλο βαθμό στο JavaScript;

Ναι. Τα στιγμιότυπα καταγράφονται χρησιμοποιώντας μια πραγματική engine περιηγητή Chromium που εκτελεί πλήρως JavaScript, αποδίδει δυναμικό περιεχόμενο, και περιμένει για να φτάσει η σελίδα σε μια σταθερή κατάσταση πριν από τη σύλληψη. Αυτό σημαίνει ότι εφαρμογές ενιαίας σελίδας που κατασκευάζονται με React, Vue, Angular, ή παρόμοια frameworks καταγράφονται με ακρίβεια.