Einstieg in Spring Boot, Teil 15 Monitoring mit dem Spring Boot Actuator

Autor / Redakteur: Dr. Dirk Koller / Stephan Augsten

Die Überwachung von Anwendungen übernimmt im Falle von Spring Boot der Actuator. Das Monitoring-Tool liefert über so genannte Endpoints allerlei hilfreiche Informationen zum Zustand der Spring-Applikation.

Firmen zum Thema

Zugriff auf den Spring Boot Actuator mit der JMX-Konsole.
Zugriff auf den Spring Boot Actuator mit der JMX-Konsole.
(Bild: Dr. Koller / Oracle)

Nach erfolgreicher Inbetriebnahme einer Anwendung kommt irgendwann die Frage auf, ob die Software ordnungsgemäß arbeitet. Läuft sie überhaupt noch? Wieviele Requests werden bearbeitet? Wie lange dauert die Verarbeitung? Wie ist der Speicherverbrauch?

Um solche Fragen beantworten zu können, gibt es für Spring Boot ein Monitoring-Tool namens Actuator (auf deutsch „Bedienteil“). Über verschiedene Endpunkte lassen sich damit Informationen über den Zustand der Anwendung auslesen, aber auch Eigenschaften wie zum Beispiel den Loglevel anpassen.

Die Integration des Werkzeugs in das zu überwachende Projekt geschieht Spring Boot-typisch durch Einbinden einer Starter-Dependency. Sie heißt spring-boot-starter-actuator:

<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>
</dependencies>
„Spring Boot“-Tutorial
Bildergalerie mit 20 Bildern

Alternativ lässt sich die Abhängigkeit bei Verwendung der Spring Tool Suite im Kontextmenü der POM über „Spring > Edit Starters“ zufügen, der Name dort lautet Spring Boot Actuator.

Beim nächsten Start der Anwendung ist Actuator schon aktiv. In der Konsole findet sich eine entsprechende Meldung:

Exposing 2 endpoint(s) beneath base path '/actuator'

Die Endpunkte sind entweder über die Java Management Extensions (JMX) oder HTTP erreichbar. Wenn der Default-Port 8080 nicht verändert wurde, gibt der Aufruf der URL http://localhost:8080/actuator/ im Browser oder in Curl die verfügbaren Endpunkte im JSON-Format zurück:

{
   "_links":{
      "self":{
         "href":"http://localhost:8080/actuator",
         "templated":false
      },
      "health":{
         "href":"http://localhost:8080/actuator/health",
         "templated":false
      },
      "health-component":{
         "href":"http://localhost:8080/actuator/health/{component}",
         "templated":true
      },
      "health-component-instance":{
         "href":"http://localhost:8080/actuator/health/{component}/{instance}",
         "templated":true
      },
      "info":{
         "href":"http://localhost:8080/actuator/info",
         "templated":false
      }
   }
}

Wie der Ausgabe zu entnehmen ist, ist der health-Endpoint unter http://localhost:8080/actuator/health zu finden. Der Aufruf liefert ein JSON-Objekt mit dem Status „up“:

{"status":"UP"}

Der Endpoint info ist entsprechend über http://localhost:8080/actuator/info erreichbar. Hier wird allerdings zunächst ein leeres JSON-Objekt zurückgegeben. Die Informationen über die Anwendung müssen im Properties-File application.properties zur Verfügung gestellt werden, bevor sie abgerufen werden können:

info.app.name=Test-Anwendung
info.app.description=Eine Beschreibung
info.app.version=1.0.0

Enabling and Exposing

Neben den beiden genannten Endpunkten gibt es eine ganze Reihe weiterer vordefinierter Endpoints, beispielsweise zum Anzeigen aller Beans im Container oder zum Herunterfahren der Anwendung. Die komplette Auflistung findet sich in den Spring Boot Docs.

Diese Endpunkte sind allerdings aus Sicherheitsgründen deaktiviert. Mit dem folgenden Eintrag in application.properties kann man beispielsweise den Endpoint zum Anzeigen der im Container enthaltenen Beans aktivieren:

management.endpoint.beans.enabled=true

Nach dem Aktivieren muss der Endpunkt noch veröffentlicht werden, das geschieht mit der Eigenschaft management.endpoints.web.exposure.include. Die bestehenden Endpunkte health und info werden kommasepariert ebenfalls angegeben, wenn sie weiterhin verfügbar sein sollen:

management.endpoints.web.exposure.include=info, health, beans

Danach ist die Liste der Beans unter http://localhost:8080/actuator/beans erreichbar, sie ist beim Debugging ganz hilfreich.

Eigene Endpunkte definieren

Bisher haben wir nur von Spring Boot vordefinierte Endpunkte benutzt. Es lassen sich aber auch eigene Endpunkte erstellen und über die vorgestellten Zugriffsmöglichkeiten abfragen. Zu diesem Zweck legt man eine Bean – entweder mit @Component oder mithilfe einer Konfigurationsklasse – an und annotiert diese mit @Endpoint. Das Attribut id von @Endpoint bestimmt den Pfad, unter dem der Endpoint erreichbar ist, hier lautet er /hello:

@Component
@Endpoint (id = "hello")
public class HelloEndpoint {
}

In der Klasse lassen sich nun Methoden zum Lesen (@ReadOperation), Schreiben (@WriteOperation) und Löschen (@DeleteOperation) definieren. Diese mappen auf die HTTP-Methoden GET, POST und DELETE.

Im Folgenden wird beispielhaft eine Methode helloWorld implementiert, die den String „Hello World“ zurückgibt. Sie wird aufgerufen, wenn ein GET-Aufruf auf die URL http://localhost:8080/actuator/hello erfolgt:

@Component
@Endpoint(id = "hello")
public class HelloEndpoint {
   @ReadOperation
   public String helloWorld() {
      return "Hello World";
   }
}

Damit der Endpunkt erreichbar ist, muss die vergebene id in die exposure-Liste aufgenommen werden:

management.endpoints.web.exposure.include=beans, info, health, hello

Danach kann der Enpunkt dann mit http://localhost:8080/actuator/hello benutzt werden. Eine statische Rückgabe macht hier natürlich nicht viel Sinn, es lassen sich aber auch beispielweise die Inhalte von Variablen oder Werte aus der Datenbank zurückgeben.

Zugriff über JMX

Zugriff auf Actuator mit der JMX-Konsole.
Zugriff auf Actuator mit der JMX-Konsole.
(Bild: Dr. Koller / JMX)

Die Actuator-Endpunkte sind auch über JMX erreichbar. Um das auszuprobieren, startet man die Java Monitoring & Management Console (JConsole). Auf dem Mac gibt man dazu einfach jconsole in ein Terminal-Fenster ein.

„Spring Boot“-Tutorial
Bildergalerie mit 20 Bildern

In der eingangs angezeigten Liste der lokalen Prozesse ist ein Prozess mit dem Namen der Applikation vorhanden, über den Connect-Button wird die Verbindung erstellt. In den darauffolgenden Details findet man im Reiter MBeans im Paket org.springframework.boot.Endpoint die freigegeben Endpunkte.

Actuator stellt eine leistungsfähige Schnittstelle zur Überwachung von Anwendungen zur Verfügung. Allerdings wird man grade bei vielen Services weitere Software benötigen, die die Endpunkte aufruft und die Ergebnisse leicht zugänglich macht. Ein solches Werkzeug ist der Spring Boot Admin-Monitor, der im nächsten Beitrag der Spring Boot-Reihe vorgestellt wird.

(ID:47444892)

Über den Autor