© Excellent backgrounds/Shutterstock.com
Spring-Boot-Anwendungen überwachen

Der Admin hats im Blick


Mit Spring Boot ist es ganz einfach und rasend schnell möglich, neue Anwendungen zu erstellen und in Produktion zu bringen. Und dann? Oft werden die Monitoringtools von einem anderen Team betreut, und bis sie richtig konfiguriert sind, vergehen oft Wochen. Hier bietet Spring Boot Admin Abhilfe.

Als Entwickler übernehmen wir nach dem Credo „You build it, you run it!“ immer häufiger die Verantwortung für einen stabilen produktiven Betrieb. Was heißt das für uns? Wir müssen jederzeit auf einen Blick wissen, ob es unseren Anwendungen gut geht. Im Ernstfall brauchen wir schnellen Zugriff auf Detailinformationen und auch die Möglichkeit, das Verhalten der Anwendung zu beeinflussen. Das Actuator-Modul von Spring Boot stellt HTTP-Endpunkte bereit, die Auskunft über den Zustand der Anwendung geben und es erlauben, die Anwendung zu beeinflussen. Integriert man Spring Boot Actuator in die eigene Anwendung, wird automatisch ein /health-Endpunkt aktiviert, der HealthIndicatoren verwendet, um Auskunft über die aktuelle Lauffähigkeit zu geben. Hier bringt Spring Boot eine Reihe Implementierungen für Datenbanken, JavaMailSender oder LDAP mit, die automatisch konfiguriert werden. Neben dem / health-Endpunkt gibt es noch viele weitere, z. B. für Metriken und Loglevelmanagement.

Was Spring Boot fehlt, ist eine komfortable Oberfläche, um diese HTTP-Endpunkte zu bedienen, aber auch Alarmierungen, wenn die Anwendung klemmt. Mit Spring Boot Admin steht eine Monitoringlösung bereit, die sich ohne aufwendige Konfiguration mit Spring-Boot-Anwendungen versteht und die ohne Anpassungen in der Konfiguration neue Anwendungen in das Monitoring aufnehmen kann.

Bevor wir uns dem Aufsetzen des Monitoringservers widmen, benötigen wir eine Anwendung, die wir überwachen können. Daher stellen wir uns flugs eine Anwendung auf http://start.spring.io zusammen. Spring Boot Admin benötigt Zugriff auf die Spring-Boot-Actuator-Endpunkte per HTTP, also wählen wir Web und Actuator aus. Danach fügen wir einen einfachen RestController hinzu (Listing 1). Und schon haben wir unser ClientApplication, kurz Client.

Listing 1: ClientApplication.java

@RestController @SpringBootApplication public class ClientApplication { public static void main(String[] args) { SpringApplication.run(ClientApplication.class, args); } @GetMapping("/") public String hello() { return "Hello World!" } }

Ab Spring Boot Version 1.5 sind die Spring-Boot-Actuator-Endpunkte standardmäßig mit HTTP-Security versehen. Diese werden wir vorerst mit managament.security.enabled=false in der application.properties deaktivieren. Um Sicherheit kümmern wir uns später noch. Alle Anwendungen, die mit Spring Boot Admin Server verwaltet werden sollen, müssen diesem bekannt sein. In unserem Beispiel wird sich der Client selbst registrieren. Dazu nehmen wir de.codecentric:spring-boot-admin-starter-client als Abhängigkeit in unsere pom.xml auf (Listing 2). Wir teilen der Anwendung noch über spring.boot.admin.url mit, bei welchem Admin-Server sie sich registrieren soll (Listing 3).

Listing 2: „pom.xml“-Client

<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>1.5.0</version> </dependency>

Listing 3: „application.properties“-Client

managament.security.enabled=false spring.boot.admin.url=http://localhost:8000

Jetzt setzen wir den Spring Boot Admin Server auf. Bei dem Admin-Server handelt es sich ebenfalls um eine Spring-Boot-Anwendung. Als Basis können wir ebenfalls mit den gleichen Einstellungen ein Projekt auf start.spring.io generieren. Wir müssen die Abhängigkeiten für den Admin-Server aufnehmen (Listing 4) und die dort enthaltene Konfiguration mit @EnableAdminServer aktivieren (Listing 5).

Listing 4: „pom.xml“-Server

<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server</artifactId> <version>1.5.0</version> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server-ui</artifactId> <version>1.5.0</version> </dependency>

Listing 5: „SpringBoot­AdminApplication.java“-Server

@Configuration @EnableAutoConfiguration @EnableAdminServer public class SpringBootAdminApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminApplication.class, args); } }

Den Admin-Server konfigurieren wir mit server.port=8000 mit dem Port, den wir beim Client angegeben haben. Nun können wir beide Anwendungen einfach starten (z. B. mit mvn spring-boot:run) und haben sofort einige Funktionalitäten für die Verwaltung unserer Anwendung. Desktopbenachrichtigungen und ein Journal über Statusänderungen sowie eine detaillierte Übersicht über den Status der Anwendungen sind zu sehen (Abb. 1). Auch Informationen über das konfigurierte Spring Environment und einfache Änderungsmöglichkeit der Loglevel (Abb. 2) werden uns angeboten. Außerdem gibt es eine Ansicht für Thread-Dumps, Heap-Dump-Download, HTTP Request Traces und eine Übersicht über Audit-Events.

Nachdem die Clientanwendung gestartet ist, sorgt die Autokonfiguration des spring-boot-admin-starter-client hinter der Bühne dafür, dass diese sich per HTTP POST beim Admin-Server registriert. Der Request enthält Informationen darüber, wie die Clientanwendung zu erreichen ist. Dabei wird der URL basierend auf den Hostnamen server.port, server.context-path, management.context-path automatisch berechnet. Stimmen die Werte nicht, z. B. weil ein Reverse-Proxy davor geschaltet ist oder das Ganze in einem Docker-Container läuft, stehen unter spring.boot.admin.client.* einige Konfigurationsoptionen zur Verfügung, mit denen man das Verhalten beeinflussen kann. Wenn auch das nicht ausreicht, kann man im Client eine eigene ApplicationFactory implementieren, die für die Ermittlung des URL verantwortlich ist. Wie bei Spring Boot selbst werden möglichst sinnvolle Defaults verwendet. Es ist aber jederzeit möglich, die Defaults zu überschreiben oder Teile der Implementierung auszutauschen.

Nachdem sich ein Client beim Admin registriert hat, fragt dieser periodisch den /health-Endpunkt des Clients ab, um den Status zu ermitteln. Für die Anzeige der restlichen Informationen im UI enthält der Spring Boot Admin Server einen Reverse-Proxy auf Basis von Neflix Zuul. So muss vom Browser aus nur der Admin-Server erreichbar sein, aber nicht alle registrierten Clients. Es ist möglich, mehrere Instanzen der Clientanwen...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang