Integración de Pinpoint APM con Spring Boot

0
1246
imagen de cuadro de mandos de una base militar

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

  1. Introducción
  2. Entorno
  3. Arrancando Pinpoint APM
  4. Integramos el agente en la aplicación
  5. Algunos ejemplos
  6. Visualización de Pinpoint APM con Spring Boot
  7. Conclusiones
  8. 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 
}

imagen que muestra un POST de un producto cuya respuesta nos devuelve el id 1Recuperamos dicho producto con un GET sobre el id devuelto http://localhost:8080/products/1

imagen que muestra un GET del producto que anteriormente hemos creado

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

imagen del frontal de Pinpoint donde se observan 3 peticiones realizadas, destacando la línea temporal donde elegimos ‘últimos 20 minutos’ y el mapa de puntos mencionado

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. 

imagen donde se visualiza el detalle de una transacción, así como el tiempo por cada método

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. 

imagen donde se describe la sentencia SQL introducida a 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

 

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad