Aprende en este tutorial cómo integrar una aplicación Spring Boot en Pinpoint APM para monitorizar y medir su rendimiento.
0. Índice de contenidos
- Introducción
- Entorno
- Arrancando Pinpoint APM
- Integramos el agente en la aplicación
- Algunos ejemplos
- Visualización de Pinpoint APM con Spring Boot
- Conclusiones
- Enlaces y Referencias
1. Introducción
A medida que va pasando el tiempo en un proyecto es difícil evitar que el rendimiento de sus procesos empeore. Para tratar de evitar esto, vamos a exponer un ejemplo de integración de una aplicación basada en Spring Boot con un servidor de Pinpoint APM.
Pinpoint es un APM (Application Performance Management) que se encarga de gestionar el rendimiento y monitorización de las aplicaciones. Es una herramienta open-source que nos permite conocer los puntos críticos de tiempos donde se va nuestra aplicación.
Existen dos modos de integrar Pinpoint en nuestras aplicaciones:
- El modo manual que requiere desarrollar y acopla Pinpoint al código.
- El modo automático que obliga a que Pinpoint se ejecute sin problemas, lo cual puede ser un riesgo en producción para las aplicaciones.
Para este tutorial vamos a utilizar el modo automático que consiste en introducir un agente en nuestra aplicación Spring Boot. Este agente le envía información al colector del servidor de Pinpoint APM. Solo podemos indicar un agente por cada aplicación Spring Boot, por lo que si tenemos varias aplicaciones, en Spring Boot será necesario configurar más de un agente.
Pinpoint introduce interceptores al principio y al final de los métodos en el tiempo de carga de las clases. Mejora, por tanto, la accesibilidad por abstracción por cada línea de código que escribimos. Además, se puede identificar de forma unívoca una transacción entre diferentes sistemas que estuvieran conectados, dándonos suficiente traza sobre casuísticas problemáticas.
Puedes encontrar más información sobre Pinpoint en el tutorial de nuestro compañero José Manuel Sánchez.
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: MacBook Pro (2,5 GHz i7 4 núcleos, 16 GB 1600 MHz DDR3)
- Sistema Operativo: Mac OS X Catalina 10.15.3
- Entorno de desarrollo: InteiIJ Ultimate 2019.3
- Java 8 (jdk version 1.8.0_231)
- Maven (3.6.2)
- Docker Desktop (2.2.0.3) y docker-engine (19.03)
- Docker-compose (1.25.4)
- Git (2.23)
- Pinpoint-docker (1.8.5)
- Postman (7.3.3)
3. Arrancando Pinpoint APM
Vamos a arrancar el servidor Pinpoint con Docker y docker-compose. Para ello, vamos a descargarnos el código del servidor de GitHub y levantaremos mediante docker-compose todos los servicios necesarios para hacer funcionar el servidor de Pinpoint APM.
Clonamos el repositorio mediante el siguiente comando:
git clone https://github.com/naver/pinpoint-docker.git
Nos movemos a la última versión estable (en este caso el tag 1.8.5):
cd pinpoint-docker git checkout 1.8.5
Antes de arrancar, editamos el fichero docker-compose.yaml:
- Eliminamos el servicio pinpoint-quickstart
- Pinpoint trae de serie una aplicación demo con la que podemos jugar un rato, pero que nosotros no usaremos.
También editamos el fichero .env:
- Damos los siguientes valores a las variables:
- AGENT_ID=ProductAgentId
- APP_NAME=ProductApp
De esta forma dejamos configurado el servidor APM y levantamos Pinpoint con el siguiente comando (este paso puede tardar un poco):
docker-compose pull && docker-compose up
Cuando terminen de aparecer trazas, ya podemos navegar por su frontal introduciendo la siguiente URL en vuestro navegador favorito:
http://localhost:8079
Como era de esperar, aún no se puede visualizar ninguna aplicación, cosa que cambiará cuando terminemos el siguiente apartado.
4. Integramos el agente en la aplicación
Para realizar este tutorial voy a partir de una aplicación Spring Boot con una mínima funcionalidad de creación y lectura de productos. Nos la descargamos con el siguiente comando:
git clone https://github.com/asegnz/product-pinpoint
Compilamos el proyecto mediante Maven:
mvn clean install
Esta aplicación gestiona el alta y la lectura de una entidad Product. Para la persistencia disponemos de una base de datos PostgreSQL que levantamos con el siguiente comando:
docker-compose up
Abrimos otra terminal y podemos arrancar la aplicación como con cualquier aplicación basada en Spring Boot, utilizando el siguiente comando:
cd target && java -jar product-pinpoint-0.0.1-SNAPSHOT.jar
La aplicación arrancará pero antes tenemos que integrar un agente en la aplicación para que se comunique con el colector del servidor APM de Pinpoint. Sin el agente, nuestra aplicación no se puede comunicar con Pinpoint
Para ello, vamos a decirle a las opciones de java que tiene un agente que incluir. He desarrollado un pequeño script en bash que he llamado runWithAgent.sh para facilitar esta tarea. Este script realiza lo siguiente:
- Descarga los ejecutables jars de la versión más estable (1.8.5) del agente de pinpoint que son necesarios para integrar el agente en nuestra aplicación.
- Estos jars los guardan en la carpeta pinpoint_agent en la raíz de nuestro proyecto,
- Posteriormente le indicamos el jar del agente, el id del agente y el nombre que queramos denominar para nuestra aplicación, que además debe coincidir con lo que modificamos en el fichero .env del servidor Pinpoint APM.
- Pasamos estos parámetros de configuración a la máquina virtual java y ejecutamos el jar de nuestra aplicación Spring Boot.
Finalmente, ejecutamos el script que arranca nuestra aplicación cargando el agente.
./runWithAgent.sh
A continuación, recargamos la página localhost:8079 y Pinpoint ya nos muestra nuestra aplicación que depende de una base de datos PostgreSQL.
5. Algunos ejemplos
Realizamos con Postman (o cualquier otro cliente rest) una petición de creación de un producto. Hacemos una petición POST sobre http://localhost:8080/products con el siguiente cuerpo de ejemplo en formato Json:
{ "productName": "Camisa", "description": "Camisa blanca con botones azules", "price": 14.95, "quantity": 50 }
Recuperamos dicho producto con un GET sobre el id devuelto http://localhost:8080/products/1
Hemos realizado con éxito dos peticiones, una de creación y otra de recuperación de un producto. Vamos a visualizarlo en mayor detalle en el siguiente apartado
6. Visualización de Pinpoint APM con Spring Boot
Volvemos al servidor APM de Pinpoint (recordemos en localhost:8079) para ver la actividad de la aplicación de los últimos 20 minutos, donde vemos los sistemas implicados como los usuarios (nosotros), la aplicación ProductApp (basada en Spring Boot) y la base de datos PostgreSQL.
También vemos varias peticiones en el mapa de puntos en la parte derecha de la pantalla. Si los seleccionamos arrastrando con el botón izquierdo del ratón nos llevará a otra pantalla para ver el detalle de dichas peticiones. En la siguiente pantalla vamos a poder conocer el detalle del tiempo que hemos tardado en crear el producto.
En este detalle podemos conocer qué partes de la aplicación son más lentas, así como poder comparar el rendimiento al usar dos frameworks distintos. Además, podemos visualizar de forma cómoda la query que se realiza contra la base de datos.
7. Conclusiones
Para ser una herramienta open-source, Pinpoint ofrece una buena alternativa de uso frente a sus competidores de pago. Tiene una experiencia de usuario bastante sencilla, tanto que puede parecer simplona, pero para el día a día de un desarrollador nos puede valer. Veremos cómo evoluciona de aquí a un tiempo.
8. Enlaces y Referencias
- Código fuente de este tutorial
- Documentación de Pinpoint y Pinpoint-Docker