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.