Zum Hauptinhalt springen

Der Dev-Server schrieb Telemetrie in die produktive Analytics-Datenbank. Ein verbreiteter Fehler — und ein besonders tückischer, wegen der Richtung, in die er die Zahlen verzerrt.

Verfälschung, die schmeichelt

Dev-Messwerte kommen von localhost: kein Netzwerk, kein TLS, kein Kaltstart. Sie streuen nicht symmetrisch um die Wahrheit — sie ziehen jedes Latenz-Perzentil nach unten. In einem 30-Tage-Fenster stammten 72% der Messwerte aus Dev, und die Time-to-First-Byte las sich weit besser als die Realität.

Gemeldet (alle Messwerte) 1051 ms
Tatsächlich (Produktionsspur) 1431 ms

Das Unterscheidungsmerkmal

Weder eine zusätzliche Spalte noch ein Backfill waren nötig. Der Attribution-Build speichert den CSS-Selektor des beanstandeten Elements, und Sveltes Scope-Klassen-Format unterscheidet sich je nach Build — jeder Messwert trägt also bereits einen Fingerabdruck seines Builds.

Dev-Server nav.flex-1.overflow-y-auto.p-2.s-Xv7_7mcdkQaC.scrollbar-nav
Produktion nav.flex-1.overflow-y-auto.p-2.scrollbar-nav.svelte-1e55qdy

Das Dev-Muster ist so verankert, dass es das Produktions-Präfix nicht treffen kann: Direkt nach dem s muss ein Bindestrich folgen, und bei svelte- steht dort ein v. Ein Muster, das beide träfe, würde jeden echten Messwert herausfiltern und bei einem völlig gesunden Deployment eine leere Produktionsspur zeigen.

Live-Aufteilung

Klassifiziert über die letzten 30 Tage der eigenen Telemetrie dieser Website. Eine Sitzung mit irgendeinem Dev-Marker gilt als Dev — eine echte Sitzung zu verlieren kostet einen Messwert, eine Dev-Sitzung zu behalten kostet die Genauigkeit jedes Perzentils, in das sie fällt.

Produktion 174 (24 Sitzungen) Nicht klassifiziert 5 (2 Sitzungen)

Was sich daraus verallgemeinern lässt

Die Quelle zu reparieren ist notwendig, aber nicht hinreichend. Erst der lesende Filter macht die Korrektur dauerhaft:

  • Quelle reparieren — Telemetrie an eine Produktionsprüfung koppeln, damit keine neuen falschen Zeilen entstehen.
  • Trotzdem beim Lesen filtern — bereits geschriebene Zeilen bleiben in der Aufbewahrungsfrist und verzerren weiterhin jedes Aggregat über sie.
  • Ausschlüsse ausweisen — eine Zahl, die steigen kann, ist das Einzige, was bemerkt, wenn die quellseitige Sperre je zurückfällt.

Geht dieses Pattern noch besser? Sag uns, wie.

Feedback geben