Introdução ao Grafana Tempo

Vamos aprender os fundamentos do Grafana Tempo, um back-end de rastreamento distribuído.

O rastreamento distribuído é a maneira de obter informações detalhadas sobre o desempenho do sistema. É uma forma de visualizar o ciclo de vida de uma requisição passando pela aplicação. O aplicativo pode consistir em vários serviços presentes em um único nó ou distribuídos entre os nós.

Portanto, usando rastreamento distribuído, você pode obter uma visão consolidada de todos os serviços. E o Grafana Tempo tem tudo a ver com isso.

O que é Grafana Tempo?

Houve algumas atualizações importantes do Grafana Labs na conferência ObservabilityCon deste ano, e o Grafana Tempo foi um deles. O Grafana Labs adicionou mais um projeto, “Grafana Tempo”, ao seu portfólio de código aberto.

Grafana Tempo é um back-end de rastreamento distribuído de código aberto que é altamente escalável e fácil de usar. O Tempo é totalmente compatível com outros protocolos de rastreamento, como Zipkin, Jaeger, OpenTelemetry e OpenCensus. Atualmente, suporta o mecanismo de descoberta de dados Tempo no Loki, monitorando plataformas como Prometheus e Grafana. Grafana 7.3+ oferece uma experiência perfeita entre Grafana e Tempo.

Por que usar Tempo?

Tempo é usado para correlacionar as métricas, rastreamentos e logs. Há situações em que um usuário recebe o mesmo tipo de erro várias vezes. Se eu quiser entender o que está acontecendo, precisarei examinar os rastros exatos. Mas, devido ao downsampling, algumas informações valiosas que eu poderia estar procurando foram perdidas. Com o Tempo, agora não precisamos reduzir a amostra dos dados de rastreamento distribuído. Podemos armazenar o rastreamento completo em armazenamento de objetos como S3 ou GCS, tornando o Tempo muito econômico.

Além disso, o Tempo permite uma depuração/solução de problemas mais rápida, permitindo que você passe rapidamente das métricas para os rastreamentos relevantes dos logs específicos que registraram alguns problemas.

  5 dicas para construir seu primeiro PC

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

  • Distribuidor: São usados ​​para configurar opções de recebimento para receber spans e depois enviá-los aos ingesters.
  • Ingester: São usados ​​para criar lotes de traces e enviá-los ao TempoDB para armazenamento.
  • Compactador: transmite blocos do armazenamento, como S3 ou GCS, combina-os e os grava de volta no armazenamento.
  • Armazenamento: usado para configurar o TempoDB. Você precisa mencionar o nome do back-end de armazenamento (S3 ou GCS) com outros parâmetros nesta configuração.
  • Memberlist: É usado para coordenação entre os componentes do Tempo.
  • Autenticação/Servidor: Tempo usa servidor Weaveworks/Common. Ele é usado para definir as configurações do servidor.

Arquitetura de tempo

O diagrama acima mostra a arquitetura de trabalho do Grafana Tempo.

Em primeiro lugar, o distribuidor recebe spans em diferentes formatos de Zipkin, Jaeger, OpenTelemetry, OpenCensus e envia esses spans para ingesters por hashing do trace ID. O Ingester então cria lotes de rastreamentos que são chamados de blocos.

Em seguida, ele envia esses blocos para o armazenamento de back-end (S3/GCS). Quando você tiver um ID de rastreamento que deseja solucionar, use Grafana UI e coloque o ID de rastreamento na barra de pesquisa. Agora o consultador é responsável por obter os detalhes do ingestor ou do armazenamento de objeto sobre o ID de rastreamento que você inseriu.

Em primeiro lugar, ele verifica se esse ID de rastreamento está presente no ingestor; se não o encontrar, ele verifica o back-end de armazenamento. Ele usa um endpoint HTTP simples para expor os rastreamentos. Enquanto isso, o compactador pega os blocos do armazenamento, combina-os e os envia de volta ao armazenamento para reduzir o número de blocos no armazenamento.

Configurar tempo usando o Docker

Nesta seção, configurarei o Grafana Tempo passo a passo usando o Docker. Em primeiro lugar, você precisa de um back-end Tempo, então configure uma rede docker.

[[email protected] ~]$ docker network create docker-tempo

Baixe o arquivo de configuração do Tempo.

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

Abaixo está a lista de opções de protocolo que você obtém:

  5 Melhor Software EHR/EMR para o Setor de Saúde

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

Usando o arquivo de configuração de tempo, execute um contêiner docker. Aqui eu estou escolhendo jaeger – Formato Thrift Compact (porta 6831) para envio dos traces.

[[email protected] ~]$ 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 você precisa executar um contêiner de consulta Tempo. Então, primeiro, baixe o arquivo de configuração de consulta de tempo.

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

Usando o arquivo de configuração de consulta de tempo, execute um contêiner docker.

[[email protected] ~]$ 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

Agora a IU do Jaeger estará acessível em http://localhost:16686, conforme mostrado abaixo.

Na barra de pesquisa, você pode adicionar o ID de rastreamento de um log que deseja solucionar e ele gerará os rastreamentos para você.

Executando um aplicativo de demonstração no Tempo

É hora de executar um exemplo de demonstração fornecido pelo Grafana Tempo. Vou executar um exemplo do docker-compose, portanto, se você estiver tentando o mesmo, deverá ter o docker-compose instalado em sua máquina.

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

Extraia-o para a pasta inicial e vá para o diretório docker-compose. Você encontrará vários exemplos de docker-compose; Estou usando o exemplo em que os dados de um aplicativo são armazenados localmente.

[[email protected] ~]$ cd tempo-master/example/docker-compose/
[[email protected] 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.

[[email protected] docker-compose]$ 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

Você pode ver, ele iniciou contêineres para Grafana, Loki, Tempo, Tempo-query e Prometheus.

[[email protected] docker-compose]$ 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

Você também pode acessar seu navegador e verificar se Grafana, Jaeger UI, Prometheus estão em execução.

  Os 10 piores sistemas operacionais

Agora, o gerador de carga sintética em execução dentro de um contêiner está gerando IDs de rastreamento que está colocando dentro do tempo. Execute o comando abaixo e você poderá visualizar os logs.

[[email protected] docker-compose]$ 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 você precisa passar para gerar rastreamentos.

Estou copiando um dos IDs de rastreamento e colocando-o na barra de pesquisa da IU do Jaeger.

Você pode ver que ele gerou com sucesso os rastreamentos relacionados ao ID de rastreamento que forneci.

Conclusão

Então isso foi tudo sobre Grafana Tempo. Vá em frente e comece a usar o Tempo para gerar rastreamentos para entender as métricas e os problemas em seus logs em detalhes.

Tudo está sendo capturado no Tempo, e você não perderá nenhum detalhe por causa do downsampling, que acontecia antes. Tempo é simples para um desenvolvedor ou equipe de produção entender a causa raiz dos erros ou avisos que podem ocorrer nos logs.