Konzept Überwachung

Java Bibliothek / IT-System

Name Art Version

isy-ueberwachung

Bibliothek

5.0.0

Konzept Überwachung: Inhalt

1. Einleitung

In diesem Konzept werden die Designvorgaben für die Überwachung von Anwendungen gemäß der Referenzarchitektur vorgestellt. Es legt ein standardkonformes Modell zur Überwachung von Anwendungen auf Basis von Spring Boot Actuator fest.

Die Realisierung einer einheitlichen Überwachungsschnittstelle erlaubt dem Betrieb frühzeitig Probleme in der Anwendungslandschaft zu erkennen und darauf zu reagieren. Dadurch können Ausfallzeiten minimiert werden.

Der Fokus des Konzepts liegt auf der Schaffung von einheitlichen Administrationsschnittstellen, welche dem Betrieb eine einfache Überwachung der Anwendungen erlauben. Dabei wird Readiness als fachlich und betrieblich führendes Signal für die Annahme von Traffic definiert. Liveness bildet ausschließlich die Prozess- und Runtime-Lebendigkeit einer Anwendung ab. Der bestehende Endpoint /actuator/health bleibt im Sinne der Abwärtskompatibilität semantisch und funktional unverändert und ist parallel zu den Endpunkten /actuator/health/readiness und /actuator/health/liveness bereitzustellen. In Systementwürfen können Verfeinerungen der hier getroffenen Vorgaben gemacht werden. Weiterhin können die hier gemachten Vorgaben als Basis für die Beschreibung der Überwachungsschnittstelle im Systemhandbuch verwendet werden.

2. Kurzeinführung in Spring Boot Actuator

Spring Boot bringt mit Actuator eine Reihe zusätzlicher Funktionen mit, die dabei helfen, Anwendungen zu überwachen und zu verwalten. Die Kommunikation mit der Anwendung erfolgt über sogenannte Endpoints. Diese können über HTTP oder JMX bereitgestellt werden. Actuator bringt eine Reihe von eingebauten Endpoints mit und bietet auch die Möglichkeit, eigene Endpoints hinzuzufügen. Die von Spring Boot bereitgestellten Verfügbarkeitszustände sind verbindlich zu verwenden. Die Endpunkte /actuator/health/readiness und /actuator/health/liveness werden gemäß Spring-Boot-Standard bereitgestellt. Diese sollen standardmäßig aktiviert sein. Der bestehende Endpoint /actuator/health bleibt davon unberührt und wird weiterhin parallel bereitgestellt. Über den Endpoint metrics können Metriken gelesen werden.

Weitergehende Details zu den Actuator Endpoints können bei Spring Boot Actuator Endpoint nachgelesen werden.

3. Informationen über den Systemzustand

Zur Überwachung von Anwendungen unterscheiden wir zwischen zwei unterschiedlichen Konzepten, dem health-Endpoint sowie Liveness und Readiness einer Anwendung.

Der health-Endpoint ist der ursprüngliche Status, über den der Zustand und die Erreichbarkeit einer Anwendung geprüft werden kann.

Liveness und Readiness sind moderne Überwachungsmöglichkeiten. Durch die Unterscheidung in dies zwei Zuständen kann im Gegensatz zu dem health-Endpoint ein feingranulares Monitoring ermöglicht werden.

In der IsyFact wurde (Stand IsyFact 3.0) standardmäßig der health-Endpoint verwendet. Mit der IsyFact 3.0 werden Liveness und Readiness konzeptionell zur Verfügung gestellt. Mit der IsyFact 5.0 sind die Zustände Liveness und Readiness verbindlich von Anwendungen zu exponieren.

3.1. health-Endpoint

Über den health-Endpoint wird durch einen Health-Check der eigene Zustand sowie die Erreichbarkeit aller angebundener Nachbarsysteme dargestellt.

Anders als von Spring vorgesehen entkoppelt die IsyFact den Health-Check vom Aufruf des Endpoints health. Durch diese Entkopplung wird die Systemstabilität durch häufige Aufrufe des Endpoints nicht beeinflusst.

