InfraGuard

Problemlösung (Vorfallfälle)

Ein Workflow für Vorfallfälle, der Ausfälle und Fehler über Erfassung -> in Untersuchung -> Ursache identifiziert -> gelöst -> geschlossen verfolgt und dabei direkte Ursache, Grundursache, Behebung und vorbeugende Maßnahme festhält.

Übersicht — was diese Seite leistet

Problemlösung ist der Workflow für Vorfallfälle des Rollenbereichs Service. Erfassen Sie jeden Ausfall, Fehler oder Leistungsabfall als einen einzelnen Fall und führen Sie ihn durch die Status-Pipeline Erfassung → in Untersuchung → Ursache identifiziert → gelöst → geschlossen, wobei Sie in jedem Schritt Untersuchung, Ursache und Maßnahme festhalten. Die Seite dient zugleich als Verzeichnis Ihrer Post-mortems und vorbeugenden Maßnahmen.

Alle Daten liegen in einer einzigen Tabelle, infr_incident, und diese Seite verarbeitet ausschließlich Zeilen mit area='service'. Die Seite Sicherheits-Problemlösung teilt sich dieselbe Tabelle mit area='security' — identisches Schema, getrenntes Board.

Jeder Fall führt vier Ursachen-/Maßnahmenfelder, die einem formalen Post-mortem-Bericht nachempfunden sind:

Feld Bedeutung Beispiel
direct_cause Der unmittelbare Auslöser des Ausfalls Verbindungslimit von mysql überschritten (Too many connections)
root_cause Der zugrunde liegende Grund, der die unmittelbare Ursache hervorgebracht hat ein Cron-Skript im 5-Minuten-Takt gab Verbindungen nie zurück → Leck → Limit erschöpft
resolution Maßnahme, die den Dienst während des Vorfalls wiederhergestellt hat Verbindungen bereinigt, Prozess neu gestartet, Limit für die sofortige Wiederherstellung angehoben
action_taken Dauerhafte Behebung, um eine Wiederholung zu verhindern dediziertes Konto mit MAX_USER_CONNECTIONS isoliert, Skript gepatcht, Überwachungsalarm ergänzt

Diese Seite wurde aus dem früheren Menü „SLA & Uptime“ umbenannt (Namensraum sla → resolution). Der KPI für das Verfügbarkeitsziel (uptime_target) bleibt erhalten.


Wann Sie sie einsetzen


Aufbau

KPI-Leiste

Die KPIs im Kopfbereich werden über alle Fälle mit area='service' berechnet.

KPI Berechnung
Gesamt (total) Anzahl der Service-Fälle
Aktiv (active) Summe aus open + investigating + cause_identified
Gelöst (resolved) Summe aus resolved + closed
MTTR (mttr_min) Mittelwert aus (Lösung − Auftreten) in Minuten, nur für Fälle, die SOWOHL occurred_at ALS AUCH resolved_at besitzen
Kumulierte Ausfallzeit (downtime_min) Einfache Summe des Feldes downtime_min je Fall (Minuten)
Verfügbarkeitsziel (uptime_target) sla_uptime_target der Betriebsrichtlinie (Standard 99.9%)

Für einen belastbaren MTTR tragen Sie am Fall einen Auftretenszeitpunkt (occurred_at) ein und lassen Sie den Übergang auf „gelöst“ automatisch resolved_at setzen. Ein Fall ohne Auftretenszeitpunkt bleibt im MTTR-Mittelwert unberücksichtigt.

Fall-Board

Die Fälle werden als Karten/Zeilen aufgelistet und serverseitig sortiert (in PHP, um rohes SQL im Controller zu vermeiden) — nach dieser Priorität:

  1. Statusrang: open → investigating → cause_identified → resolved → closed
  2. Schweregradrang: crit → warn → info
  3. Neueste id zuerst

Dadurch steigen aktive, schwerwiegende, aktuelle Fälle nach oben.

Jede Karte zeigt das Herkunfts-Badge (manuell / Pulse / Alarm / Behörde / Quarantäne / aus Erkennung hochgestuft), den Schweregrad, den Status, den Projektnamen, den Auftretenszeitpunkt, die Ausfallzeit und die Anzahl der Ereignisse.

