Domine o Grafana Tempo: Guia Completo de Rastreamento Distribuído

Foto do autor

By luis

Vamos explorar os fundamentos do Grafana Tempo, uma solução de back-end para rastreamento distribuído.

O rastreamento distribuído é uma técnica essencial para obter informações aprofundadas sobre o desempenho de um sistema. Ele permite visualizar o ciclo de vida de uma requisição ao percorrer uma aplicação, que pode ser composta por vários serviços, tanto em um único nó quanto distribuídos por diversos nós.

Através do rastreamento distribuído, obtemos uma visão unificada de todos os serviços envolvidos, e é nesse contexto que o Grafana Tempo se destaca.

O que é o Grafana Tempo?

Na conferência ObservabilityCon deste ano, o Grafana Labs apresentou algumas atualizações importantes, e o Grafana Tempo foi uma delas. O Grafana Labs expandiu seu portfólio de código aberto com o projeto “Grafana Tempo”.

Grafana Tempo é um back-end de rastreamento distribuído de código aberto, projetado para alta escalabilidade e facilidade de uso. Ele oferece compatibilidade total com protocolos de rastreamento como Zipkin, Jaeger, OpenTelemetry e OpenCensus. Atualmente, o Tempo suporta a descoberta de dados no Loki, com integração a plataformas de monitoramento como Prometheus e Grafana. A partir do Grafana 7.3, a experiência de uso entre Grafana e Tempo é totalmente integrada e fluida.

Por que utilizar o Tempo?

O Tempo é fundamental para correlacionar métricas, rastreamentos e logs. Em situações onde um usuário enfrenta o mesmo erro repetidamente, é crucial analisar os rastros exatos para entender a causa. Sem o Tempo, o downsampling de dados poderia levar à perda de informações valiosas. Com o Tempo, podemos armazenar os rastreamentos completos em armazenamentos de objetos como S3 ou GCS, tornando-o uma solução econômica.

Além disso, o Tempo acelera a depuração e a solução de problemas, permitindo navegar rapidamente das métricas para os rastreamentos e logs relevantes, que podem indicar problemas específicos.

Abaixo estão as opções de configuração utilizadas no Tempo:

  • Distribuidor: Responsável por receber spans e enviá-los para os ingesters.
  • Ingester: Agrupa traces em lotes e os envia para o TempoDB para armazenamento.
  • Compactador: Lê blocos de armazenamento (S3 ou GCS), os combina e os grava de volta para o armazenamento, otimizando o espaço.
  • Armazenamento: Define o TempoDB, especificando o back-end de armazenamento (S3 ou GCS) e outros parâmetros.
  • Memberlist: Garante a coordenação entre os componentes do Tempo.
  • Autenticação/Servidor: O Tempo utiliza o servidor Weaveworks/Common, permitindo configurações específicas.

Arquitetura do Tempo

O diagrama acima ilustra a arquitetura de operação do Grafana Tempo.

Inicialmente, o distribuidor recebe spans de diferentes formatos, como Zipkin, Jaeger, OpenTelemetry e OpenCensus, e os encaminha para os ingesters através do hash do ID do trace. O Ingester então agrupa esses rastreamentos em blocos.

Esses blocos são enviados para o armazenamento de back-end (S3/GCS). Ao precisar solucionar um problema com um ID de rastreamento, você utiliza a interface do Grafana para inseri-lo na barra de pesquisa. O consultor busca os detalhes desse ID no ingestor ou no armazenamento de objetos.

Primeiramente, verifica se o ID está no ingestor; caso contrário, busca no armazenamento de back-end. Os rastreamentos são expostos via um endpoint HTTP simples. Enquanto isso, o compactador agrupa e reenvia blocos do armazenamento para reduzir o número de blocos.

Configurando o Tempo com Docker

Nesta seção, vamos configurar o Grafana Tempo passo a passo utilizando o Docker. O primeiro passo é configurar uma rede docker para o back-end Tempo.

docker network create docker-tempo

Em seguida, baixe o arquivo de configuração do Tempo.

curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml

Abaixo, listamos os protocolos suportados:

Protocolo Porta
OpenTelemetry 55680
Jaeger – Thrift Compact 6831
Jaeger – Thrift Binário 6832
Jaeger – Thrift HTTP 14268
Jaeger – GRPC 14250
Zipkin 9411