Der Status der health-Endpoints wird maßgeblich von Nachbarsystemchecks bestimmt. Einzelheiten finden sich dazu in Kapitel Nachbarsystemchecks (allgemein). FÜr bestehende Implementierungen kann /actuator/health als Endpunkt genutzt werden. Es sollte aber /actuator/health/readiness verwendet werden. Für neue Implementierungen ist dieser verbindlich zu nutzen.

Implementiert und konfiguriert wurde bzw. wird der Health-Check als Tasks.

Der health-Endpoint bleibt, unverändert, semantisch und funktional als bestehende und abwärtskompatible Gesamtsicht auf den Anwendungszustand bestehen. Insbesondere wird dieser Endpoint nicht auf die Semantik von Readiness oder Liveness gedeutet. Bestehende Integrationen, die /actuator/health verwenden, bleiben funktionsfähig. Die verpflichtende Einführung von /actuator/health/readiness und /actuator/health/liveness erfolgt zusätzlich im Parallelbetrieb und ohne Breaking Change.

3.2. Liveness und Readiness

In diesem Kapitel werden die Begriffe Liveness und Readiness definiert. Die Bedeutung von "live" und "ready" Zuständen von Anwendungen und Services wird beschrieben. Erläutert wird, wie diese mit der Hilfe von Liveness- und Readiness-Probes in Spring Boot überwacht werden können.

3.2.1. Liveness

Liveness beschreibt, ob sich die Anwendung aus Sicht von Prozess und Runtime in einem lauffähigen Zustand befindet. Eine Anwendung wird als "live" (lebendig) angesehen, wenn diese in einem korrekten inneren Zustand ist. Ist eine Anwendung nicht "live", liegt ein irreparabler interner Fehlerzustand, der einen Neustart durch die Infrastruktur erforderlich macht (vgl. Spring Boot LivenessState, Kubernetes Liveness und Readiness Probes). Externe Abhängigkeiten wie Datenbanken, Messaging-Systeme oder entfernte Services beeinflussen die Liveness grundsätzlich nicht, sofern kein irreparabler interner Defekt der Anwendung selbst vorliegt.

3.2.2. Readiness

Eine Anwendung wird als "ready" (bereit) angesehen, wenn sie live ist und Anfragen korrekt verarbeiten kann, daher also Traffic erhalten darf. Eine Anwendung ist nicht "ready", wenn essenzielle Ressourcen oder essenzielle Nachbarsysteme nicht verfügbar sind oder andere Zustände vorliegen, die keinen Neustart erfordern, aber die Bearbeitung von Anfragen verhindern oder unzulässig machen. Ist eine Anwendung nicht "ready", darf die Infrastruktur keine Anfragen an sie senden (vgl. Spring Boot ReadinessState, Kubernetes Liveness und Readiness Probes).

Ein Service (d.h. eine Bündelung von Instanzen/Anwendungen, die denselben Service anbieten) wird als "ready" angesehen, wenn mindestens eine Instanz "ready" ist. Readiness ist der maßgebliche Zustand für das Herausnehmen einzelner Instanzen aus dem Traffic, ohne das die Prozesslebendigkeit infrage zu stellen ist. Prüfungen der Readiness von Services müssen über die Infrastruktur erfolgen.

3.2.3. Diskussion von Liveness & Readiness

Zur Verdeutlichung und Trennung der beiden Begriffe werden diese an dieser Stelle zusammen behandelt. Der Fall, dass eine Anwendung, die nicht "live", aber "ready" ist, ist rein akademisch. In dem Moment, in dem eine Anwendung nicht "live" ist, muss sie durch die Infrastruktur neu gestartet werden, da sie aufgrund des inkorrekten inneren Zustands keine Anfragen korrekt bearbeiten kann. Aus praktischer Sicht wird die Liveness-Abfrage zur Evaluierung, ob eine Anwendung neu zu starten ist, genutzt. Eine Anwendung, die "live", aber nicht "ready" ist, ist in einem korrekten Zustand, hat aber nicht alle notwendigen Abhängigkeiten oder Ressourcen zur Verfügung, um Anfragen anzunehmen. Aus praktischer Sicht ist diese nicht neu zu starten.

