Retomando mi serie de miniposts sobre Spring Boot, hoy voy a explicar una funcionalidad muy interesante que podemos añadir fácilmente a cualquier aplicación Spring Boot, es Spring Boot Actuator, con el que podremos monitorizar e interactuar con nuestra aplicación.
Concepto:
Actuator es un subproyecto de Spring Boot que añade una serie de «endpoints» para monitorizar, auditar e incluso gestionar tu aplicación fácilmente. Como todo en Spring Boot, tiene una configuración por defecto y apenas tenemos que hacer nada para tenerlo funcionando desde el primer día (aparte de añadirlo en las librerías del proyecto, con maven o lo que corresponda).
En este post explicaré como añadir actuator a un proyecto Spring Boot, y comentaré algunos de sus endpoints y otras posibles personalizaciones. Como proyecto base he usado el que ya creé en el post sobre Spring Boot, lo podéis descargar de mi github, aquí.
Entorno usado:
Java JDK 1.8
Maven 3.2.1
Git 1.9.4
IDE Intellij 14 Ultimate version
Pasos:
1. Lo primero, editaremos nuestro pom.xml de maven, para añadir en nuestras dependencias el paquete «starter» de actuator:
... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ...
2. Y… ya está. Con esto, Spring Boot nos autoconfigura todos los endpoints de actuator con los parámetros por defecto. Para probarlo, arrancamos con ‘mvn spring-boot:run’ o desde la tool window de maven en Intellij, y accedemos, por ejemplo, a http://localhost:8080/health/ desde un navegador o cliente Rest. Nos devolverá un json como este:
{ "status": "UP" }
Por defecto tenemos varios endpoints disponibles para ver todo tipo de información, siempre devuelta en formato json:
– health: información del estado de la aplicación (muy básico, como vemos en el ejemplo).
– env: información de variables de entorno y propiedades.
– beans: beans registrados en el contexto de Spring.
– trace: trazas de los últimos accesos.
…
Para más información sobre los endpoints, podéis consultar la documentación oficial de Spring Boot.
En los siguientes pasos vamos a personalizar y cambiar alguna configuración de estos endpoints.
3. Cambiar la url base de todos los endpoints: Probablemente nos gustaría tener todos estos endpoints bajo una url común en plan http://localhost:8080/adminpath/el-endpoint-que-sea. Es muy fácil, simplemente creamos un fichero de propiedades bajo la carpeta ‘src/main/resources/’ (si no lo tenemos ya), y añadimos la siguiente propiedad:
management.contextPath=/actuator-admin
Si arrancamos ahora, y accedemos, por ejemplo, a http://localhost:8080/actuator-admin/env veremos que responde. Todos nuestros endpoints cuelgan ahora de /actuator-admin.
Se pueden modificar de esta manera también el puerto (management.port) y otros parámetros.
4. Endpoint ‘info’: este endpoint por defecto no devuelve nada. Está pensado para devolver información general de nuestra aplicación, como versión, nombre… lo que nosotros queramos. Podemos personalizarlo muy fácilmente, también mediante propiedades. Vamos a añadir las siguientes propiedades a nuestro application.properties:
... info.application.name=Spring Boot Series: actuator example app info.application.description=Example Spring Boot app with actuator, for my blog info.application.version=0.1.1
Arrancamos la aplicación, y accedemos a http://localhost:8080/actuator-admin/info. Nos devolverá un json tal que así:
{ "application": { "version": "0.1.1", "description": "Example Spring Boot app with actuator, for my blog", "name": "Spring Boot Series: actuator example app" } }
5. También podemos personalizar el endpoing ‘health’. Como veis, simplemente devuelve un ‘OK’, haciendo ciertas comprobaciones que tiene por defecto. Quizás nos interese comprobar cosas concretas a nuestra aplicación, como espacio libre en disco, testear si responde una base de datos… Para hacer esto, simplemente registramos un bean que herede de HealthIndicator. Por ejemplo:
package com.edwise.springbootseries.actuator.endpoints; // imports... @Component public class BetterHealthIndicator implements HealthIndicator { @Override public Health health() { FileManager.Status diskStatus = FileManager.checkStatus(); Health health = null; if (diskStatus.equals(FileManager.Status.OK)) { health = Health.up().build(); } else { health = Health.down().withDetail("diskStatus", diskStatus).build(); } return health; } }
En el código, lo que hacemos es llamar a un ‘checker’ de un manager ficticio, y según lo que nos devuelva, devolvemos que nuestra aplicación está ‘UP’, o que está ‘DOWN’, añadiendo el estado devuelto por el manager.
Ahora, el endpoint nos podría devolver algo como esto: (con un 503, además, no un 200).
{ "status": "DOWN", "diskStatus": "LOW" }
6. Por último, también podemos crear nuestro propio endpoint y añadirlo a actuator. Para ello registramos un bean que herede de AbstractEndpoint. Por ejemplo:
package com.edwise.springbootseries.actuator.endpoints; // imports... @Component public class BugsEndpoint extends AbstractEndpoint<List<Bug>> { @Autowired BugsService bugsService; public BugsEndpoint() { super("bugs"); } @Override public List<Bug> invoke() { return bugsService.getAllBugs(); } }
Heredamos de AbstractEndpoint, poniéndole como parámetro genérico lo que vaya a devolver el endpoint. implementamos el método ‘invoke‘, que es el que lo devolverá. Y en el constructor, llamando al constructor de AbstractEndpoint, le pasamos como parámetro la url que queremos para nuestro endpoint. Para el ejemplo, sería http://localhost:8080/actuator-admin/bugs
Y hasta aquí esta pequeña revisión de Spring Boot actuator. Os recomiendo que reviséis la documentación oficial, para más opciones y posibilidades.
Si queréis bajaros el proyecto de prueba completo, lo podéis bajar directamente de mi github, como siempre 🙂