Noțiuni introductive cu Grafana Tempo

Să explorăm elementele de bază ale Grafana Tempo, o soluție backend pentru urmărirea distribuită.

Urmărirea distribuită oferă o perspectivă detaliată asupra performanței unui sistem. Permite vizualizarea parcursului unei solicitări prin întreaga aplicație, care poate include mai multe servicii, fie pe un singur server, fie răspândite pe mai multe.

Prin utilizarea urmăririi distribuite, obții o imagine unitară a tuturor serviciilor implicate. Exact aceasta este rațiunea de existență a Grafana Tempo.

Ce reprezintă Grafana Tempo?

La conferința ObservabilityCon din acest an, Grafana Labs a prezentat câteva actualizări semnificative, inclusiv lansarea Grafana Tempo. Astfel, Grafana Labs a adăugat un nou proiect, numit „Grafana Tempo”, în gama lor de produse open-source.

Grafana Tempo este o platformă backend de urmărire distribuită, open-source, caracterizată prin scalabilitate și ușurință de utilizare. Tempo este pe deplin compatibil cu diverse protocoale de urmărire, cum ar fi Zipkin, Jaeger, OpenTelemetry și OpenCensus. În prezent, platforma suportă motorul de descoperire a datelor Tempo în Loki, platforme de monitorizare precum Prometheus și Grafana. Grafana 7.3+ oferă o integrare perfectă între Grafana și Tempo.

De ce să alegi Tempo?

Tempo este util pentru a corela valori, urme și înregistrări de jurnal. Apare frecvent situația în care un utilizator întâmpină aceeași eroare repetat. Pentru a identifica cauza problemei, este necesar să se analizeze urmele specifice. Însă, din cauza reducerii eșantionării, informații valoroase pot fi omise. Cu Tempo, nu mai este necesară eșantionarea datelor de urmărire distribuite. Traseul complet poate fi stocat în spații de stocare ca S3 sau GCS, ceea ce face ca Tempo să fie o soluție economică.

Tempo permite o depanare mai rapidă, oferind posibilitatea de a comuta rapid de la valori la urmele relevante din jurnale care au consemnat anumite probleme.

Mai jos sunt prezentate opțiunile de configurare utilizate în Tempo:

  • Distribuitor: Utilizează opțiunile de recepție pentru a colecta intervale și a le trimite către procesatorii de date (ingesteri).
  • Ingester: Creează loturi de urme și le transmite către TempoDB pentru a fi stocate.
  • Compactor: Prelucrarea fluxului de date din stocare (de exemplu, S3 sau GCS), combinarea acestora și rescrierea înapoi în stocare.
  • Stocare: Configurează TempoDB. Aici trebuie specificat numele sistemului de stocare (S3 sau GCS), alături de alți parametri.
  • Listă de membri: Coordonează interacțiunea dintre componentele Tempo.
  • Autentificare/Server: Tempo utilizează serverul Weaveworks/Common. Este folosită pentru a configura setările serverului.

Arhitectura Tempo

Schema de mai sus ilustrează arhitectura de lucru a Grafana Tempo.

În primul rând, distribuitorul colectează intervale de date în diferite formate de la Zipkin, Jaeger, OpenTelemetry și OpenCensus, iar apoi le transmite către procesatorii de date (ingesteri) utilizând un sistem de hashing al ID-ului de urmărire. Ingesterii asamblează urmele în loturi, denumite blocuri.

Aceste blocuri sunt trimise către stocarea backend (S3/GCS). Pentru depanare, atunci când introduci un ID de urmărire în interfața Grafana, interogatorul este responsabil pentru a obține datele fie de la ingester, fie din stocarea obiectelor.

Inițial, verifică prezența ID-ului de urmărire în ingester; dacă nu îl găsește, caută în stocarea backend. Utilizează un endpoint HTTP simplu pentru a expune urmele. Între timp, compactorul colectează blocurile din stocare, le combină și le returnează în stocare pentru a reduce numărul total de blocuri.

Instalarea Tempo folosind Docker

În această secțiune, voi explica pas cu pas cum se instalează Grafana Tempo utilizând Docker. Pentru început, creează o rețea docker pentru a găzdui backend-ul Tempo.

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

Descarcă fișierul de configurare pentru Tempo.

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

Lista de protocoale suportate este următoarea:

Protocol
Port
Open Telemetry
55680
Jaeger – Thrift Compact
6831
Jaeger – Thrift Binary
6832
Jaeger – Thrift HTTP
14268
Jaeger – GRPC
14250
Zipkin
9411

Utilizând fișierul de configurare, pornește un container docker. În acest exemplu, voi alege formatul Jaeger – Thrift Compact (port 6831) pentru a trimite urmele.

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

Acum este necesar să pornești un container pentru interogările Tempo. Pentru aceasta, descarcă fișierul de configurare corespunzător.

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

Utilizând fișierul de configurare pentru interogări, pornește un container 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

Interfața Jaeger devine accesibilă la adresa http://localhost:16686, conform exemplului de mai jos.

În bara de căutare, introdu ID-ul de urmărire al jurnalului pe care dorești să îl analizezi, iar acesta va genera urmele corespunzătoare.

Testarea cu o Aplicație Demo pe Tempo

A sosit timpul să testăm Grafana Tempo cu o aplicație demo. Voi folosi un exemplu docker-compose. Pentru a urma același procedeu, asigură-te că ai docker-compose instalat pe sistem.

Descarcă fișierul zip Grafana Tempo de aici: https://github.com/grafana/tempo

Extrage arhiva în folderul tău personal și navighează la directorul docker-compose. Vei observa mai multe exemple de docker-compose; eu voi folosi exemplul unde datele aplicației sunt stocate local.

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

Rulează următoarea comandă pentru a porni setul de containere.

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

După cum poți vedea, au fost pornite containerele pentru Grafana, Loki, Tempo, Tempo-query și 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

Poți accesa interfața web și verifica dacă Grafana, Jaeger UI, și Prometheus sunt operaționale.

În acest moment, generatorul de sarcină sintetică, rulează într-un container, creează ID-uri de urmărire și le trimite către Tempo. Rulează următoarea comandă pentru a vizualiza jurnalele.

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

Acestea sunt ID-urile de urmărire pe care le vei utiliza pentru a genera urmele.

Copiază unul dintre aceste ID-uri și introdu-l în bara de căutare a interfeței Jaeger UI.

După cum poți vedea, a generat cu succes urmele asociate ID-ului de urmărire furnizat.

Concluzie

Acesta este un rezumat al Grafana Tempo. Începe să folosești Tempo pentru a genera urmele și a înțelege în detaliu valorile și problemele din jurnale.

În Tempo, totul este înregistrat, astfel că nu vei pierde niciun detaliu important din cauza reducerii eșantionării, cum se întâmpla anterior. Tempo facilitează identificarea cauzei principale a erorilor sau a avertismentelor care pot apărea în jurnale, simplificând procesul pentru dezvoltatori și echipele de producție.