Daraus folgt: Zustände, die eine Instanz temporär an der Annahme oder korrekten Bearbeitung von Traffic hindern, sind über Readiness abzubilden. Zustände, die einen Neustart der Instanz erfordern, sind über Liveness abzubilden.

Ist für eine Anwendung die Abfrage beider Zustande vorgesehen, ergeben sich folgende Zustände:

3.3. Zuordnung von HealthIndicators und Abhängigkeiten

Für alle relevanten Indicators und Abhängigkeiten ist fachlich zu entscheiden, ob diese Readiness, Liveness und/oder den bestehenden Health-Status beeinflussen. Maßgeblich ist die Frage, ob die Anwendung ohne die betroffene Abhängigkeit noch zulässige Anfragen verarbeiten darf.

Tabelle 1. Zuordnung von Indicators und Abhängigkeiten
Indicator / Abhängigkeit Readiness Liveness Health Begründung

Essenzielles Nachbarsystem

ja

nein

ja

Fehlt eine essenzielle Abhängigkeit, darf die Anwendung keinen Traffic annehmen; ein interner Defekt liegt dadurch nicht zwingend vor.

Optionales Nachbarsystem

nein

nein

ja

Der Ausfall ist sichtbar zu machen, verhindert aber nicht grundsätzlich die Traffic-Annahme.

Datenbank für Kernfunktionalität

ja

nein

ja

Ohne Datenbank kann die Anwendung fachlich regelmäßig keine Anfragen korrekt bearbeiten.

Optionales Hilfssystem z.B. Cache

nein

nein

ja

Beeinflusst ggf. Performance, aber nicht zwingend die Betriebsbereitschaft.

Irreparabler Laufzeitfehler

ja

ja

ja

Die Anwendung kann keinen Traffic mehr zuverlässig verarbeiten; ein Neustart ist erforderlich.

Manuell gesetzter Wartungszustand

ja

nein

optional

Die Instanz soll gezielt aus dem Traffic genommen werden, bleibt aber technisch lauffähig.

4. Bestimmung von Metriken (Micrometer)

Die im Endpoint metrics bereitgestellten Metriken werden von Micrometer erfasst. Micrometer bietet eine einfache anbieterneutrale Fassade für die gängigsten Überwachungssysteme und ermöglicht es, Metriken im Anwendungscode ohne Herstellerbindung zu implementieren. Seit Spring Boot 2.0 ist Micrometer die Standardbibliothek zur Bereitstellung von Anwendungsmetriken von Spring.

Für eine Liste der unterstützten Monitoring-Systeme siehe unterstützte Monitoring-Systeme

5. Fachliche Möglichkeiten im Zusammenhang mit Health-Checks

Die Überwachung von Systemzuständen wird durch verschiedene fachliche Möglichkeiten aufgegriffen. Auf die Verwendung dieser und die Bereitstellung der Health-Checks wird in diesem Kapitel eingegangen.

5.1. Nachbarsystemcheck

Im Rahmen der periodischen Health-Checks wird die Erreichbarkeit aller angebundenen Nachbarsysteme geprüft (Nachbarsystemcheck). Jede Anwendung führt periodisch einen Health-Check durch, um den eigenen Zustand und die Erreichbarkeit aller angebundenen Nachbarsysteme zu prüfen.

Nachbarsysteme sind hinsichtlich ihrer Relevanz für die Betriebsbereitschaft der Anwendung zu klassifizieren. Bei Nachbarsystemen muss mindestens unterschieden werden, ob ein Nachbarsystem essenziell, oder nicht-essenziell also optional für die prüfende Anwendung ist. Ein Health-Check mit negativem Ergebnis eines essenziellen Nachbarsystems muss in der health der prüfenden Anwendung sichtbar sein.