Detail-Dialog

Beim Öffnen eines Falls erscheint links der Bericht (Zusammenfassung · direkte Ursache · Grundursache · Behebung · vorbeugende Maßnahme) und rechts die Zeitleiste (Statuswechsel · Notizen), mit den Übergangsschaltflächen der Pipeline im Kopfbereich.


Vorgehen

1) Einen Fall erfassen

[Register case] → modales Formular. Beim Anlegen wird der Fall mit source='manual', area='service', status='open' gespeichert; detected_at wird serverseitig gesetzt (now()) und ein Ereignis created an die Zeitleiste angehängt.

Felder und Prüfgrenzen:

Feld Pflicht Grenze
title ✔ max. 200 Zeichen
severity info/warn/crit — leer bedeutet standardmäßig warn (Betriebsrichtlinie incident_default_severity)
project_id muss in infr_project vorhanden sein
service_id muss in infr_service vorhanden sein
url max. 255 Zeichen
occurred_at Datum
summary max. 4000 Zeichen
direct_cause / root_cause / resolution / action_taken jeweils max. 4000 Zeichen
downtime_min ganzzahlig, ≥ 0
impact max. 191 Zeichen

2) Statusübergang (Pipeline)

Ein Klick auf die Schaltfläche des nächsten Schritts im Detail-Dialog öffnet einen Schrittübergangs-Dialog. Jeder Schritt erläutert, „was in diesem Schritt zu tun ist“, und lässt Sie die für diesen Schritt relevanten Berichtsfelder ausfüllen. Nur die Felder, die Sie senden, werden aktualisiert — Sie können Ursachen also ergänzen, ohne den Status zu ändern, oder ausschließlich den Bericht ausbauen.

Schritt Code Was in diesem Schritt zu tun ist
Erfassung open Den Fall in den Eingang zurückstellen (vor der Untersuchung)
In Untersuchung investigating Symptome bestätigen, Auswirkung eingrenzen, Zusammenfassung schreiben
Ursache identifiziert cause_identified Die direkte Ursache und deren Grundursache (Hintergrund) bestimmen und festhalten
Gelöst resolved Die angewandte Wiederherstellungsmethode und die vorbeugende Maßnahme festhalten
Geschlossen closed Prüfen, dass Behebung und Vorbeugung umgesetzt sind, und den Fall schließen

Übergangsregeln:

Datumsangaben werden über toLocaleString gerendert, gebunden an die aktive Oberflächensprache (window.__locale), sodass Monat und Uhrzeit auch im EN-Modus korrekt erscheinen.

3) Notizen zur Zusammenarbeit

Wenn Sie im Detail-Dialog eine Notiz hinzufügen, wird ein Ereignis kind='note' an die Zeitleiste angehängt (Notizen sind in infr_incident_event zusammengefasst — eine separate Notiztabelle gibt es nicht). Text max. 4000 Zeichen.

4) Löschen

Beim Löschen eines Falls werden der Vorfall und alle zugehörigen infr_incident_event-Zeilen gemeinsam entfernt. Das lässt sich nicht rückgängig machen.

5) Automatischer Eingang (Pulse / Exception-Reporter)

Wenn eine externe Laravel-Anwendung ihre Exceptions an die Vorfall-Ingest-API (POST /api/v1/incidents) sendet, verarbeitet IncidentIngestService sie und trägt sie automatisch auf diesem Board ein:

Schlüssel und Integrationscode verwalten Sie unter Verwaltung ▸ API-Schlüssel.


Datenquellen

Tabelle Rolle
infr_incident Der Fall selbst. Diese Seite fragt ausschließlich area='service' ab. Migration 000719 (+ 000723 Ingest-Felder · 000731 area · 000732 Erweiterung von source)
infr_incident_event Zeitleiste (nur anhängend). kind = created/note/action/status_change/cause/resolution/alert_added. Nutzt ausschließlich created_at (Migration 000720)
infr_project Projekt-Auswahlliste · Projektname auf der Karte
infr_service Service-Auswahlliste
infr_audit_log Prüfpfad für Anlegen/Ändern/Übergang/Löschen

