Spring Boot Actuator

Spring Boot daje nam całkiem fajną możliwość do tego, aby monitorować nasze aplikacje. W tym celu została wprowadzona funkcjonalność Actuatora, który pozwala na zbieranie metryk, analizę ruchu oraz wykonanie innych ciekawych zadań lub obserwacji. Aby użyć Actuator-a wystarczy podpiąć odpowiednią zależność w pomie:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Powinniśmy też od razu rozpatrzyć dodanie następującej konfiguracji w pliku application.properties:
management.port=8081 
management.address=127.0.0.1
W ten sposób określamy port, na którym będzie działała usługa. Ze względów bezpieczeństwa dobrze jest wybrać port inny niż ten, na którym pracuje nasza aplikacja. Dodatkowo możemy określić adres ip, z którego będzie można korzystać z usługi. To również jest zalecane.

Podstawowe endpointy

Zobaczmy teraz jakie są podstawowe endpointy Actuatora pod kątem jego zdolności do obserwacji aplikacji Spring Boot.
  • health

    Informuje nas (za pomocą statusu) o tym, czy nasza aplikacja w ogóle żyje. Podawany zakres informacji jest różny w zależności od tego czy jesteśmy uwierzytelnieni, czy nie:
    Spring Boot Actuator - Wskaźnik health aplikacji
  • info

    Wyświetla informacje o aplikacji. Taka informacja musi być jednak przygotowana przez nas. Jeśli nie ustawimy dodatkowych własności w pliku application.properties, na przykład:
    info.app.name=StartAPPa 
    info.app.description=Aplikacja firmy JavAPPa
    info.app.version=1.0.0
    
    wówczas zobaczymy jedynie pustą stronę:
    Spring Boot Actuator - Wskaźnik info aplikacji
  • metrics

    Wyświetla całkiem pokaźny zbiór informacji o stanie zasobów, na przykład:
    "mem": 617698,
    "mem.free": 210901,
    "processors": 4,
    "instance.uptime": 20614,
    "uptime": 31396,
    
    ...
    
    "threads": 24,
    "classes": 10247,
    "classes.loaded": 10247,
    
    ...
    
    "httpsessions.active": 0,
    "datasource.primary.active": 0,
    "datasource.primary.usage": 0
    
    Dosyć istotnym wskaźnikiem może się okazać na przykład liczba pracujących wątków.
  • trace

    Wyświetla informacje na temat ostatniego ruchu w naszej aplikacji:
    {
        "timestamp": 1554833146830,
        "info": {
            "method": "GET",
            "path": "/kurs-spring/spring-aop-aspectj",
            "headers": {
            "request": ... 
    
            ...
    
        response": {
            ...
            
            "Content-Type": "text/html;charset=UTF-8",
            "Content-Language": "en-US",
            "Transfer-Encoding": "chunked",
            "Date": "Tue, 09 Apr 2019 18:05:46 GMT",
            "status": "200"
            
         ...
    }
    
    
    
    Możemy podejrzeć w ten sposób żądania i odpowiedzi. Dostaniemy dzięki temu wiele cennych informacji, na przykład jaka przyszła odpowiedź na wywołanie konkretnego żądania. Pozwala to na szybką zdalną diagnozę ewentualnego problemu, o którym się dowiedzieliśmy.
  • env

    Wyświetla całą masę informacji o środowisku, w którym jest uruchomiona aplikacja, jak również konfigurację samej aplikacji:
    
    "profiles": [
        "user"
    ],
    
    ...
    
    applicationConfig: [classpath:/application.properties]": {
        "endpoints.sensitive": "true",
        "spring.http.multipart.max-file-size": "3MB",
        "logging.level.org.hibernate.type": "TRACE",
        "management.port": "8081 ",
        
        ...
        
    }
    
    Widzimy na przykład z jakimi profilami nasza aplikacja została uruchomiona, albo też jakie ustawienia posiada załadowany plik properties.
  • beans

    Wyświetla informacje o beanach jakie działają w aplikacji. Możemy nawet zobaczyć jaki jest scope danego beana:
    "beans": [
    {
        "bean": "application",
        "scope": "singleton",
        "type": ...,
        "resource": ...,
        "dependencies": [
            ...
        ]
    }
    
Oczywiście większość przedstawionych informacji zawiera dosyć istotne dane, dlatego powinniśmy zabezpieczyć nasze endpointy, co najmniej tak jak wspominaliśmy na początku rozdziału. O szerszych zabezpieczeniach piszemy w ostatnim paragrafie.

Teraz zobaczmy jak wygląda tworzenie własnego endpointa!

Własny endpoint

Przygotowanie customowego endpointa jest bardzo proste. Załóżmy, że mamy plik na dysku, którego zawartość musimy monitorować i z jakiegoś powodu chcemy to robić ręcznie. Wtedy wystarczy jedynie stworzyć klasę na wzór poniższej:
@Component
public class SourceFileCheckerEndpoint implements Endpoint<List<String>> {
     
    @Override
    public String getId() {
        return "sourcefilechecker";
    }
 
    @Override
    public boolean isEnabled() {
        return true;
    }
 
    @Override
    public boolean isSensitive() {
        return true;
    }
 
    @Override
    public List<String> invoke() {
        
        // Tutaj wywołamy logikę
        
        List<String> messages = new ArrayList<>();
        messages.add("Informacje do wyświetlenia, na przykład wielkość pliku");
        
        return messages;
    }
}   
Klasa to zwykły komponent Springa, a więc na jej podstawie bez problemu zostanie stworzony obiekt, który będzie dostępny z poziomu kontenera. Ważne jest, aby implementowała ona interfejs Endpoint oraz posiadała odpowiednio zaimplementowane metody tego interfejsu. Jedną z nich jest getId, która musi zwracać nazwę identyfikującą nasz endpoint. Po tej nazwie będziemy go wywoływać w przeglądarce:
Spring Boot Actuator - Własny endpoint

Dodatkowa konfiguracja Actuatora

Poza ustawieniami dotyczącymi portu oraz adresu, z którego możemy uruchomić usługę, Actuator posiada jeszcze kilka innych opcji konfiguracyjnych. Oczywiście wszystko ustawimy bez problemu z poziomu pliku application.properties.
  • endpoints.sensitive=true lub false

    Ustawia wszystkie endpointy jako wrażliwe (wymagające uwierzytelnienia) lub nie (na odwrót). Nazwę użytkownika oraz hasło możemy też ustawić z poziomu pliku application.properties:
    security.user.name=mojuser
    security.user.password=mojehaslo   
    
  • endpoints.<nazwa endpointa>.sensitive=true lub false

    Ustawia wybrany endpoint jako wrażliwy lub nie. Możemy na przykład najpierw ustawić wszystkie endpointy jako wrażliwe endpoints.sensitive=true, a następnie wyłączyć z tego endpoint, np. info za pomocą: endpoints.info.sensitive=false.
  • endpoints.enabled=true lub false

    Włącza lub wyłącza wszystkie endpointy.
  • endpoints.<nazwa endpointa>.enabled=true lub false

    Podobna zależność jak w przypadku wrażliwości.
Na koniec...
Zgodnie z tytułem rozdziału, wszystko co tutaj napisaliśmy jest oparte o Spring Boot-a w wersji 1.x. Jeśli interesują Cię zmiany, jakie zaszły w Actuatorze w Spring Boot 2 i 3, to zapraszamy do kolejnego rozdziału.
Zdjęcie autora
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Topowe Materiały
Spring IO: Spring Boot Actuator Web API Documentation
Baeldung: Spring Boot Actuator

Udemy: [NEW] Spring Boot 3, Spring 6 & Hibernate for Beginners  —  polskie napisy

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE