Iniziare con Grafana Tempo

Impariamo i fondamenti di Grafana Tempo, un backend di tracciamento distribuito.

La traccia distribuita è il modo per ottenere informazioni granulari sulle prestazioni del sistema. È un modo per visualizzare il ciclo di vita di una richiesta che passa attraverso l’applicazione. L’applicazione potrebbe essere costituita da più servizi presenti su un singolo nodo o distribuiti tra i nodi.

Quindi, utilizzando il tracciamento distribuito, puoi ottenere una visione consolidata di tutti i servizi. E Grafana Tempo è tutto questo.

Cos’è Grafana Tempo?

Ci sono stati alcuni importanti aggiornamenti da Grafana Labs alla conferenza ObservabilityCon di quest’anno, e Grafana Tempo era uno di questi. Grafana Labs ha aggiunto un altro progetto, “Grafana Tempo”, al proprio portfolio open source.

Grafana Tempo è un backend di tracciamento distribuito open source altamente scalabile e facile da usare. Tempo è completamente compatibile con altri protocolli di tracciamento come Zipkin, Jaeger, OpenTelemetry e OpenCensus. Attualmente supporta il motore di scoperta dei dati Tempo in Loki, monitorando piattaforme come Prometheus e Grafana. Grafana 7.3+ offre un’esperienza senza soluzione di continuità tra Grafana e Tempo.

Perché usare Tempo?

Il tempo viene utilizzato per correlare le metriche, le tracce e i registri. Ci sono situazioni in cui un utente riceve lo stesso tipo di errore più volte. Se voglio capire cosa sta succedendo, dovrò guardare le tracce esatte. Ma a causa del downsampling, alcune preziose informazioni che potrei cercare si sarebbero perse. Con Tempo, ora non abbiamo bisogno di eseguire il downsampling dei dati di tracciamento distribuiti. Possiamo archiviare la traccia completa nell’object storage come S3 o GCS, rendendo Tempo molto conveniente.

Inoltre, Tempo ti consente un debugging/risoluzione dei problemi più rapido consentendoti di passare rapidamente dalle metriche alle tracce pertinenti dei registri specifici che hanno registrato alcuni problemi.

Di seguito sono riportate le opzioni di configurazione utilizzate in Tempo.

  • Distributore: vengono utilizzati per configurare le opzioni di ricezione per ricevere gli span e quindi inviarli agli ingester.
  • Ingester: vengono utilizzati per creare batch di tracce e inviarli a TempoDB per l’archiviazione.
  • Compattatore: esegue lo streaming di blocchi dallo storage come S3 o GCS, li combina e li riscrive nello storage.
  • Archiviazione: utilizzata per configurare TempoDB. Devi menzionare il nome del backend di archiviazione (S3 o GCS) con altri parametri in questa configurazione.
  • Memberlist: viene utilizzato per il coordinamento tra i componenti Tempo.
  • Autenticazione/Server: Tempo utilizza Weaveworks/server comune. Viene utilizzato per impostare le configurazioni del server.

Architettura Temporale

Il diagramma sopra mostra l’architettura di lavoro di Grafana Tempo.

In primo luogo, il distributore riceve span in diversi formati da Zipkin, Jaeger, OpenTelemetry, OpenCensus e invia questi span agli ingester eseguendo l’hashing dell’ID di traccia. Ingester crea quindi batch di tracce chiamate blocchi.

Quindi invia quei blocchi allo storage back-end (S3/GCS). Quando si dispone di un ID di traccia che si desidera risolvere, si utilizzerà l’interfaccia utente di Grafana e si inserirà l’ID di traccia nella barra di ricerca. Ora l’interrogante è responsabile di ottenere i dettagli dall’ingester o dall’object storage sull’ID di traccia immesso.

In primo luogo, controlla se quell’ID di traccia è presente nell’ingester; se non lo trova, controlla il back-end di archiviazione. Utilizza un semplice endpoint HTTP per esporre le tracce. Nel frattempo, il compattatore preleva i blocchi dal deposito, li combina e li rimanda al deposito per ridurre il numero di blocchi nel deposito.

Imposta il tempo usando Docker

In questa sezione, configurerò Grafana Tempo passo dopo passo utilizzando Docker. Innanzitutto, hai bisogno di un backend Tempo, quindi configura una rete docker.

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

Scarica il file di configurazione Tempo.

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

Di seguito è riportato l’elenco delle opzioni di protocollo che ottieni:

Protocollo
Porta
Apri la telemetria
55680
Jaeger – Compatto dell’usato
6831
Jaeger – Binario dell’usato
6832
Jaeger – HTTP di risparmio
14268
Jaeger – GRPC
14250
Zipkin
9411

Usando il file di configurazione del tempo, esegui un contenitore docker. Qui sto scegliendo Jaeger – Formato Thrift Compact (porta 6831) per inviare le tracce.

[[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

Ora devi eseguire un contenitore di query Tempo. Quindi, per prima cosa, scarica il file di configurazione della query tempo.

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

Usando il file di configurazione della query tempo, esegui un contenitore 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

Ora l’interfaccia utente di Jaeger sarà accessibile all’indirizzo http://localhost:16686, come mostrato di seguito.

Nella barra di ricerca, puoi aggiungere l’ID traccia da un registro che desideri risolvere e genererà le tracce per te.

Esecuzione di un’applicazione demo su Tempo

È ora di eseguire un esempio demo fornito da Grafana Tempo. Eseguirò un esempio di docker-compose, quindi se stai provando lo stesso, devi avere docker-compose installato sul tuo computer.

Scarica il file zip Grafana Tempo: https://github.com/grafana/tempo

Estrailo nella cartella home e vai alla directory docker-compose. Troverai più esempi di docker-compose; Sto usando l’esempio in cui i dati di un’applicazione sono archiviati 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

Esegui il comando seguente per avviare lo stack.

[[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

Puoi vedere, ha avviato i contenitori per 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

Puoi anche andare sul tuo browser e verificare se Grafana, Jaeger UI, Prometheus sono in esecuzione.

Ora il generatore di carico sintetico in esecuzione all’interno di un contenitore sta generando ID di traccia che sta inserendo nel tempo. Esegui il comando seguente e puoi visualizzare i registri.

[[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 

Questi sono gli ID di traccia che devi passare per generare tracce.

Sto copiando uno degli ID di traccia e lo sto inserendo nella barra di ricerca dell’interfaccia utente di Jaeger.

Puoi vedere che ha generato correttamente le tracce relative all’ID traccia che ho fornito.

Conclusione

Quindi era tutto su Grafana Tempo. Vai avanti e inizia a utilizzare Tempo per generare tracce per comprendere in dettaglio le metriche e i problemi nei tuoi registri.

Tutto viene catturato in Tempo e non perderai nessun dettaglio a causa del downsampling, che avveniva prima. Tempo è semplice per uno sviluppatore o un team di produzione per comprendere la causa principale degli errori o degli avvisi che potrebbero verificarsi nei log.