Einstieg in Spring Boot, Teil 16 Monitoring mit Spring Boot Admin
Spring-Boot-Anwendungen lassen sich wie gezeigt mit dem Actuator überwachen. Hierfür gibt es zusätzliche Erweiterungen wie „Spring Boot Admin“, die sich um das Aufrufen der Endpunkte und die Datenvisualisierung kümmern.
Anbieter zum Thema

Im vorhergehenden Beitrag der Serie wurde das Werkzeug Actuator vorgestellt, mit dessen Hilfe sich Spring Boot-Anwendungen überwachen lassen. Die Endpunkte des Actuator-Frameworks werden dabei mittels http oder JMX abgefragt.
Das ist in der Praxis ohne weitere Hilfsmittel allerdings sehr unkomfortabel, insbesondere wenn mehrere Services im Auge behalten werden sollen. Eine kostenlose Ergänzung für den Actuator ist das Projekt Spring Boot Admin des Unternehmens Codecentric. Das Werkzeug gehört nicht zu Spring, ist aber fest in der Community etabliert.
Einrichten von Spring Boot-Admin
Zum Aufsetzen des Admin-UI wird ein neuer Spring Boot-Service angelegt. Dieser erhält neben der erforderlichen Abhängigkeit zu Spring Web zusätzlich einen Eintrag für spring-boot-admin-starter-server im POM. Derzeit ist die Version 2.4.1 aktuell:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Die Application-Klasse des angelegten Service wird mit @EnableAdminServer annotiert:
@EnableAdminServer
@SpringBootApplication
public class AdminMonitorApplication {
public static void main(String[] args) {
SpringApplication.run(AdminMonitorApplication.class, args);
}
}
Der Monitor kann anschließend bereits gestartet werden. Ohne Änderung des Ports ist er zunächst wie jeder neue Service unter http://localhost:8080 erreichbar. Wer den Port ändern möchte, kann das durch Setzen der Property server.port in application.properties erledigen:
server.port=8081
Wie der Screenshot zeigt, sind noch keine Client-Anwendungen angebunden. Diese müssen sich beim Monitor zunächst anmelden, um „gemonitored“ zu werden.
Registrieren von Client-Services
, die sich beim Admin-Server zur Überwachung registrieren sollen, erhalten im POM neben der ohnehin erforderlichen Abhängigkeit zu spring-boot-starter-actuator die Dependency spring-boot-admin-starter-client:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.4.1</version>
</dependency>
Außerdem muss der zu überwachenden Anwendung die URL des Admin-Servers mitgeteilt werden. Das geschieht in der Properties-Datei application.properties der Client-Anwendung. Wie im vorhergehenden Beitrag erläutert, ist hier außerdem anzugeben, welche Endpunkte veröffentlicht werden sollen:
spring.boot.admin.client.url=http://localhost:8081
management.endpoints.web.exposure.include=*
Nach dem Neustart der Anwendung taucht diese nun in der Liste der zu überwachenden Anwendungen auf. Ein Klick auf den grauen Bereich rund um den Link mit der Client-URL (nicht auf den Link selbst klicken) führt zu den Details des überwachten Dienstes. Entsprechend den freigegebenen Endpunkten tauchen hier mehr oder weniger Informationen auf. Im Beispiel wurde zur Demonstration alles freigegeben.
Absichern des Admin-Servers
Im Admin-Server lassen sich sensible Daten wie zum Beispiel das Logfile der Anwendung einsehen. Abhängig von der Konfiguration kann man vielleicht sogar Daten ändern. Das soll natürlich nicht für jedermann im Netzwerk möglich, sondern dem Administrator des Service vorbehalten sein.
Aus diesem Grund empfiehlt es sich, den Admin-Server mit Spring Security abzusichern. Dank Spring Boots „Convention over Configuration“-Ansatzes ist das gar nicht so aufwendig. Zunächst wird der Security-Starter im POM des Admin-Server eingebunden. Außerdem wird noch eine Abhängigkeit zu einer schicken Login-Seite für den Admin-Server zugefügt:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-ui</artifactId>
<version>2.4.1</version>
</dependency>
In der application.properties des Admin-Servers werden Benutzername und Passwort für den Admin-Zugang hinterlegt:
spring.security.user.name=admin
spring.security.user.password=mypassword
Zu guter Letzt wird noch eine Security-Konfigurationsklasse gemäß der Dokumentation von Spring Boot Admin zugefügt:
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final AdminServerProperties adminServer;
private final SecurityProperties security;
public SecuritySecureConfig(AdminServerProperties adminServer, SecurityProperties security) {
this.adminServer = adminServer;
this.security = security;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(this.adminServer.path("/"));
http.authorizeRequests(
(authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll()
.antMatchers(this.adminServer.path("/actuator/info")).permitAll()
.antMatchers(this.adminServer.path("/actuator/health")).permitAll()
.antMatchers(this.adminServer.path("/login")).permitAll().anyRequest().authenticated()
).formLogin(
(formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and()
).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults())
.csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringRequestMatchers(
new AntPathRequestMatcher(this.adminServer.path("/instances"),
HttpMethod.POST.toString()),
new AntPathRequestMatcher(this.adminServer.path("/instances/*"),
HttpMethod.DELETE.toString()),
new AntPathRequestMatcher(this.adminServer.path("/actuator/**"))
))
.rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));
}
}
In der Konfiguration wird unter anderem festgelegt, dass alle Zugriffe außer auf statische Assets und die Login-Seite nur von authentifizierten Benutzern erfolgen dürfen. Außerdem werden die Pfade für Login und Logout definiert.
Nach dem Neustart und Aufruf der URL http://localhost:8081 landet man nun zunächst auf einer Login-Seite. Nach Angabe der in application.properties hinterlegten Daten wird schließlich die Seite mit den überwachten Services angezeigt. Unglücklicherweise sind aber keine Clients mehr im Server zu sehen. Diese wurden mit den neuen Security-Einstellungen ausgesperrt und können sich nicht mehr registrieren.
Die Client-Anwendungen bekommen deshalb in ihrer application.properties ebenfalls Benutzername und Passwort mitgeteilt:
spring.boot.admin.client.username=admin
spring.boot.admin.client.password=mypassword
Danach erscheinen die Clients wieder in der Liste der zu überwachenden Anwendungen.
Spring ist ein mächtig großes Framework und wie so oft gibt es auch zum Spring Boot Admin so viel mehr zu entdecken. Ein guter Einstieg ist der Quick Guide im Github-Repository von Codecentric. Viel Spaß beim Überwachen!
(ID:47487398)