Blog ·
Zwei Regeln, ein toter Link dazwischen
Ein Crawl über 1776 Seiten fand genau 18 kaputte URLs. Beide Regeln dahinter waren richtig; niemand hatte geprüft, was an ihrer Nahtstelle passiert.
Von Provibr
Wir haben die Produktionsseite zum ersten Mal seit Längerem richtig gecrawlt: jedem internen Link gefolgt, jede erklärte Sprachalternative geprüft, jeden Block strukturierter Daten validiert, jedes Bild auf Alternativtext geprüft.
1776 Seiten, 1750 Sitemap-Einträge und genau ein Defekt. Null Waisen, null Weiterleitungsketten, null Fehler bei Sprachalternativen über 17218 Angaben, null ungültige Blöcke strukturierter Daten über 1642, null Bilder ohne Alternativtext über 15463 und 920 Vorschaubilder für soziale Netzwerke, die alle mit 200 antworteten.
Der eine Defekt waren 18 URLs, die 404 zurückgaben: die Dokumentationsseiten zweier Abrechnungspanels, in allen neun Sprachen. Auf jede dieser 18 zeigte genau ein interner Link, von der Integrationsseite desselben Produkts in derselben Sprache.
Beide Hälften davon sind Absicht. Genau das macht es aufschreibenswert.
Die zwei Regeln
Einige unserer Integrationen liegen hinter einem Rollout-Schalter. Ist der Schalter aus, verschwindet der Anbieter aus dem Katalog, aus der Sitemap, aus den Zählern und aus der Typauswahl im Panel, alles aus einer Tabelle abgeleitet, sodass es keine zweite Liste gibt, die man vergessen könnte.
Zwei von ihnen sind nicht ganz gewöhnlich. Für FOSSBilling und Paymenter gibt es ein Modul, das Sie in deren Panel installieren, und die Seite unter /integrations/fossbilling beschreibt dieses Modul. Es ist keine Seite über eine Anbindung, die wir anbieten; es ist eine Seite über etwas, das Sie heute herunterladen können. Es gibt also eine Regel, die diese beiden Integrationsseiten stehen lässt, wenn der Anbieter hinter dem Schalter verborgen ist, und sie trägt ihre Begründung in der Quelle.
Die Dokumentationsseite ist der umgekehrte Fall. /docs/fossbilling beschreibt die Anbindung, und genau die schaltet der Schalter ab, also verschwindet sie mit dem Anbieter.
Beide Regeln sind richtig. Ein Slug, zwei Oberflächen, zwei Antworten, und der Code hat zwei Funktionen statt einer, die in der Hälfte der Fälle falsch wäre.
Was niemand geprüft hatte, ist, was zwischen ihnen geschieht. Die überlebende Seite trug den thematischen Link auf die verschwundene.
Die Regel war längst aufgeschrieben
Die Funktion, die diesen Link erzeugt, löst einen Dokumentationspfad für einen Integrations-Slug auf. Ihr eigener Dokumentationskommentar sagte, schon bevor irgendetwas davon geschah, dass ein Link auf eine Anleitung, die es nicht gibt, kein thematischer Link ist, sondern ein toter.
Die Regel war da. Sie wurde gegen die falsche Liste gemessen: gegen die Menge der Dokumentationsseiten, die in der Quelle existieren, statt gegen die Menge, die in diesem Build antwortet. Diese beiden sind fast immer dieselbe Menge, und der Tag, an dem sie sich unterscheiden, ist der Tag, an dem etwas verborgen wird.
Die Reparatur ist eine Zeile. Das ist nicht der interessante Teil; der interessante Teil ist, dass eine richtige Regel, ausführlich an der Stelle aufgeschrieben, an die sie gehört, keine Kontrolle ist. Prosa in einem Kommentar beschreibt eine Absicht. Nur etwas, das läuft, kann Sie daran halten.
Ein dritter Fall, den kein Crawl hätte finden können
Wir haben eine Wache geschrieben, statt nur die Zeile zu reparieren: Für jeden Integrations-Slug muss der aufgelöste Dokumentationspfad einer sein, den dieser Build tatsächlich ausliefert. Sie wurde zuerst rot bewiesen und meldete die zwei Seiten, die der Crawl gefunden hatte.
Sie meldete außerdem eine dritte: unsere Integration für Backup-Server, die hinter einem anderen Schalter liegt. Ihre Dokumentationsseite ist verborgen, und der Link darauf war genau gleich gebaut.
Der Grund, warum kein Crawler diese je finden wird, ist, dass ihre Integrationsseite ebenfalls verborgen ist. Der tote Link lebte auf einer Seite, die selbst 404 zurückgibt, es gibt also von außen keinen Weg zu dem, was falsch ist. Er wäre an dem Tag aufgetaucht, an dem jemand diesen Schalter einschaltet und eine Seite mit einem kaputten Link darauf ausliefert, und die beiden Ereignisse hätten Wochen auseinandergelegen.
Ein Crawler kann Defekte nur auf erreichbaren Seiten finden. Aufgeschrieben klingt das selbstverständlich, und es ist leicht zu vergessen, wenn ein Crawl sauber zurückkommt, denn ein sauberer Crawl fühlt sich wie eine Aussage über den Code an statt über die Seiten, die zufällig sichtbar waren.
Die Wache hat noch einen Test, der nichts tut, außer den ersten ehrlich zu halten: Er sichert zu, dass mehr als zehn Slugs wirklich auf eine Dokumentationsseite auflösen. Ohne ihn würde eine Änderung, die den Auflöser für alles nichts zurückgeben lässt, keine toten Links und überhaupt keine thematischen Links erzeugen, und diese beiden lesen sich in einem grünen Testlauf gleich.
Die andere Hälfte: einer Suchmaschine sagen, dass sich etwas geändert hat
Dieselbe Runde hat einen Meldekanal hinzugefügt, eine kleine Sache mit einer Überraschung darin.
Das Protokoll ist ein POST, der mehreren Suchmaschinen sagt, dass sich eine URL geändert hat. Die Inhaberschaft am Host wird nachgewiesen, indem ein Schlüssel als Textdatei an der Wurzel ausgeliefert wird. Unser Schlüssel kommt aus der Umgebung, und fehlt er, tut das Ganze nichts und sagt das einmal. Das ist der Normalzustand in der Entwicklung und in jedem Test.
Zwei Einzelheiten lohnen die Wiederholung, denn beide sind Fallen.
Die Schlüsseldatei wird über eine Umschreibung ausgeliefert, denn eine dynamische Route kann nicht an der Wurzel neben dem Sprachsegment sitzen. Eine Umschreibung, die irgendetwas Punkt txt an der Wurzel trifft, würde auch die Robots-Datei verschlucken. Zwei Dinge halten sie auf: Die Umschreibung läuft in der Phase, die nur Anfragen sieht, auf die keine echte Datei passte, und das Schlüsselmuster verlangt mindestens acht Zeichen, während robots sechs hat und llms vier. Die Untergrenze ist keine Ordnungsliebe; sie ist das zweite Schloss.
Und die Meldung hängt an der Funktion, die ohnehin weiß, dass sich öffentlicher Inhalt geändert hat, nicht am Deploy. Eine Auslieferung, die nur einen Panel-Bildschirm berührt, würde sonst jedes Mal 1750 Adressen als geändert ankündigen, und das ist ein guter Weg, ignoriert zu werden. Ändert sich die Preistabelle, werden die zwei Routen, die Preise rendern, in neun Sprachen gemeldet, also 18 Adressen.
Das, was nach einer Fehlkonfiguration aussah
Die erste echte Meldung nach dem Deploy, mit dem Produktionsschlüssel an Ort und Stelle, gab 403 zurück.
Die Schlüsseldatei gab von überall, wo wir es versuchten, 200 zurück, auch mit einer Crawler-Kennung. Jede Zutat stimmte. Der natürliche nächste Schritt ist, sich die Konfiguration am Rand anzusehen, oder die Umschreibung, oder die Reihenfolge der Phasen, und dabei geht eine Stunde hin.
Stattdessen haben wir zwei kleinere Dinge versucht. Eine Meldung einer einzelnen URL gab sofort 200 zurück. Dieselbe Sammelmeldung gab eine Minute später ebenfalls 200 zurück, an beiden Endpunkten.
Die 403 war also ein Erstkontakteffekt auf deren Seite und kein Defekt auf unserer. Die Schlüsseldatei war in dem Moment, in dem die erste Sammelanfrage ankam, vom empfangenden Dienst noch nicht abgeholt und zwischengespeichert worden.
Wir haben das dort aufgeschrieben, wo das Betriebshandbuch lebt, denn der Fehlschlag ist perfekt darauf angelegt, jemanden auf die Jagd zu schicken: Der Statuscode sagt verboten, was eine Aussage über eine Berechtigung ist, und an der Berechtigung war alles richtig. Bevor Sie einen Autorisierungsfehler bei einer ersten Anfrage untersuchen, stellen Sie dieselbe Anfrage noch einmal. Es kostet nichts und ist die billigste Hypothese der Liste.
Es gibt eine verwandte Notiz für jeden, der diesen Schlüssel wechselt: Die Datei wird mit einer Stunde Zwischenspeicherung ausgeliefert, ein Wechsel braucht also eine Leerung oder eine Stunde Geduld, und in diesem Fenster bedeutet dieselbe 403 etwas völlig anderes.
Was wir aufschreiben würden
- Zwei richtige Regeln können in der Naht zwischen ihnen einen Defekt erzeugen. Kein Eigentümer liegt falsch, und keiner schaut hin.
- Derselbe Bezeichner kann zwei Oberflächen mit zwei richtigen Antworten haben. Zwei Funktionen, nicht eine.
- Eine Regel in einem Kommentar ist keine Kontrolle. Unsere war ausgeschrieben und wurde gegen die falsche Liste gemessen.
- Was existiert und was antwortet sind verschiedene Mengen, und sie gehen genau dann auseinander, wenn etwas verborgen wird.
- Ein Crawler findet Defekte nur auf erreichbaren Seiten. Unserer konnte den dritten Fall überhaupt nicht sehen.
- Eine Wache findet den Fall, der noch nicht ausgeliefert ist. Das ist der ganze Grund, eine zu schreiben, statt die Zeile zu reparieren.
- Geben Sie jeder Wache einen Test, der beweist, dass sie hinschaut. Keine toten Links und gar keine Links lesen sich gleich.
- Eine Untergrenze in einem Muster kann eine Sicherheitsgrenze sein. Acht Zeichen sind es, was eine Umschreibung von der Robots-Datei fernhält.
- Kündigen Sie Inhaltsänderungen von dem an, was weiß, dass sich Inhalt geändert hat, nie vom Deploy.
- Wiederholen Sie, bevor Sie einen Fehlschlag bei einer ersten Anfrage diagnostizieren. Ein Verboten, das eine Minute später ein Erfolg ist, hatte nie mit einer Berechtigung zu tun.
Zur Klarheit: Der Crawl deckte 1776 Seiten gegen die Produktion und 1750 Sitemap-Einträge mit 913 Änderungsdaten ab, von denen keines in der Zukunft lag, die Reparatur ist eine einzelne Zeile, abgesichert durch drei zuerst rot bewiesene Tests, der Meldepfad wurde Ende zu Ende gegen einen nachgebildeten Endpunkt ausgeübt, einschließlich fünf Fehlerpfaden, und der Durchlauf über einen eigenständigen Produktionsbuild endete bei 96 grün. Nicht bewiesen: Zu dem Zeitpunkt, an dem die Reparatur geschrieben wurde, war sie auf einem lokalen Produktionsbuild grün und auf der Produktion noch nicht bestätigt, und zwei Routenfamilien im Crawl erzeugten überhaupt keine Seiten, weil ihre Verzeichnisse leer sind.
Aus der Plattformarbeit an Provibr. Was eine Abrechnungsmigration tragen kann und was nicht, steht in Fünfzehn Dinge, die nicht mitkommen, ein Deploy, dessen Schemaschritt nie lief, steht in Die Migration, die nie lief, und eine weitere Prüfung, die grün war, weil sie nie ankam, steht in Grün, weil es nicht hinkommen konnte.