Información y métricas de la aplicación con Spring Boot Actuator

Escrito por el , actualizado el .
java planeta-codigo programacion spring
Enlace permanente Comentarios

Desarrollar una aplicación no solo implica implementar su funcionalidad, esa aplicación ha de mantenerse funcionando en su entorno de producción. Monitorizar y disponer de información sobre el estado ayuda a mantenerla funcionando sin ninguna caída de servicio u obtener métricas para mejorar su funcionamiento. Entre las numerosas funcionalidades ofrecidas por Spring para las aplicaciones Java está Spring Boot Actuator que precisamente nos proporcionará métricas e información interesantes de serie pudiendo implementar nueva según la necesidades.

Spring

Java

Es conveniente tener monitorizado el estado de una aplicación para conocer si el servicio que ofrece está funcionando o en caso de que no conocerlo cuanto antes para restaurarlo además de conocer otra serie de métricas básicas como la cantidad de CPU que se está usando, la cantidad de memoria usada y libre, número de threads instanciados, espacio ocupado y libre en disco, actividad de entrada y salida ya sea de red o de disco, tiempo de inicio del sistema y de la aplicación. Otras métricas a nivel de aplicación que puede interesarnos conocer es número de usuarios conectados, número de sesiones, páginas vistas, sentencias SQL o transacciones ejecutadas, … que podemos obtener directamente desde la aplicación o combinándolo con otras herramientas como Google Analytics.

Monitorizar el estado de la aplicación nos permitirá conocer en poco tiempo si hay algo que va mal con la intención de restaurar el servicio con el menor tiempo de caída, también nos permitirá conociendo las métricas normales del servicio si hay algún parámetro fuera de los valores típicos como un consumo excesivo de CPU, memoria o disco, conociendo la normalidad podremos descubrir la anormalidad y después corregirla, cuanto antes sea descubierta más sencillo será determinar el cambio que la ha provocado.

Continuando la serie de artículos sobre Spring Boot y Spring Cloud comentaré la utilidad Spring Boot Actuator que precisamente proporciona métricas y permite monitorizar una aplicación. En un aplicación que use Spring Boot simplemente incluyendo la dependencia org.springframework.boot:spring-boot-starter-actuator se añadirán a la aplicación varios endpoints para consultar información. Hay varios, estos son solo algunos de la lista completa:

  • beans: permite conocer los beans de la aplicación.
  • configprops: muestra las propiedades de configuración.
  • env: muestra información de la clase ConfigurableEnvironment que incluye propiedades del sistema.
  • health: permite conocer si la aplicación está en funcionamiento.
  • info: muestra información arbitraria sobre la aplicación.
  • metrics: permite obtener los valores de las métricas.
  • trace: información de las últimas peticiones a la aplicación.

Salvo health e info los demás endpoints contienen información sensible y no son accesibles pudiendo requerir un usuario/contraseña según como se configure el permiso para su acceso. Con las propiedades de configuración booleanas endpoints.[endpoint].sensitive y endpoints.[endpoint].enabled se puede cambiar si el servicio se considera sensible y si está activado respectivamente. Para permitir el acceso sin restricciones a las métricas y habilitar el endpoint para detener la aplicación necesitaríamos establecer las siguientes propiedades de configuración:

1
2
3
4
5
6
7
8
9
endpoints:
    metrics:
        sensitive: false
    shutdown:
        enabled: true
        
management:
    port: 8090
    context-path: '/management'
application.yml

El endpoint info mostrará todas las propiedades con el patrón info.\* y con el plugin de Gradle com.gorylenko.gradle-git-properties también podremos conocer el commit y rama del código fuente del archivo .jar en ejecución. Se pueden implementar nuevos indicadores de salud escribiendo un componente de Spring que implemente la interfaz HealthIndicator. Con la propiedad de configuración management.context-path se puede cambiar el path usado para todos los endpoint de forma que no colisione con los propios de la aplicación. También se puede cambiar el puerto y dirección IP de la aplicación en el que se ofrecen los endpoints con las propiedad de configuración management.port y management.address y protegerlos con un cortafuegos. Dependiendo de la combinación de seguridad requerida y consideración de sensibilidad se muestra más información o solo información de estado.

