Aprendamos los fundamentos de Grafana Tempo, un backend de rastreo distribuido.

El trazado distribuido es la forma de obtener información detallada sobre el rendimiento del sistema. Es una forma de visualizar el ciclo de vida de una solicitud que pasa por la aplicación. La aplicación puede consistir en múltiples servicios presentes en un único nodo o distribuidos a través de nodos.

Por lo tanto, al utilizar el rastreo distribuido, puede obtener una vista consolidada de todos los servicios. Y Grafana Tempo se ocupa de eso.

¿Qué es Grafana Tempo?

Hubo algunas actualizaciones importantes de Grafana Labs en la conferencia ObservabilityCon de este año, y Grafana Tempo fue una de ellas. Grafana Labs ha añadido un proyecto más, «Grafana Tempo», a su cartera de código abierto.

GrafanaTempo es un backend de rastreo distribuido de código abierto que es altamente escalable y fácil de usar. Tempo es totalmente compatible con otros protocolos de rastreo como Zipkin, Jaeger, OpenTelemetry y OpenCensus. Actualmente, es compatible con el motor de descubrimiento de datos Tempo en Loki, plataformas de monitorización como Prometheus y Grafana. Grafana 7.3 ofrece una experiencia sin fisuras entre Grafana y Tempo.

¿Por qué utilizar Tempo?

Tempo se utiliza para correlacionar las métricas, las trazas y los registros. Hay situaciones en las que un usuario está recibiendo el mismo tipo de error varias veces. Si quiero entender lo que está ocurriendo, tendré que mirar las trazas exactas. Pero debido a la reducción del muestreo, parte de la información valiosa que podría estar buscando se habría perdido. Con Tempo, ahora no necesitamos reducir el muestreo de los datos de rastreo distribuidos. Podemos almacenar la traza completa en almacenamiento de objetos como S3 o GCS, lo que hace que Tempo sea muy rentable.

Además, Tempo le permite una depuración/solución de problemas más rápida al permitirle pasar rápidamente de las métricas a las trazas relevantes de los registros específicos que han registrado algunos problemas.

A continuación se muestran las opciones de configuración utilizadas en Tempo.

  • Distribuidor: Se utilizan para configurar las opciones de recepción para recibir las trazas y luego enviarlas a los ingesters.
  • Ingester: Estos se utilizan para crear lotes de trazas y los envía a TempoDB para su almacenamiento.
  • Compactador: Transmite bloques desde el almacenamiento como S3 o GCS, los combina y los escribe de nuevo en el almacenamiento.
  • Almacenamiento: Se utiliza para configurar TempoDB. Necesita mencionar el nombre del backend de almacenamiento (S3 o GCS) con otros parámetros en esta configuración.
  • Lista de miembros: Se utiliza para la coordinación entre los componentes de Tempo.
  • Autenticación/Servidor: Tempo utiliza el servidor Weaveworks/Common. Se utiliza para establecer las configuraciones del servidor.

Arquitectura de Tempo

tempo architecture

El diagrama anterior muestra la arquitectura de funcionamiento de Grafana Tempo.

En primer lugar, el distribuidor recibe trazas en diferentes formatos de Zipkin, Jaeger, OpenTelemetry, OpenCensus y envía estas trazas a los ingesters mediante hashing del ID de la traza. A continuación, el ingester crea lotes de trazas que se denominan bloques.

Luego envía esos bloques al almacenamiento backend (S3/GCS). Cuando tenga un ID de traza que desee solucionar, utilizará la interfaz de usuario de Grafana y pondrá el ID de traza en la barra de búsqueda. Ahora el querier se encarga de obtener los detalles, ya sea del ingester o del almacenamiento de objetos, sobre el ID de traza que ha introducido.

En primer lugar, comprueba si ese ID de rastro está presente en el ingester; si no lo encuentra, entonces comprueba el backend de almacenamiento. Utiliza un simple punto final HTTP para exponer las trazas. Mientras tanto, el compactador toma los bloques del almacenamiento, los combina y los envía de vuelta al almacenamiento para reducir el número de bloques en el almacenamiento.

Configurar Tempo utilizando Docker

En esta sección, voy a configurar Grafana Tempo paso a paso utilizando Docker. En primer lugar, necesita un backend Tempo, así que configure una red docker.

[geekflare@geekflare ~]$ docker network create docker-tempo

Descargue el archivo de configuración de Tempo.

[geekflare@geekflare ~]$ curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml

A continuación se muestra la lista de opciones de protocolo que se obtiene:

Protocolo Puerto
Abierto Telemetría 55680
Jaeger – Compacto de ahorro 6831
Jaeger – Thrift Binario 6832
Jaeger – Thrift HTTP 14268
Jaeger – GRPC 14250
Zipkin 9411

Utilizando el archivo de configuración tempo, ejecute un contenedor docker. Aquí estoy eligiendo el formato Jaeger – Thrift Compact (puerto 6831) para enviar las trazas.

[geekflare@geekflare ~]$ docker run -d --rm -p 6831:6831/udp --name tempo -v $(pwd)/tempo-local.yaml:/etc/tempo-local.yaml --network docker-tempo grafana/tempo:latest -config.file=/etc/tempo-local.yaml