Zentrale Spalten von infr_incident: source, area, title, severity, status, project_id, service_id, url, occurred_at, detected_at, resolved_at, closed_at, summary, direct_cause, root_cause, resolution, action_taken, downtime_min, impact, fingerprint, occurrence_count, last_occurred_at, api_key_id, created_by, updated_by.

Die Standardwerte stammen aus der Betriebsrichtlinie OpsPolicy::slaDefaults():

sla_uptime_target         = 99.9   # SLA-Zielverfügbarkeit (%)
incident_default_severity = warn   # Standard-Schweregrad bei der Erfassung (info|warn|crit)

Routen:

GET  /service/resolution              index (Board)
GET  /service/resolution/live         live  (JSON-Polling-Aktualisierung)
POST /service/resolution/save         Fall erfassen / aktualisieren
POST /service/resolution/transition   Statusübergang (+ Bericht je Schritt / closed_at)
POST /service/resolution/note         Notiz zur Zusammenarbeit hinzufügen
POST /service/resolution/delete       Fall löschen

Zugriff

Aktion Erforderliche Stufe
Board ansehen (index/live) Angemeldeter Benutzer (infr.auth, Stufe ≥ 1)
Erfassen / Ändern / Übergang / Notiz / Löschen Stufe ≥ 2

Jeder Schreibvorgang (Erfassen/Ändern/Übergang/Löschen) wird in infr_audit_log als incident.create / incident.update / incident.transition / incident.delete festgehalten, samt handelnder Person und Status vorher/nachher. Zum Stufenmodell siehe RBAC-Stufen.


Fehlersuche und FAQ

F. Der MTTR bleibt leer / zeigt keinen Wert. Ein Fall muss SOWOHL einen Auftretenszeitpunkt (occurred_at) ALS AUCH einen Lösungszeitpunkt (resolved_at) besitzen, um in den MTTR-Mittelwert einzugehen. Prüfen Sie, ob Sie den Auftretenszeitpunkt eingetragen haben und ob der Übergang auf „gelöst“ resolved_at gesetzt hat.

F. Die kumulierte Ausfallzeit zeigt 0. Der Ausfallzeit-KPI ist eine einfache Summe des Feldes downtime_min je Fall. Sie müssen die Ausfallzeit (in Minuten) am Fall eintragen; sie wird nicht automatisch aus Auftretens- und Lösungszeitpunkt abgeleitet.

F. Ein Pulse-Fall taucht nicht auf. Aufgenommene Fälle tragen source='pulse' und lassen area ungesetzt, greifen also auf den Standard service zurück und erscheinen hier. Fehlt trotzdem einer, prüfen Sie, (1) ob der API-Schlüssel gültig ist und (2) ob derselbe Fingerprint in einen bereits offenen Fall dedupliziert wurde (nur occurrence_count wurde hochgezählt). Sicherheitsvorfälle erscheinen unter Sicherheits-Problemlösung (area='security'), nicht auf diesem Board.

F. Kann ich den Schließzeitpunkt in die Vergangenheit legen? Ja. Tragen Sie die gewünschte Zeit im Feld für den Schließzeitpunkt (flatpickr) des closed-Übergangsdialogs ein, dann wird dieser Wert gespeichert. Lassen Sie es leer, um die aktuelle Serverzeit (now()) zu verwenden.

F. Ich möchte Ursachen ergänzen, ohne den Status zu ändern. Der Übergangsdialog aktualisiert nur die Felder, die Sie senden. Ein Übergang auf denselben Status bei gleichzeitigem Ausfüllen der Berichtsfelder aktualisiert den Bericht ohne ein Statuswechsel-Ereignis (alternativ bearbeiten Sie den Fall direkt).

F. Lässt sich ein gelöschter Fall wiederherstellen? Nein. Das Löschen entfernt den Fall samt allen Zeitleisten-Ereignissen und lässt sich nicht rückgängig machen. Der Löschvorgang selbst wird im Audit-Log festgehalten.


Verwandt

문제 해결 — 인시던트 보드
문제 해결 — 인시던트 보드