Ir al contenido principal

Gestión del rendimiento (APM) y recolección de logs de aplicaciones Java con Elastic

En este post vamos a ver cómo cubrir dos necesidades de cualquier sistema en producción: la gestión del rendimiento de la aplicación (APM) y la recolección de logs para su posterior análisis. 


Mediante la gestión del rendimiento de la aplicación podemos analizar el tiempo de ejecución de cada operación ejecutada en nuestro microservicio, ya sean peticiones HTTP recibidas o tareas programadas. Además, podremos ver en detalle qué operaciones han consumido qué tiempo, así como detalles SQL de las transacciones lanzadas. 
Por otro lado, los mensajes de registro o logs de nuestras aplicaciones son una herramienta muy útil para una variedad de tareas. La mejor solución es centralizar los registros de todos los servicios y contenedores para, posteriormente, poder hacer búsquedas y análisis sobre estos. Una de las herramientas más utilizadas para este tipo de problemas es Elastic Stack, también conocido como ELK. 

 El objetivo de la monitorización de aplicaciones es minimizar el tiempo que se tarda en descubrir un problema y el tiempo que se tarda en recuperarse. Comprender lo que está sucediendo en nuestro código es el paso más importante para encontrar y eliminar la causa raíz de un problema. 

 Para desplegar esta PoC es necesario tener instalado Docker y docker-compose. 

 ¿Qué es ELK? 

 ELK es un acrónimo de una colección de tres proyectos de código abierto desarrollados por Elastic.co: Elasticsearch, Logstash y Kibana. ELK, también conocido como Elastic Stack, es una solución completa de análisis de registros de un extremo a otro que ayuda en la búsqueda profunda, el análisis y la visualización del registro generado desde diferentes máquinas/contenedores/servicios.

                           

Elasticsearch es un motor de análisis y búsqueda distribuido basado en la biblioteca Lucene. Proporciona una potente API basada en RESTful JSON, fácil de usar, escalable y resistente y almacena documentos sin esquema. Elasticsearch es el corazón de la pila ELK, almacena de forma centralizada sus registros.

Logstash es una canalización de procesamiento de datos (pipeline) del lado del servidor que ingiere datos de una multitud de fuentes simultáneamente, los analiza, los transforma y luego los envía a Elasticsearch. Logstash dispone de un conjunto de plugins para diferentes sistemas. Por ejemplo, existen plugins para transformar entradas de jdbc, kafka, log4j y otros registros.

Kibana es una herramienta de visualización flexible que consume datos almacenados en Elasticsearch. Con Kibana puedes crear gráficos de líneas, gráficos circulares, histogramas y más. 




Finalmente, Filebeat es un shipper o cargador ligero de código abierto para logs, escrito en Go y desarrollado por Elastic.co, la misma empresa que desarrolló ELK stack. Filebeat pertenece a un proyecto más grande llamado Beats y su propósito es enviar datos desde cientos o miles de máquinas y sistemas a Logstash, Kafka, Redis o Elasticsearch. 

Arquitectura

Todos los servicios utilizados en esta prueba de concepto se ejecutarán como contenedores Docker. Tenemos dos propósitos, por un lado la monitorización del rendimiento de la aplicación (APM) y por otro lado la persistencia de logs correlacionados. Por tanto, la arquitectura contará con distintos contenedores, uno de ellos será una aplicación Spring Boot. Esta aplicación será perfilada por un agente java proporcionado por Elastic.
El agente de Java recopilará y enviará métricas al servidor APM y luego el servidor APM transformará estas métricas y al final las enviará a Elasticsearch. Una vez que las métricas se almacenan en Elasticsearch, puedes explorar el rendimiento de la aplicación mediante el uso de paneles APM integrados de Kibana que se pueden encontrar en la pestaña "APM".

De forma predeterminada, la salida estándar de la aplicación Java se escribe en archivos json. 
Estos logs estarán en el contenedor de la aplicación Java, en la ruta /opt/app/logs/mysqlservice.log.
Filebeat escaneará archivos que coincidan con esta ruta, transformará los registros y luego los reenviará a Logstash. Logstash los filtrará, los transformará y finalmente los reenviará a Elasticsearch. Una vez que los registros se almacenan en Elasticsearch, podemos usar Kibana para crear paneles, buscar en los registros y todas las demás funciones compatibles con Kibana.

Podemos ver la arquitectura de la solución aquí descrita desde dos enfoques distintos. En cuanto a APM la arquitectura es la siguiente:


En cuanto a la recolección de logs, la arquitectura es la siguiente: 



Aplicación Spring Boot


La aplicación Java que se monitorizará es una aplicación Spring Boot 2. Usando Spring Boot, crearemos una API REST simple para gestionar usuarios que se almacenan en una base de datos MYSQL, la API proporcionará operaciones CRUD básicas para los datos de los usuarios.
Además de la API REST, la aplicación tendrá algunas tareas de fondo programadas. Estas tareas no tienen ninguna funcionalidad, están creadas solo para mostrar cómo podemos monitorizar las tareas en segundo plano utilizando la API pulbic del agente APM.

Endpoints REST:
  • GET / api / v1 / users / {userId}: devuelve un usuario con un ID específico o 404 si no se encontró el usuario
  • POST / api / v1 / users: crea un nuevo usuario. : {"name": "dsubires", "email": "dsubires@poc.com"}

Desplegar servicios


  1. git clone https://github.com/dsubires/poc-elk-spring-boot.git
  2. mvn package construye el proyecto
  3. docker-compose -f docker/docker-compose.yml up -d construye e inicia los contenedores
  4. docker-compose -f docker/docker-compose.yml ps comprueba el estado de los contenedores, debería haber 7 contenedores iniciados: 



Si el servicio APM Server no se inicia, es porque usa Elasticsearch y este tarda un poco en iniciarse. Para resolver esto, simplemente reinicia algunos contenedores usando este comando: docker-compose -f docker/docker-compose.yml restar apm user-microservice





Visualización mediante Kibana


¿Qué vamos a monitorizar para la parte APM? Los siguientes puntos:
  • Tiempo de las solicitudes HTTP entrantes
  • Rendimiento
  • Tiempo para las consultas MySQL
  • Tiempo para algún código personalizado y una tarea en segundo plano
Para poder obtener algunas métricas, es recomendable realizar algunas peticiones POST para crear usuarios y GET para recuperarlos.

Después de ejecutar algunas llamadas  HTTP, puedes usar Kibana accediendo a http://localhost:5601 y en la pestaña APM, verás una lista de servicios (agentes) con algunas métricas de rendimiento resumidas:




 En la pestaña "Logs" encontraremos los registros de nuestra aplicación;



Fuentes consultadas



Comentarios