Utilizando o arquivo de configuração, execute um contêiner docker. Para o envio de traces, escolhi o formato Jaeger – Thrift Compact (porta 6831).

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

Agora, execute um contêiner de consulta Tempo. Baixe o arquivo de configuração de consulta.

curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml

Com o arquivo de configuração, execute o contêiner docker.

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

A interface do Jaeger estará acessível em http://localhost:16686, como mostrado abaixo.

Na barra de pesquisa, insira o ID do rastreamento para gerar os rastreamentos correspondentes.

Executando um aplicativo de demonstração no Tempo

Vamos executar um exemplo de demonstração fornecido pelo Grafana Tempo. Utilizaremos o docker-compose, então, certifique-se de que ele esteja instalado.

Baixe o arquivo zip do Grafana Tempo: https://github.com/grafana/tempo

Extraia para sua pasta inicial e navegue até o diretório docker-compose. Existem vários exemplos de docker-compose; usaremos o que armazena dados localmente.

cd tempo-master/example/docker-compose/
ls
docker-compose.loki.yaml docker-compose.s3.minio.yaml docker-compose.yaml etc
example-data readme.md tempo-link.png

Execute o comando abaixo para iniciar a pilha.

docker-compose up -d
Starting docker-compose_prometheus_1 ... done
Starting docker-compose_tempo_1 ... done
Starting docker-compose_grafana_1 ... done
Starting docker-compose_tempo-query_1 ... done
Starting docker-compose_synthetic-load-generator_1 ... done

Contêineres para Grafana, Loki, Tempo, Tempo-query e Prometheus foram iniciados.

docker ps
CONTAINER ID   IMAGE                                      COMMAND                  CREATED          STATUS         PORTS                                                                                                      NAMES
84cd557ce07b   grafana/tempo-query:latest                 "/go/bin/query-linux…"   10 minutes ago   Up 4 seconds   0.0.0.0:16686->16686/tcp                                                                                   docker-compose_tempo-query_1
f7cd9cf460d9   omnition/synthetic-load-generator:1.0.25   "./start.sh"             10 minutes ago   Up 4 seconds                                                                                                              docker-compose_synthetic-load-generator_1
6d9d9fbdb8f1   grafana/grafana:7.3.0-beta1                "/run.sh"                10 minutes ago   Up 6 seconds   0.0.0.0:3000->3000/tcp                                                                                     docker-compose_grafana_1
d8574ea25028   grafana/tempo:latest                       "/tempo -config.file…"   10 minutes ago   Up 6 seconds   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…"   10 minutes ago   Up 6 seconds   0.0.0.0:9090->9090/tcp                                                                                     docker-compose_prometheus_1

Acesse seu navegador para verificar se Grafana, Jaeger UI e Prometheus estão em execução.

O gerador de carga sintética está criando IDs de rastreamento dentro do Tempo. Visualize os logs com o comando abaixo:

docker-compose logs -f synthetic-load-generator
Attaching to docker-compose_synthetic-load-generator_1
synthetic-load-generator_1
| using params:
--jaegerCollectorUrl http://tempo:14268
synthetic-load-generator_1
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /product, 2880 traces/hr
synthetic-load-generator_1
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /cart, 14400 traces/hr
synthetic-load-generator_1
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /checkout, 480 traces/hr
synthetic-load-generator_1
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 17867942c5e161f2 for service frontend route /currency
synthetic-load-generator_1
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 3d9cc23c8129439f for service frontend route /shipping
synthetic-load-generator_1 

Estes são os IDs de rastreamento que serão usados para gerar os rastreamentos.

Copie um dos IDs e insira-o na barra de pesquisa da interface do Jaeger.

Os rastreamentos relacionados ao ID de rastreamento fornecido foram gerados com sucesso.

Conclusão

Este foi um panorama sobre o Grafana Tempo. Agora você pode começar a usar o Tempo para gerar rastreamentos e entender as métricas e problemas em seus logs com detalhes.

O Tempo captura todos os detalhes sem perdas por downsampling. Desenvolvedores e equipes de produção podem identificar a causa raiz de erros e avisos nos logs com maior facilidade.