KSD, deine drei Nachfragen sind diejenigen, bei denen ich am längsten brauchte, um sie richtig hinzubekommen. Hier ist also, was ich nach jedem falschen Versuch am Ende heraus hatte.
Graduelle Abweichung. Die Falle ist der Vergleich mit dem vorherigen Durchlauf, denn dann löst ein langsamer Abstieg nie etwas aus — jeder Durchlauf ist nur geringfügig schlechter als der vorherige, und ein schlechter Tag wird stillschweigend zur morgigen Baseline. Ein Median über die letzten N Durchläufe behebt das, und es sollte ein Median statt eines Durchschnitts sein, weil ein ungewöhnlich großer Tag einen Mittelwert irgendwohin zieht, wo noch nie ein echter Durchlauf gewesen ist. Gib ihm einen Kalender, wenn die Daten einen haben: Ein Client, dessen Montag legitim zehnmal höher ist als sein Dienstag, wird sonst entweder jeden Montag einen Alert auslösen oder einen eingebrochenen Montag im Wochendurchschnitt verstecken.
Aber ein gleitender Median hat sein eigenes Versagen, und es ist schlimmer. Wenn ein Workflow zwei Wochen lang nichts zurückgibt, wird der Median der letzten Durchläufe zu null, der Ausfall sieht nicht mehr anomal aus, und die Wiederherstellung ist das, was dich benachrichtigt. Also lasse ich für alles, das wirklich zählt, die Historie eine Zahl vorschlagen und behalte sie dann als festen Erwartungswert, den eine Person genehmigt hat. Ein genehmigter Wert kann einen Ausfall nicht lernen. Die Kosten sind, dass er auch keine legitime Änderung verfolgt, also bearbeitest du ihn, wenn sich das Volumen wirklich verschiebt — das ist der Handel, und für alles, das den Umsatz berührt, ist er der richtige.
Event-gesteuerte Workflows: Ich beurteile sie überhaupt nicht. Ein Webhook-Workflow, der vier Tage lang untätig ist, kann perfekt gesund sein, und eine Prüfung, die Stille als Fehler behandelt, wird bei jedem Webhook, den du besitzt, einen Alert auslösen und wird innerhalb einer Woche stummgeschaltet. Ich wende Staleness nur auf Workflows an, deren eigener Trigger sagt, dass sie sich selbst starten — Schedule, Cron, Interval — und ich leite die Toleranz aus dem Interval im Trigger ab, anstatt einen globalen Schwellenwert festzulegen, da eine Zahl entweder über einen zehn Minuten verzögerten Workflow schreit oder einen täglichen versteckt, der am Dienstag gestorben ist.
Canaries mit variablen Daten: Ich habe das nicht gelöst und ich glaube nicht, dass es von innen aus dem Durchlauf lösbar ist. Wenn die Quelle sich so verändert, dass sich jeder Datensatz auf einmal bewegt, ist die Anzahl richtig, alle Felder sind vorhanden, und die eigene Historie des Workflows stimmt mit der falschen Antwort überein. Jede Prüfung, die einen Durchlauf gegen seine eigene Vergangenheit vergleicht, ist dafür von Konstruktion an blind. Das Einzige, das ich funktionieren gesehen habe, ist ein bekannt-guter Wert von außen — jemand, der Preise kratzt, behält fünf URLs, die er einmal im Monat von Hand prüft — und der Grund, warum es sich der Automatisierung widersetzt, ist, dass jeder Erwartungswert, den du berechnen kannst, mit der gleichen Änderung driftet, die die Daten zerstört hat.
Eine Sache, die ich in dem Thread nicht erwähnt sehen habe und die mich am meisten kostete: Die Anzahl, die richtig ist, bedeutet nicht, dass der Inhalt richtig ist. Ein Kontoauszug kann die Mietsumme weglassen, zwei neue Händler aufgreifen und bei genau der normalen Summe landen, woraufhin jede Zahl in deinem Monitoring mit sich selbst übereinstimmt und die Daten falsch sind. Die Benennung der Handvoll Werte, die in jedem Durchlauf erscheinen müssen, fängt das auf, und keine Anzahl von irgendetwas tut das. Pass auf, dass diese Liste nicht veraltet, denn eine umbenannte Zeile wird sonst jeden Morgen weinen, bis du aufhörst, sie zu lesen, was schlechter ist, als überhaupt nicht zu prüfen.
Die Implementierung von all dem oben ist MIT-lizenziert, falls es nützlicher ist zu lesen, als es zu bauen: GitHub - moneywithjjcom-del/ranfine-: Watches n8n workflows from outside n8n and alerts when one goes quiet or quietly stops doing its job. Catches the failure n8n reports as success. · GitHub