Wenn das Deployment schiefgeht: Warum Observability dein Rettungswerkzeug ist
Du hast gerade eine neue Version deployed. Innerhalb weniger Minuten melden User Fehler. Der Support-Kanal füllt sich mit Screenshots. Jemand sagt, die Seite lädt ewig. Ein anderer sieht nur einen leeren Bildschirm.
Die erste Frage, die alle stellen: „Was ist eigentlich passiert?“
Ohne Daten beginnt das Team zu raten. Vielleicht liegt es an der Datenbank-Migration. Vielleicht an einem Memory Leak. Vielleicht ist es nur ein Traffic-Spike. Jede Vermutung führt zu einer anderen Recovery-Maßnahme. Wenn du falsch liegst, machst du alles nur schlimmer.
Genau hier wird Observability vom Monitoring-Luxus zu deinem primären Recovery-Werkzeug.
Was Observability in einer Krise wirklich bedeutet
Observability ist die Fähigkeit zu verstehen, was in deinem System passiert – ohne dich einzeln auf Server einloggen oder raten zu müssen. Während eines Incidents beantwortet sie drei praktische Fragen:
- Was ist kaputt?
- Wo ist es kaputt?
- Wie beheben wir es?
Drei Arten von Daten liefern dir die Antworten: Logs, Metriken und Traces. Jede spielt eine andere Rolle, wenn du versuchst, von einem fehlgeschlagenen Deployment zu erholen.
Logs: Der erste Ort, an den du schaust
Wenn ein User einen Fehler meldet, sind Logs dein erster Hinweis. Ein strukturierter Log-Eintrag kann dir sagen, ob die Datenbankverbindung abgerissen ist, ob eine unbehandelte Exception im neuen Code aufgetreten ist oder ob eine Drittanbieter-API etwas Unerwartetes zurückgegeben hat.
Ohne gute Logs kannst du nicht erkennen, ob das Problem in der neuen Version liegt oder schon vor dem Deployment existierte. Du verschwendest Zeit mit der Jagd nach Gespenstern. Mit gut strukturierten, durchsuchbaren Logs kannst du nach Request-ID, Fehlertyp oder Zeitstempel filtern und das Problem in Minuten eingrenzen.
Der Schlüssel ist die Struktur. Ein Log-Eintrag wie „Fehler aufgetreten“ ist nutzlos. Ein Eintrag wie {"timestamp":"2024-11-20T14:32:01Z","level":"ERROR","service":"payment","trace_id":"abc123","message":"connection refused to database replica-2"} sagt dir genau, wo du suchen musst.
Hier ein praktisches Beispiel, wie du während eines Incidents Logs abfragen kannst:
# Die letzten 100 Log-Zeilen aller Pods des Dienstes 'my-app' abrufen
# und nach ERROR-Einträgen filtern
kubectl logs -l app=my-app --tail=100 | grep 'ERROR'
# Für mehr Kontext eine strukturierte Abfrage mit jq verwenden
kubectl logs -l app=my-app --tail=500 | \
grep 'ERROR' | \
jq '{timestamp, service, trace_id, message}'
Metriken: Das Frühwarnsystem
Metriken geben dir den numerischen Gesundheitszustand deines Systems. Nach einem Deployment willst du wissen:
- Ist die CPU-Auslastung gestiegen?
- Ist die Fehlerrate angestiegen?
- Hat sich die Antwortzeit verschlechtert?
- Ist der Durchsatz eingebrochen?
Diese Zahlen helfen nicht nur bei der Recovery. Sie alarmieren dich, bevor User sich beschweren. Ein gut konfigurierter Alert auf Fehlerrate oder Latenz kann das Team innerhalb von Sekunden nach einem fehlgeschlagenen Deployment benachrichtigen – noch bevor das erste Support-Ticket eintrifft.
Während der Recovery zeigen dir Metriken, ob dein Fix wirkt. Wenn du einen Rollback durchgeführt hast: Ist die Fehlerrate wieder auf dem Basisllevel? Wenn du einen Roll-Forward gemacht hast: Hat sich die Latenz stabilisiert? Ohne Metriken fliegst du blind.
Traces: Dem Request-Pfad folgen
Wenn ein User sagt „die Seite ist langsam“, musst du wissen, wo die Langsamkeit auftritt. Liegt es in deinem Anwendungscode? In der Datenbankabfrage? In einem Aufruf einer Drittanbieter-API?
Tracing folgt einem Request von der Eingangstür bis zu jedem Dienst, den er berührt. Es zeigt dir die Zeit, die in jeder Komponente verbracht wurde. Das ist entscheidend für deine Recovery-Strategie.
Wenn Tracing zeigt, dass die Datenbank der Flaschenhals ist, wird ein Rollback der Anwendung das Problem nicht beheben. Du musst auch die Datenbank-Migration zurückrollen oder einen Hotfix einspielen. Wenn Tracing zeigt, dass die Langsamkeit in einem externen Payment-Gateway liegt, musst du vielleicht gar kein Rollback machen. Vielleicht reicht es, ein Timeout oder einen Fallback hinzuzufügen.
Recovery-Entscheidungen mit Daten treffen
Gute Observability verwandelt Panik in einen Prozess. Statt zu raten, folgst du einem datengesteuerten Pfad:
- Der Alert feuert, weil die Fehlerrate den Schwellenwert überschritten hat.
- Du checkst das Metriken-Dashboard und siehst, dass der Anstieg genau zum Deployment-Zeitpunkt begann.
- Du siehst dir die Logs an und findest ein bestimmtes Exception-Muster im neuen Code.
- Du prüfst den Trace und bestätigst, dass der Fehler im neuen Payment-Modul auftritt.
- Du entscheidest: Nur das Payment-Modul zurückrollen oder es mit einem Feature Flag deaktivieren.
Manchmal sagen dir die Daten, dass du gar nicht zurückrollen solltest. Wenn Metriken nur auf einem Endpunkt Fehler zeigen, kannst du diese Funktion mit einem Flag deaktivieren. Wenn Traces zeigen, dass die Datenbank in Ordnung ist, aber der Anwendungscode einen Memory Leak hat, kannst du nur die Anwendung zurückrollen, ohne die Datenbank anzufassen.
Ohne Observability kannst du diese Unterscheidungen nicht treffen. Du rollst entweder alles zurück oder gar nichts. Beide Optionen bergen unnötige Risiken.
Nach der Recovery: Beweisen, dass das System gesund ist
Observability ist nicht nutzlos, sobald der Rollback abgeschlossen ist. Du musst bestätigen, dass das System tatsächlich wieder gesund ist. Nicht nur „die Seite lädt“, sondern:
- Die Fehlerrate ist wieder auf dem Basisllevel.
- Die Latenz liegt im normalen Bereich.
- Logs zeigen keine neuen Exceptions.
- Der Durchsatz hat sich erholt.
Diese Signale sind dein Beweis, dass die Recovery erfolgreich war. Ohne sie hoffst du nur, dass das Problem verschwunden ist. Mit ihnen kannst du den Incident zuversichtlich abschließen.
Die Falle: Observability als Zukunftsprojekt behandeln
Viele Teams behandeln Observability als etwas, das man später einrichtet. Sie installieren einen Logging-Agenten, fügen ein paar Metriken hinzu und betrachten es als erledigt. Wenn ein echter Incident passiert, stellen sie fest, dass ihre Logs unstrukturiert sind, ihre Metriken nicht die richtigen Signale abdecken und sie überhaupt kein Tracing haben.
Ein Recovery-Plan ohne Observability ist nur ein Dokument. Du kannst aufschreiben „Rollback, wenn die Fehlerrate steigt“, aber wenn du nicht weißt, was deine normale Fehlerrate ist, oder wenn du sie nicht in Echtzeit messen kannst, ist diese Anweisung bedeutungslos.
Observability ist kein Monitoring-Projekt. Es ist ein Recovery-Werkzeug. Es gibt deinem Team die Fähigkeit, schnell zu sehen, zu verstehen und zu handeln, wenn etwas schiefgeht. Ohne sie tappst du im Dunkeln. Du weißt, dass etwas nicht stimmt, aber du weißt nicht, wo oder wie du es beheben sollst.
Praktische Checkliste für recovery-fähige Observability
- Jeder Dienst loggt strukturiertes JSON mit Zeitstempel, Level, Dienstname und Trace-ID.
- Wichtige Metriken (Fehlerrate, Latenz, Durchsatz) haben definierte Basiswerte und Alarme.
- Verteiltes Tracing ist für alle kritischen Request-Pfade aktiviert.
- Alarme sind so konfiguriert, dass sie innerhalb von Sekunden nach einer Deployment-Anomalie auslösen.
- Das Team hat den Umgang mit Logs, Metriken und Traces in einem simulierten Incident geübt.
Die konkrete Erkenntnis
Frag dein Team beim nächsten Deployment: „Wenn dieses Deployment schiefgeht, wissen wir dann innerhalb von fünf Minuten, was passiert ist?“ Wenn die Antwort Nein lautet, verbessere deine Observability, bevor du deployst. Die Daten, die du heute sammelst, sind das Einzige, was dich morgen davor bewahrt, zu raten.