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

Publicado por pico.dev el , actualizado el .
blog-stack java planeta-codigo programacion
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 aplicacion.
  • 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:

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.

Spring Boot Actuator endpoint Health
Spring Boot Actuator endpoint Env
Spring Boot Actuator endpoint 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.

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.

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 el comando ./gradlew run.