Spring Boot Actuator provee endpoints seguros para monitorear sus aplicaciones hechas con Spring Boot. Por defecto, todos los endpoints están asegurados, es decir no son accesibles públicamente. Este post pretende explicar a detalle como habilitar Spring Boot Actuator en sus aplicaciones.
Cuando ya tenemos una aplicación que esta corriendo en producción, es muy importante mantenernos al tanto de la salud de dicha aplicación y asegurarnos de que siempre este corriendo. En especial cuando son partes criticas de nuestro negocio que de no estar funcionando afectara directamente el éxito del negocio.
Tradicionalmente, antes de Spring Actuator, necesitábamos escribir código a mano para revisar la salud de nuestras aplicaciones basándonos en algunos criterios, pero con la llegada de Spring Actuator ya no es necesario escribir ese código nosotros mismos ya que este provee algunos endpoints listos para usarse y que son muy útiles para revisar la salud de la aplicación.
Dependencia
Para agregar la dependencia a nuestro proyecto maven, insertamos lo siguiente en el bloque de dependencias:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
Si su proyecto es nuevo, pueden generar uno con el famoso y controversial spring initializr, de la siguiente manera:
Cuando generamos el proyecto, y lo importamos en nuestro IDE favorito y lo corremos el resultado esperado es el siguiente:
Hay que notar la linea que dice:
2018-11-26 15:32:19.097 INFO 14850 --- [ restartedMain] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
Lo cual nos indica que nuestro actuator fue registrado con éxito y esta listo para ser consultado, navegando a la direccion: http://localhost:8080/actuator
Esta dirección nos indica los endpoints de monitoreo que están habilitados al momento de iniciar:
{ "_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 } } }
Sin embargo hay una lista mas grande de ednpoints:
ID | Descripción |
auditevents | Expone eventos de auditoria para la aplicación |
beans | Lista todos los beans registrados por la aplicación |
caches | Expone un listado de caches disponibles |
conditions | muestra las condiciones que fueron auto evaluadas en las clases de configuración y auto-configuración y las razones por las cuales no coincidieron. |
configprops | Una lista de todo lo que esta anotado con @ConfigurationProperties. |
env | Expone las propiedades en un ConfigurableEnvironment. |
flyway | Muestra todas las migraciones flyway que han sido aplicadas. |
health | Muestra información sobre la salud de la aplicación. |
httptrace | Muestra información de rastreo HTTP (por defecto de las ultimas 100 llamadas). |
info | Despliega información de la aplicación y el código fuente |
integrationgraph | Muestra el gráfico de integración de Spring |
loggers | Muestra y modifica los valores de los loggers configurados en la aplicación |
liquibase | Muestra migraciones Liquibase de bases de datos que se han aplicado. |
metrics | Muestra información de metricas de la aplicación en cuestión |
mappings | Muestra una lista de todos los paths anotados con @RequestMapping |
scheduledtasks | Despliega las tareas programadas de la aplicación. |
sessions | Permite obtener y borrar sesiones de usuario siempre y cuando sean sesiones de spring. No soporta sesiones de aplicaciones reactivas de spring |
shutdown | Permite que la aplicación se apague correctamente |
threaddump | Muestra información sobre los threads |
Habilitar Endpoints
Para habilitar o deshabilitar un endpoint, simplemente debemos agregarlo al application.properties del proyecto con la siguiente llave:
management.endpoint.<id>.enabled=<true|false>
También podemos especificar una lista separada por comas de los endpoints que necesitamos exponer a través de http:
management.endpoints.web.exposure.include=<lista de endpoints>
O bien podemos exponerlos todos (no recomendable para producción):
management.endpoints.web.exposure.include=*
O exponer algunos y excluir algunos otros:
management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=env,beans
Deshabilitar Endpoints
Para deshabilitar uno o todos los endpoints podemos usar cualquiera de las siguientes propiedades:
management.server.port=-1
O bien excluirlas todas:
management.endpoints.web.exposure.exclude=*
/health
Quizás uno de los endpoints mas importantes es el de health que nos indica si nuestra aplicación esta corriendo con normalidad, por defecto veremos una respuesta como esta:
{ "status":"UP" }
Si queremos podemos crear un indicador de salud acorde a nuestras necesidades con una clase como esta:
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; @Component public class CervezaHealthIndicator implements HealthIndicator { @Override public Health health() { int errorCode = 0; if (errorCode != 0) { return Health.down().withDetail("Error Code", errorCode).build(); } return Health.up().build(); } }
Simplemente hemos creado un nuevo indicador de salud llamado “cerveza” y es simple. si errorCode != 0 algo anda mal, de lo contrario muestra UP. Al consultar el endpoint /health se vera asi ahora:
{ "status":"UP", "details": { "cerveza" : "UP" } }
Conclusion
Spring Boot Actuator se convierte en un verdadero aliado a la hora de monitorear sus aplicaciones ya que ahorra mucho código que mantener y hace fácil saber el estado de sus aplicaciónes sin recurrir a herramientas de terceros que podrían ser costosas.