viernes, 30 de octubre de 2020

Apache Camel: Control de trazas con Jaeger

 Hoy vamos a ampliar nuestro ejemplo de Apache Camel y vamos a incluir Jaeger. Pero antes de ver como debemos hacerlo, explicaremos un poco que es OpenTraicing y Jaeger. 

OpenTracing es, como ellos mismos se definen, una APIs e instrumentación para el rastreo distribuido, neutrales en cuanto a los proveedores. Y aunque la creo Uber ahora es open-source y tiene importantes compañías detrás.

OpenTracing quiere formar un lenguaje común en torno a lo que es una traza y cómo manejarla en nuestras aplicaciones. Y para entender su funcionamiento debemos entender antes varios conceptos:

  • Distributed Tracing: Es un método utilizado para perfilar y supervisar las aplicaciones. Nos ayuda a señalar dónde ocurren los fallos y qué es lo que causa el mal funcionamiento.
  • Span: Es el principal componente de una traza distribuida, que representa una unidad individual de trabajo realizada en un sistema distribuido. Estos encapsulan información de la aplicación.
  • Traza: Es un gráfico acíclico de Span. 
  • Tracer: Es la implementación de la API que recolectará los Span y los publicará.

Una traza se podría representar así:

Y si tenemos en cuenta el tiempo, con este otro gráfico:

Sabiendo esto, ya nos quedará más claro cuando digamos que Jaeger será un Tracer que nos permitirá recolectar la información de las trazas de nuestra aplicación y visualizarlas en un interfaz gráfica propia. 

Con lo cual ya podremos incorporar Jaeger a nuestro docker compose con la siguiente instrucción:

jaeger:
image: jaegertracing/all-in-one:latest
ports:
- "6831:6831"
- "16686:16686"

Una vez arranquemos, ya podremos acceder a su interfaz gráfica a través de la URL http://localhost:16686

Una vez que lo tenemos preparado, vamos a configurar nuestra aplicación. Esto lo podemos hacer con tres sencillos pasos:

  • Añadir la librería camel-opentracing-starter. El cual nos auto configurará nuestra aplicación Spring Boot para el uso de Open Tracing
  • Añadir la anotación @CamelOpenTracing en la clase principal. La cual habilitará el uso de Open Tracing. 
  • Añadir una implementación de OpenTracing, en este caso la Jaeger. A través de la librería io.jaegertracing:jaeger-client.
Además hay que crear la variable de entorno JAEGER_SERVICE_NAME para indicar de qué aplicación se  recopilan los datos.

Para ver mejor el ejemplo, vamos a probar dos métodos uno con JPA y otro de una versión anterior que usa el componente SQL. Realizaremos varias llamadas y posteriormente accederemos a Jaeger. A través de la UI seleccionaremos nuestra aplicación en el campo Service y pulsaremos el botón Search. En ese momento Jaeger nos mostrará cuales son llamadas que hemos realizado. 


Si seleccionamos alguna de las invocaciones, veremos con más detalles las partes de la misma. En este caso al ser métodos muy básicos, la traza es muy sencilla. 


Incluso puede seleccionar varias trazas y compararlas con un simple click:


Como podemos apreciar de una forma sencilla podemos recoger importante información sobre la aplicación. Esta información nos puede ayudar a por ejemplo a depurar el funcionamiento de un micro servicio y ver qué partes del mismo son un posible cuello de botella. 



No hay comentarios:

Publicar un comentario