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.

 

Tagged in:

, ,