Las métricas ofrecidas en el endpoint metrics por Spring Boot Actuator muestran información del sistema (memoria total, procesadores, tipo de inicio de aplicación y sistema, carga media, memoria usada, threads, clases cargadas y información del recolector de basura de Java), información de los datasource (número de conexiones establecidas y uso actual), métricas de las caches, usando Tomcat de las sesiones (actuales y máximas). Haciendo uso de los servicios de Spring CounterService y GaugeService se pueden establecer métricas relativas y absolutas en cualquier punto de la aplicación con la lógica que deseemos.

En la aplicación Spring Boot incluyendo la dependencia de Spring Boot Actuator en el archivo build.gradle del proyecto podemos acceder a los endpoints comentados en las URL según el puerto y contexto de la interfaz de administración.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
...

apply plugin: 'eclipse'
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'spring-boot'

mainClassName = 'io.github.picodotdev.blogbitix.springboot.Main'

...

repositories {
    mavenCentral()
    
    ...
}

dependencies {
    // Spring
    compile "org.springframework:spring-context:$versions.spring"
    compile "org.springframework:spring-jdbc:$versions.spring"
    compile "org.springframework:spring-tx:$versions.spring"
    compile("org.springframework.boot:spring-boot-starter:$versions.spring_boot") { exclude(group: 'ch.qos.logback') }
    compile("org.springframework.boot:spring-boot-starter-web:$versions.spring_boot") { exclude(group: 'ch.qos.logback') }
    compile("org.springframework.boot:spring-boot-starter-actuator:$versions.spring_boot") { exclude(group: 'ch.qos.logback') }
    compile "org.hibernate:hibernate-validator:$versions.hibernate_validator"
    
    ...
}

...
build.gradle

Spring Boot Actuator endpoint Health Spring Boot Actuator endpoint Env Spring Boot Actuator endpoint Metrics

Spring Boot Actuator endpoints health, env y metrics

Spring Boot Actuator es otro de los varios módulos disponibles en Spring Boot. Para conocer más en detalle cuales son sus posibilidades el libro Spring Boot in Action lo explica bastante bien, otro libro sobre Spring Boot es Spring Boot: Up and Running.

De cualquier modo conviene también tener automatizada la monitorización de las métricas. Con estos endpoints y una herramienta como Prometheus podemos visualizar gráficas generadas con los datos a lo largo del tiempo, con los datos visualizados de forma gráfica podremos ver rápidamente picos, cambios bruscos y tendencias en alguno de ellos o compararlos con tiempos pasados. Esta misma herramienta nos puede servir para enviar alertas y notificaciones o hacer consultas sobre los datos recolectados.

Con Uptime Robot y el endpoint health podemos monitorizar la aplicación y recibir notificaciones si en algún momento la aplicación deja de responder.

Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew run


Este artículo forma parte de la serie spring-cloud:

  1. Datos de sesión externalizados con Spring Session
  2. Aplicación Java autocontenida con Spring Boot
  3. Configuración de una aplicación en diferentes entornos con Spring Cloud Config
  4. Información y métricas de la aplicación con Spring Boot Actuator
  5. Registro y descubrimiento de servicios con Spring Cloud y Consul
  6. Aplicaciones basadas en microservicios
  7. Registro y descubrimiento de servicios con Spring Cloud Netflix
  8. Recargar sin reiniciar la configuración de una aplicación Spring Boot con Spring Cloud Config
  9. Almacenar cifrados los valores de configuración sensibles en Spring Cloud Config
  10. Tolerancia a fallos en un cliente de microservicio con Spring Cloud Netflix y Hystrix
  11. Balanceo de carga y resiliencia en un microservicio con Spring Cloud Netflix y Ribbon
  12. Proxy para microservicios con Spring Cloud Netflix y Zuul
  13. Monitorizar una aplicación Java de Spring Boot con Micrometer, Prometheus y Grafana
  14. Exponer las métricas de Hystrix en Grafana con Prometheus de una aplicación Spring Boot
  15. Servidor OAuth, gateway y servicio REST utilizando tokens JWT con Spring
  16. Trazabilidad en microservicios con Spring Cloud Sleuth
  17. Implementar tolerancia a fallos con Resilience4j
  18. Iniciar una aplicación de Spring Boot en un puerto aleatorio
  19. Utilizar credenciales de conexión a la base de datos generadas por Vault en una aplicación de Spring
  20. Microservicios con Spring Cloud, Consul, Nomad y Traefik
  21. Trazabilidad en servicios distribuidos con Sleuth y Zipkin
  22. Configuración de una aplicación con Spring Boot y configuración centralizada con Spring Cloud Config
Comparte el artículo: