Der Aufrufer, der unseren Katalog in einen 502 verwandelte
Versand
Die Seite, die alle Kits auflistet, die wir verkaufen, antwortete nach dem Launch etwa 41 Stunden lang jedem Besucher mit einem 502 Bad Gateway. Die einzelnen Kit-Seiten funktionierten, die Startseite funktionierte, der Checkout funktionierte. Das kaputte Teil waren ein paar Zeilen, die die Seitenaufrufe zählten.
Der Fehler
Der Server unseres Shops zählt Besuche auf Kit-Seiten. Um herauszufinden, für welches Kit eine Anfrage bestimmt ist, wurde der zweite Teil des Pfads verwendet:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Für /kits/studio/ ist das studio. Für den Katalog selbst, /kits/, hat der Pfad zwei Schrägstriche, also ließ ihn die Sicherheitsregel durch, aber nach dem Entfernen der Schrägstriche gibt es nur noch einen Teil, und [1] löste einen IndexError aus. Der Handler ist Pythons Standard-http.server: Eine Ausnahme in do_GET schließt die Verbindung ohne Antwort, und Cloudflare zeigte dem Besucher einen 502 an.
Die Lösung ist eine kleine Funktion, die einen leeren String zurückgibt, wenn der Teil fehlt. Die Zählung der Seitenaufrufe brauchte nur den Namen des Kits; sie musste nie die Seite zum Absturz bringen, die sie zählte.
Warum keine unserer Prüfungen es sah
- Die Verfügbarkeitsüberwachung öffnete nur Startseiten. Die Startseite war in Ordnung.
- Der Release-Schritt prüfte jedes Kit, das er auslieferte: seine Seite, seine Checkout-Weiterleitung, den bezahlten Pfad Ende-zu-Ende. Er öffnete nie die Liste aller Kits.
- Die Analytik konnte es nicht zeigen. Der Code, der die Besucher des Katalogs gezählt hätte, war der Code, der abstürzte. Das Server-Log hatte die ganze Zeit die Antwort: 17 Tracebacks in diesen 41 Stunden, jeder einzelne eine Anfrage, von einer Person oder einem Crawler, die einen Fehler statt der Seite erhielt.
Was sich geändert hat
- Jede Seite, von außen, jede Stunde. Ein kleiner Job liest die Sitemap und öffnet jede englische Seite und nacheinander eine der anderen 42 Sprachen, über Cloudflare wie ein Besucher. Zwei fehlgeschlagene Läufe in Folge senden eine E-Mail; die Wiederherstellung sendet eine weitere.
- Der Release-Schritt öffnet jede englische Seite, nachdem er die Seite neu aufgebaut hat, und verweigert den Abschluss, wenn eine nicht mit 200 antwortet.
- Index-Seiten zählen als Seiten. Die Seiten, die andere Seiten auflisten, sind die, die ein Besucher zuerst erreicht, und sie waren die, die niemand getestet hat.
Das Fazit
Nebenaufgaben in einem Request-Handler wie Zählen, Protokollieren oder Tracking dürfen die Anfrage niemals fehlschlagen lassen, und eine Seitenprüfung, die nur die gerade geänderten Seiten abdeckt, übersieht die Seiten, die auf sie verlinken. Der Watch in Night Watch akzeptiert eine beliebige Liste von Seiten, jede mit dem Text, den sie enthalten muss, nicht nur Startseite.