En este post vamos a revisar el proceso de generación de trazas desde Quarkus para su posterior monitoreo, una consideración especial que para el proceso de Telemetria Quarkus tiene únicamente de manera nativa integrado los componentes de OpenTelemetry, de manera que vamos a utilizar este enfoque para explicar el manejo y monitoreo de Trazas.
En la era de los microservicios y las arquitecturas distribuidas, la observabilidad es clave para entender el comportamiento de nuestras aplicaciones. OpenTelemetry se ha convertido en un estándar para la instrumentación de aplicaciones, y Jaeger es una poderosa herramienta para la trazabilidad distribuida.
Con esta consideración vamos a utilizar de manera local el uso de la suit de jaeger para poder visualizar cada una de las peticiones que vamos a ir creando, en ambientes productivos podemos utilizar el mismo jaegar o una suit mas potente como es Elastic.
Utilizamos de referencia la documentación oficial de Quarkus: https://es.quarkus.io/guides/opentelemetry
Microservicio de referencia: https://gitlabce.austro.grpfin/laboratoriodigital/orchestrator/orchestrator-flowtracking
¿Qué es OpenTelemetry?
OpenTelemetry es un proyecto de código abierto que proporciona APIs, bibliotecas y agentes para la generación de datos de telemetría (trazas, métricas y logs) de aplicaciones. Su objetivo es estandarizar la observabilidad en diferentes lenguajes y plataformas.
¿Qué es Jaeger?
Jaeger es un sistema de trazabilidad de código abierto desarrollado por Uber Technologies. Permite monitorizar y solucionar problemas en sistemas distribuidos, proporcionando información detallada sobre el flujo de las solicitudes a través de los microservicios.
Requisitos Previos
- Java 11+
- Maven
- Docker (para ejecutar Jaeger)
- Docker compose
Configuración del Proyecto Quarkus
Agregar las dependencias de Quarkus:
Tanto en proyectos nuevos como en proyectos actuales para activar los paquetes de Telemetria utilizamos lo siguiente:
- Dependencia para activar Quarkus<dependency><groupId>io.quarkus</groupId><artifactId>quarkus-opentelemetry</artifactId></dependency>
- Dependencia para activar JDBC<dependency><groupId>io.opentelemetry.instrumentation</groupId><artifactId>opentelemetry-jdbc</artifactId></dependency>
- Dependencia para exportar las trazas a Jaeger<dependency><groupId>io.opentelemetry</groupId><artifactId>opentelemetry-extension-trace-propagators</artifactId></dependency>
Agregar las configuraciones en el Properties:
Debemos configurar los parametros necesarios para la activacion del uso de la Telemetria:
- quarkus.application.name=servicedemo (Nombre de nuestro micro)
- quarkus.otel.enabled=true (Activamos la telemetria del micro)
- quarkus.otel.propagators=tracecontext,baggage,jaeger,ottrace (Propagadores de la trazas)
- quarkus.datasource.{nombre}.jdbc.telemetry=true (Activamos la telemetria de la BD)
- quarkus.otel.exporter.otlp.traces.endpoint=http://localhost:4317 (Url del servicio de monitoreo como Jaeger)
Componetes listos en Quarkus:
Como pudimos observar con simples pasos hemos activado el proceso de telemetria en los microservicios, sin emabargo ahora la parte dificil viene a nivel de programacion, ya que Opentelemetry mapea automaticamente todos los CDI que estan definidos en el código, sin embargo, si el microservicio esta mal programado pues no vamos a poder visualizar de manera correcta.
Configuración de Jaeger local
Podemos utilizar la siguiente plantilla para levantar Jaeger:
Guardar lo siguiente en un archivo llamado: docker-compose.yml
version: «2»services:# Jaegerjaeger-all-in-one:image: jaegertracing/all-in-one:latestnetworks:mynetwork:ipv4_address: 192.168.17.10ports:- «16686:16686» # Jaeger UI- «14268:14268» # Receive legacy OpenTracing traces, optional- «4317:4317» # OTLP gRPC receiver- «4318:4318» # OTLP HTTP receiver, not yet used by Quarkus, optional- «14250:14250» # Receive from external otel-collector, optionalenvironment:- COLLECTOR_OTLP_ENABLED=truenetworks:mynetwork:driver: bridgeipam:driver: defaultconfig:- subnet: 192.168.17.0/24 Levantar jaeger: Nos ubicamos en la ruta donde tenemos el archivo docker-compose.yml y ejecutamos el siguiente comando:
- docker-compose up -d
Esto levantara el docker con lo necesario para Jaeger y podemos ingresar a la interfaz en el siguiente link:
- http://localhost:16686/
Probamos la telemetria
Arrancamos Quarkus:
Arrancamos Quarkus de manera local como lo hemos realizado normalmente con el comando:
- mvn quarkus:dev -DskipTests
Este automaticamente empezara a enviar trazas hacia el colector de Jaeger y podremos observar que el microservicio se ha conectado de manera correcta, buscandole en el apartado de servicios en la interfaz grafica:
Luego podemos buscar las trazas que hayamos creado utilizando los filtros que contiene la consola y presionando el boton buscar:
Podemos ver las trazas que hemos creado:
El detalle de cada traza:
Revisión de múltiples servicios
Si queremos revisar la integración de diferentes microservicios tenemos que realizar lo mismo que hicimos en cada uno de ellos y que apunten al mismo colector que se levanto de Jaeger, con esto el momento de buscar las trazas podemos observar la interacción entre todos ellos, como se ve en la siguiente imagen, cada microservicio corresponde a un color diferente.
Ok, y todo esto ¿para qué?
La implementación de OpenTelemetry en Quarkus y monitorear con Jaeger no solo mejora la visibilidad y el rendimiento de tu aplicación, sino que también fortalece la resiliencia y la capacidad de tu equipo para gestionar sistemas complejos. En última instancia, estos esfuerzos se traducen en una mejor experiencia para los usuarios finales y un entorno de desarrollo más eficiente y colaborativo. .
Beneficios de la Observabilidad
La observabilidad en sistemas distribuidos es crucial por varias razones:
Detección Proactiva de Problemas:
- Con herramientas como OpenTelemetry y Jaeger, puedes detectar problemas en tu aplicación antes de que afecten a los usuarios. La capacidad de monitorear y analizar las trazas te permite identificar rápidamente cuellos de botella, errores y comportamientos inesperados.
Trazabilidad de Solicitudes:
- En una arquitectura de microservicios, las solicitudes pueden atravesar múltiples servicios antes de completarse. Jaeger te permite rastrear el recorrido completo de una solicitud, proporcionando una visión detallada de su flujo y ayudándote a entender cómo interactúan tus servicios.
Mejora de la Experiencia del Usuario:
- Al identificar y resolver problemas de rendimiento y errores de manera eficiente, puedes mejorar la experiencia del usuario final. Una aplicación más rápida y confiable genera mayor satisfacción y retención de usuarios.
Optimización del Rendimiento:
- Las trazas te permiten ver cuánto tiempo tarda cada parte de tu aplicación en procesar una solicitud. Esto es útil para identificar servicios lentos y optimizarlos, mejorando así el rendimiento general de tu aplicación.
Facilidad en la Resolución de Problemas:
- Cuando ocurre un problema, la capacidad de seguir una traza completa facilita la identificación de la causa raíz. Esto reduce el tiempo que se necesita para solucionar problemas y permite que tu equipo se enfoque en el desarrollo de nuevas funcionalidades.