Ahora necesita ejecutar un contenedor de consulta tempo. Así que primero, descargue el archivo de configuración de la consulta tempo.

[geekflare@geekflare ~]$ curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml

Utilizando el archivo de configuración de tempo query, ejecute un contenedor docker.

[geekflare@geekflare ~]$ docker run -d --rm -p 16686:16686 -v $(pwd)/tempo-query.yaml:/etc/tempo-query.yaml --network docker-tempo grafana/tempo-query:latest --grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml

Ahora se podrá acceder a la interfaz de usuario de Jaeger en http://localhost:16686, como se muestra a continuación.

jaeger ui - geekflare

En la barra de búsqueda, puede añadir el ID de traza de un registro que desee solucionar, y generará las trazas por usted.

traceid - new

Ejecutar una aplicación de demostración en Tempo

Es hora de ejecutar un ejemplo de demostración dado por Grafana Tempo. Ejecutaré un ejemplo docker-compose, así que si está intentando lo mismo, debe tener docker-compose instalado en su máquina.

Descargue el archivo zip de Grafana Tempo: https://github.com/grafana/tempo

Extráigalo en la carpeta de inicio y vaya al directorio docker-compose. Encontrará múltiples ejemplos de docker-compose; yo estoy utilizando el ejemplo en el que los datos de una aplicación se almacenan localmente.

[geekflare@geekflare ~]$ cd tempo-master/example/docker-compose/
[geekflare@geekflare docker-compose]$ ls
docker-compose.loki.yaml docker-compose.s3.minio.yaml docker-compose.yaml etc
ejemplo-datos readme.md tempo-link.png

Ejecute el siguiente comando para iniciar la pila.

[docker-compose]$ docker-compose up -d
Iniciando docker-compose_prometheus_1 ... hecho
Iniciando docker-compose_tempo_1 ... hecho
Iniciando docker-compose_grafana_1 ... hecho
Iniciando docker-compose_tempo-query_1 ... hecho
Iniciando docker-compose_synthetic-load-generator_1 ... hecho

Como puede ver, ha iniciado contenedores para Grafana, Loki, Tempo, Tempo-query y Prometheus.

[geekflare@geekflare docker-compose]$ docker ps
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES
84cd557ce07b grafana/tempo-query:latest "/go/bin/query-linux..." hace 10 minutos Arriba 4 segundos 0.0.0.0:16686->16686/tcp docker-compose_tempo-query_1
f7cd9cf460d9 omnition/synthetic-load-generator:1.0.25 "./start.sh" hace 10 minutos Arriba 4 segundos docker-compose_synthetic-load-generator_1
6d9d9fbdb8f1 grafana/grafana:7.3.0-beta1 "/run.sh" hace 10 minutos Arriba 6 segundos 0.0.0.0:3000->3000/tcp docker-compose_grafana_1
d8574ea25028 grafana/tempo:latest "/tempo -config.file..." hace 10 minutos Arriba 6 segundos 0.0.0.0:49173->3100/tcp, 0.0.0.0:49172->14268/tcp docker-compose_tempo_1
5f9e53b5a09c prom/prometheus:latest "/bin/prometheus --c..." hace 10 minutos Arriba 6 segundos 0.0.0.0:9090->9090/tcp docker-compose_prometheus_1

También puede ir a su navegador y verificar si Grafana, Jaeger UI, Prometheus se están ejecutando.

grafana

prometheus

Ahora synthetic-load-generator ejecutándose dentro de un contenedor está generando ids de trazas que está poniendo dentro de tempo. Ejecute el siguiente comando y podrá ver los logs.

[docker-compose]$ docker-compose logs -f synthetic-load-generator
Adjuntando a docker-compose_synthetic-load-generator_1
generador-carga-sintética_1 
| utilizando los parámetros 
--jaegerCollectorUrl http://tempo:14268
generador-carga-sintética_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Iniciando generación de trazas para frontend de servicio, ruta /producto, 2880 trazas/hora
generador-carga-sintética_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Iniciando generación de trazas para frontend de servicio, ruta /carro, 14400 trazas/hora
generador-carga-sintética_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Iniciando generación de trazas para frontend de servicio, ruta /checkout, 480 trazas/hora
generador-carga-sintética_1 
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 17867942c5e161f2 for service frontend route /currency
generador-carga-sintética_1 
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 3d9cc23c8129439f for service frontend route /shipping
generador-carga-sintética_1 

Estos son los ids de traza que debe pasar para generar trazas.

traces new

Copio uno de los ids de traza y lo pongo en la barra de búsqueda de Jaeger UI.

traceid

Puede ver que ha generado con éxito las trazas relacionadas con el id de traza que le he proporcionado.

Conclusión

Así que eso fue todo sobre Grafana Tempo. Siga adelante y comience a utilizar Tempo para generar trazas para entender las métricas y los problemas en sus registros en detalle.

Todo se captura en Tempo, y no se perderá ningún detalle debido al downsampling, que solía ocurrir antes. Tempo resulta muy sencillo para un desarrollador o un equipo de producción comprender la causa raíz de los errores o advertencias que puedan aparecer en los registros.