Midiendo trazabilidad con Grafana Tempo
Introducción
En los ultimos meses varios cambios significativos se dieron en el equipo y en la plataforma debido a la implementación paneles de monitoreo y recolección de metricas en algunos de nuestros servicios. Algunos de estos cambios llevaron a la detección de ataques maliciosos en nuestra infraestructura y mejoras significativas en el rendimiento de la plataforma tales como caidas, errores y alta disponibilidad.
Pero como ya saben nuestro producto está diseñado en una arquitectura distribuida la cual cada parte de la misma
tiene una finalidad especifica, con su propio repositorio, implementación de despliegues y código fuente, entonces
que pasa si queres tener visibilidad mediante metricas como tenemos implementado en apis la cual es nuestro
principal punto de entrada al backend de keeper?
Para lograr este objetivo aparecen los conceptos de Trazas y de Grafana Tempo.
Trazas
Una traza representa el viaje de una petición, acción, evento a traves de todos los nodos o partes
de una sistema distribuido. Estan compuestas por uno o más spans, un span es la unidad de trabajo de una
traza que posee un tiempo de inicio relativo al comienzo de la misma, duración y un nombre de operación.
Usualmente tiene una referencia al span padre y posee atributos clave/valor.
Una caracteristica de las trazas es que nunca están completas, siempre se puede agregar a una traza un
conjunto de spans aún si han pasado dias desde el ultimo registro.
Ejemplo
Un usuario ingresa su correo en un formulario para suscribirse, lo que genera un trace ID que sigue toda la cadena de procesos. Ese simple clic puede activar múltiples microservicios distribuidos.
Primero, un microservicio verifica el correo; si es válido, se guarda en la base de datos. Otro servicio lo anonimiza y le agrega metadatos antes de enviarlo a otro que evalúa si la solicitud es de una fuente relevante.
Cada servicio registra eventos con marcas de tiempo, generando trazabilidad completa. El proceso finaliza cuando ya no se agregan más acciones al trace ID.
Grafana Tempo
Grafana Tempo es una herramienta de código abierto para distributed tracing, diseñada para ser fácil de usar y escalar. Permite buscar trazas, generar métricas a partir de spans y vincular datos de trazabilidad con logs y métricas.
Para implementar un pipeline de tracing se necesitan 4 componentes:
-
Instrumentación del cliente: para capturar los eventos. -
Pipeline: para recolectar y procesar los datos. -
Backend: donde se almacenan y gestionan las trazas (por ejemplo, Grafana Tempo). -
Visualización: herramientas como Grafana para explorar y analizar los datos.

Instrumentación del cliente
La instrumentación del cliente es el primer paso para una pipeline de trazabilidad distribuida. Consiste en agregar puntos en la aplicación que generan y envían spans, permitiendo registrar el comportamiento de la app desde su origen.
Pipeline (Grafana Alloy)
Una vez instrumentada la aplicación, los traces se envían a un backend para su almacenamiento y visualización. Aunque muchas apps pueden enviar directamente a Tempo, se puede usar una tracing pipeline para bufferizar y reenviar spans, lo cual es más útil en sistemas grandes y complejos.
Grafana Alloy es un servicio que se despliega cerca de la app (en el mismo nodo o clúster) y se encarga de recoger rápidamente los traces y reenviarlos al backend. También maneja funciones como agrupamiento de traces y reintentos en caso de fallos.
Backend (Grafana Tempo)
Grafana Tempo es un backend de tracing distribuido, fácil de usar y altamente escalable. Se encarga de almacenar y consultar trazas bajo demanda, permitiendo analizar el recorrido completo de las solicitudes dentro de un sistema distribuido.
Visualización
La herramienta Grafana tiene implementado un datasource especifico de Tempo para visualizar las trazas recolectadas.
Manos a la obra
Vamos a implementar mediante containers de docker una implementación de Grafana Tempo la cual esta detallada en la documentación de Grafana https://grafana.com/docs/tempo/latest/getting-started/docker-example/

Continuara!

