Erste Schritte mit Grafana Tempo

Grundlagen von Grafana Tempo: Ein Überblick

Lass uns die Kernelemente von Grafana Tempo erkunden, einem Backend für die verteilte Ablaufverfolgung.

Die verteilte Ablaufverfolgung dient dazu, detaillierte Einblicke in die Systemleistung zu gewinnen. Sie ermöglicht es, den Lebenszyklus einer Anfrage zu visualisieren, während diese die Anwendung durchläuft. Eine solche Anwendung kann aus mehreren Diensten bestehen, die sich auf einem einzelnen Knoten oder verteilt über verschiedene Knoten befinden.

Durch die Nutzung der verteilten Ablaufverfolgung erhält man somit eine einheitliche Darstellung aller beteiligten Dienste. Und genau hier setzt Grafana Tempo an.

Was ist Grafana Tempo?

Auf der diesjährigen ObservabilityCon gab es einige bemerkenswerte Ankündigungen von Grafana Labs, darunter auch Grafana Tempo. Grafana Labs hat mit „Grafana Tempo“ ein weiteres Projekt zu seinem Open-Source-Portfolio hinzugefügt.

Grafana Tempo ist ein Open-Source-Backend für die verteilte Ablaufverfolgung, das sich durch hohe Skalierbarkeit und Benutzerfreundlichkeit auszeichnet. Tempo ist vollständig kompatibel mit anderen Tracing-Protokollen wie Zipkin, Jaeger, OpenTelemetry und OpenCensus. Es unterstützt derzeit die Tempo Data Discovery Engine in Loki und überwacht Plattformen wie Prometheus und Grafana. Grafana 7.3+ bietet eine nahtlose Integration zwischen Grafana und Tempo.

Warum Tempo nutzen?

Tempo wird verwendet, um Metriken, Ablaufverfolgungen und Protokolle miteinander zu verknüpfen. Es gibt Situationen, in denen ein Benutzer wiederholt auf denselben Fehlertyp stößt. Um die Ursache zu verstehen, muss man sich die detaillierten Ablaufverfolgungen ansehen. Beim Downsampling würden jedoch wertvolle Informationen verloren gehen. Mit Tempo ist das Downsampling von Daten der verteilten Ablaufverfolgung nicht mehr notwendig. Man kann die vollständigen Ablaufverfolgungen in Objektspeichern wie S3 oder GCS speichern, was Tempo sehr kosteneffizient macht.

Zusätzlich beschleunigt Tempo die Fehlerbehebung, indem es ermöglicht, schnell von Metriken zu den entsprechenden Ablaufverfolgungen der spezifischen Protokolle zu springen, die Probleme aufgezeichnet haben.

Im Folgenden werden die in Tempo verwendeten Konfigurationsoptionen aufgeführt:

  • Distributor: Dient zur Konfiguration der Empfangsoptionen für Spans und deren Weiterleitung an die Ingester.
  • Ingester: Bilden Batches von Ablaufverfolgungen und senden diese zur Speicherung an TempoDB.
  • Compactor: Streamt Blöcke aus dem Speicher (z. B. S3 oder GCS), kombiniert sie und schreibt sie zurück in den Speicher.
  • Speicher: Hier wird TempoDB konfiguriert. Der Speicher-Backend-Name (S3 oder GCS) sowie andere Parameter werden hier angegeben.
  • Mitgliederliste: Wird zur Koordination zwischen den Tempo-Komponenten verwendet.
  • Authentifizierung/Server: Tempo nutzt Weaveworks/Common-Server zur Festlegung von Serverkonfigurationen.

Tempo-Architektur

Das Diagramm oben zeigt die Arbeitsweise von Grafana Tempo.

Zunächst empfängt der Distributor Spans in verschiedenen Formaten von Zipkin, Jaeger, OpenTelemetry, OpenCensus und sendet sie an die Ingester, indem er die Trace-ID hasht. Die Ingester erstellen dann Batches von Ablaufverfolgungen, die als Blöcke bezeichnet werden.

Diese Blöcke werden anschließend an den Backend-Speicher (S3/GCS) gesendet. Um eine bestimmte Ablaufverfolgungs-ID zu untersuchen, kann man die Grafana-Oberfläche nutzen und die ID in die Suchleiste eingeben. Der Abfrager ist dann zuständig, die Details dieser Ablaufverfolgungs-ID entweder aus dem Ingester oder dem Objektspeicher abzurufen.

