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 65 (10 Sitzungen) Nicht klassifiziert 17 (4 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