Die Nachbarsystemchecks können individuell konfiguriert werden. So kann z. B. konfiguriert werden, ob ein Nachbarsystem essenziell ist oder nicht. Details hierzu finden sich in den Nutzungsvorgaben.

5.1.1. Nachbarsystemchecks (allgemein)

Die Nachbarsystemchecks werden über Health- oder Readiness-Checks der Nachbarsysteme durchgeführt.

Schlägt ein Check eines Nachbarsystems fehl, führt dies zu einem Eintrag im technischen Log. Bei einem nicht essenziellen Nachbarsystem wird darauf eine Warnung geloggt. Bei einem essenziellen Nachbarsystem wird ein Fehler geloggt und die health sowie die Readiness des prüfenden Systems muss ebenso einen Fehler aufweisen. Die Zuordnung zu Readiness erfolgt zusätzlich und ohne Umdeutung des bestehenden health Endpunkts. Ein essenzielles Nachbarsystem beeinflusst also die Readiness der Anwendung.

Ist dieses nicht verfügbar, darf die Anwendung keinen Traffic erhalten. Ein optionales Nachbarsystem beeinflusst die Readiness grundsätzlich nicht. Ein Ausfall ist im bestehenden Health-Status und im Logging sichtbar zu machen.

5.1.2. Nachbarsystemchecks über Liveness/Readiness Endpoints

Im Rahmen von Nachbarsystemchecks muss (alternativ zum health-Endpoint) die Readiness überprüft werden. Auch hier muss unterschieden und geloggt werden, ob ein essenzielles Nachbarsystem ausgefallen ist oder ein nicht essenzielles. Ist ein essenzielles Nachbarsystem ausgefallen, dann hat dies Auswirkungen auf die Readiness des Systems jedoch nicht auf die Liveness. Nachbarsystemchecks von essenziellen Systemen sind damit essenziell für die Readiness eines Systems.

5.2. Loadbalancer

Ein Loadbalancer ist ein Netzwerkgerät, mit dem eingehende Anfragen auf mehrere Server verteilt werden. Durch dieses Loadbalancing wird die Ressourcenauslastung, die Reaktionszeit und die Ausfallsicherheit optimiert. Für Anwendungen nach der IsyFact-Architektur sollen einzelne Knoten eines Anwendungsclusters aus dem Loadbalancing herausnehmbar sein. Dies ist für das Durchführen von Updates erforderlich. Aus diesem Grund wird als Teil jeder Webanwendung ein sog. Loadbalancer-Servlet ausgeliefert.

Readiness ist das führende Signal für Loadbalancer und sonstige Traffic-Steuerung. Instanzen, deren /actuator/health/readiness keinen betriebsbereiten Zustand meldet, sind aus dem Traffic zu nehmen. Die Prüfung über eine isAlive-Datei kann während der Übergangszeit oder aus betrieblichen Gründen weiterhin verwendet werden, ersetzt jedoch konzeptionell nicht die Readiness-Semantik. Soweit technisch möglich ist die Infrastruktur direkt den Endpoint /actuator/health/readiness auszuwerten. Die isAlive-Datei bleibt ein zulässiger Mechanismus für betrieblich initiierte temporäre Nichtverfügbarkeit, insbesondere während Migration und Betriebsübergang.

5.2.1. Beschreibung des Loadbalancer-Servlets

Das Loadbalancer-Servlet prüft beim Aufrufen seiner URL, ob eine IsAlive-Datei im Konfigurationsverzeichnis vorhanden ist. Ist eine solche Datei vorhanden, liefert das Servlet den HTTP-Statuscode HTTP OK (200) zurück. Falls keine IsAlive-Datei gefunden wird, liefert das Servlet den Code HTTP FORBIDDEN (403) zurück. Der Loadbalancer prüft in regelmäßigen Abständen die URL des Servlets und nimmt für die Anwendung den entsprechenden Server aus dem Loadbalancing heraus, falls kein HTTP OK gelesen wird. Zu beachten ist, dass auf einem Server prinzipiell mehrere verschiedene Anwendungen laufen können. Der Loadbalancer muss daher so konfiguriert werden, dass auf dem Server nur die betreffende Anwendung deaktiviert wird, zu der das Loadbalancer-Servlet gehört. Alle anderen Anwendungen auf dem entsprechenden Server müssen weiterhin bedient werden.