Zuerst wird überprüft, ob die Ablaufverfolgungs-ID im Ingester vorhanden ist; wenn nicht, wird das Speicher-Backend durchsucht. Ein einfacher HTTP-Endpunkt wird genutzt, um die Traces bereitzustellen. Parallel dazu nimmt der Compactor Blöcke aus dem Speicher, kombiniert sie und schreibt sie zurück in den Speicher, um die Anzahl der Blöcke zu reduzieren.

Tempo mit Docker einrichten

In diesem Abschnitt wird die Einrichtung von Grafana Tempo mit Docker Schritt für Schritt erläutert. Zuerst benötigen wir ein Tempo-Backend, also wird ein Docker-Netzwerk erstellt.

docker network create docker-tempo

Danach wird die Tempo-Konfigurationsdatei heruntergeladen.

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

Unten ist eine Liste der verfügbaren Protokolloptionen:

Protokoll Port
OpenTelemetry 55680
Jaeger – Thrift Compact 6831
Jaeger – Binäre Thrift 6832
Jaeger – Thrift HTTP 14268
Jaeger – GRPC 14250
Zipkin 9411

Nun wird ein Docker-Container mit der heruntergeladenen Tempo-Konfigurationsdatei gestartet. Hier wird Jaeger – Thrift Compact-Format (Port 6831) zum Senden der Traces verwendet.

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

Jetzt ist es erforderlich, einen Tempo-Abfragecontainer zu starten. Dafür muss zuerst die Konfigurationsdatei für die Tempo-Abfrage heruntergeladen werden.

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

Mit der Konfigurationsdatei für die Tempo-Abfrage wird ein Docker-Container gestartet.

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

Die Jaeger-Benutzeroberfläche ist nun unter https://localhost:16686 erreichbar.

In der Suchleiste kann eine Ablaufverfolgungs-ID aus einem Protokoll eingegeben werden, um die entsprechenden Ablaufverfolgungen zu generieren.

Demo-Anwendung auf Tempo ausführen

Es ist an der Zeit, eine Demo-Anwendung von Grafana Tempo auszuführen. Hier wird ein Docker-Compose-Beispiel verwendet. Docker-Compose muss auf dem Rechner installiert sein.

Die ZIP-Datei von Grafana Tempo kann hier heruntergeladen werden: https://github.com/grafana/tempo

Die heruntergeladene Datei wird entpackt, und es wird in das Docker-Compose-Verzeichnis gewechselt. Dort befinden sich mehrere Beispiele für Docker-Compose, es wird das Beispiel verwendet, bei dem die Daten der Anwendung lokal gespeichert werden.

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

Mit dem folgenden Befehl wird der Stack gestartet.

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

Wie man sieht, wurden Container für Grafana, Loki, Tempo, Tempo-query und Prometheus gestartet.

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

Man kann im Browser überprüfen, ob Grafana, Jaeger UI und Prometheus ausgeführt werden.

Der synthetische Lastgenerator, der in einem Container läuft, erzeugt Ablaufverfolgungs-IDs und sendet sie an Tempo. Mit dem folgenden Befehl können die Protokolle angezeigt werden.

docker-compose logs -f synthetic-load-generator
Attaching to docker-compose_synthetic-load-generator_1
synthetic-load-generator_1 
| using params: 
--jaegerCollectorUrl https://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 

Dies sind die Trace-IDs, die zur Generierung von Traces verwendet werden können.

Eine der Trace-IDs wird kopiert und in die Suchleiste der Jaeger-Benutzeroberfläche eingefügt.

Die Ablaufverfolgungen für die angegebene Ablaufverfolgungs-ID wurden erfolgreich generiert.

Fazit

Dies war eine Einführung in Grafana Tempo. Man kann es zum Generieren von Ablaufverfolgungen nutzen, um Metriken und Probleme in Protokollen detailliert zu verstehen.

Mit Tempo werden alle Details erfasst, und es gehen keine Informationen durch Downsampling verloren, wie es früher der Fall war. Tempo ist ein nützliches Werkzeug für Entwickler- und Produktionsteams, um die Ursachen von Fehlern oder Warnungen in den Protokollen zu ermitteln.