5.2.2. Loadbalancing mit Readiness-Metrik

Sind Liveness und Readiness definiert, soll der Loadbalancer die Readiness eines Knotens prüfen. Ist die Readiness nicht gegeben, ist der Knoten aus dem Loadbalancing heraus zu nehmen. Je nach betrieblichen Bedingungen und den technischen Möglichkeiten des eingesetzten Loadbalancers ist die Abfrage der Readiness über den Readiness Endpoint oder alternativ über eine isAlive-Datei festzustellen. Die betrieblich begründete, temporäre Nichtverfügbarkeit einer Anwendung, kann über die Löschung einer isAlive-Datei gesteuert werden (vgl. Nutzungsvorgaben). Ist das Vorhandensein einer isAlive-Datei aus betrieblichen Anforderungen nicht notwendig ist die direkte Prüfung über den Readiness Endpoint vorzunehmen.

6. Migration und Parallelbetrieb

Die verpflichtende Einführung von Readiness und Liveness erfolgt in der IsyFact 5.0 ohne Breaking Change im Parallelbetrieb zum bestehenden Endpoint /actuator/health.

6.1. Phase 1: Parallele Einführung

Die Endpunkte /actuator/health/readiness und /actuator/health/liveness werden zusätzlich bereitgestellt und sollen standardmäßig aktiviert sein. Der bestehende Endpoint /actuator/health bleibt semantisch und funktional unverändert bestehen.

6.2. Phase 2: Umstellung von Monitoring und Traffic-Steuerung

Monitoring, Loadbalancer und sonstige Komponenten der Traffic-Steuerung und des Monitorings sollen schrittweise auf die Auswertung von /actuator/health/readiness umgestellt werden. Für Neustart-Entscheidungen und Prozessüberwachung ist /actuator/health/liveness heranzuziehen.

6.3. Phase 3: Nachzug abhängiger Integrationen

Abhängige Anwendungen, Betriebswerkzeuge und sonstige Integrationen, die bislang /actuator/health verwenden, müssen schrittweise auf die neuen Endpunkte migriert werden. Dabei bleibt /actuator/health für bestehende Integrationen weiterhin verfügbar.

Die Migration erfolgt bewusst ohne Umdeutung des bestehenden Endpunkts /actuator/health und damit ohne Breaking Change für bestehende Deployments und Betriebsprozesse.

7. Festlegungen und Ausgrenzungen

Die Nutzungsvorgaben finden sich in den Nutzungsvorgaben Überwachung.

Das Konzept für die Prüfung der Verfügbarkeit ist:

  • Anwendungen nach IsyFact-Architektur müssen Mechanismen bereitstellen, die es erlauben, den Zustand der Anwendung durch den Betrieb zu prüfen.

  • Die Bereitstellung erfolgt auf der Basis von Indicators, diese müssen für alle jeweils betrieblich relevanten Zustände der Anwendung zur Verfügung gestellt werden.

  • Anwendungen müssen die Endpunkte /actuator/health/readiness und /actuator/health/liveness gemäß Spring-Boot-Standard bereitstellen.

  • Diese Endpunkte müssen standardmäßig aktiviert sein.

  • Readiness ist das fachlich und betrieblich führende Signal für Monitoring und Traffic-Steuerung.

  • Liveness ist das führende Signal für die Beurteilung der Prozess- und Runtime-Lebendigkeit.

Folgende Punkte sind bewusst nicht Teil dieses Konzeptes:

  • Micrometer unterstützt die Anbindung zahlreicher Monitoring-Systeme. Es werden keine Vorgaben zur Verwendung eines bestimmten Systems gemacht.