Lernen wir die Grundlagen von Grafana Tempo, einem verteilten Tracing-Backend.
Verteilte Ablaufverfolgung ist der Weg, um detaillierte Informationen über die Systemleistung zu erhalten. Auf diese Weise können Sie den Lebenszyklus einer Anforderung visualisieren, die die Anwendung durchläuft. Die Anwendung kann aus mehreren Diensten bestehen, die auf einem einzelnen Knoten vorhanden oder auf mehrere Knoten verteilt sind.
Durch die Verwendung der verteilten Ablaufverfolgung erhalten Sie eine konsolidierte Ansicht aller Dienste. Und Grafana Tempo dreht sich alles darum.
What is Grafana Tempo?
Auf der diesjährigen ObservabilityCon-Konferenz gab es einige wichtige Updates von Grafana Labs, und Grafana Tempo war eine davon. Grafana Labs hat sein Open-Source-Portfolio um ein weiteres Projekt, "Grafana Tempo", erweitert.
Grafana Tempo ist ein Open-Source-Backend für die verteilte Ablaufverfolgung, das hochgradig skalierbar und einfach zu verwenden ist. Tempo ist vollständig kompatibel mit anderen Tracing-Protokollen wie Zipkin, Jaeger, OpenTelemetry, und OpenCensus. Derzeit unterstützt es die Tempo Data Discovery Engine in Loki und überwacht Plattformen wie z Prometheus und Grafana. Grafana 7.3+ bietet eine nahtlose Erfahrung zwischen Grafana und Tempo.
Why use Tempo?
Tempo wird verwendet, um die Metriken, Traces und Protokolle zu korrelieren. Es gibt Situationen, in denen ein Benutzer mehrmals dieselbe Art von Fehler erhält. Wenn ich verstehen will, was passiert, muss ich mir die genauen Spuren ansehen. Aber aufgrund von Downsampling wären einige wertvolle Informationen, nach denen ich suchen könnte, verloren gegangen. Mit Tempo müssen wir jetzt verteilte Tracing-Daten nicht mehr herunterrechnen. Wir können die komplette Spur in speichern Objektspeicher wie S3 oder GCS, was Tempo sehr kosteneffizient macht.
Außerdem ermöglicht Tempo Ihnen ein schnelleres Debuggen / Beheben von Problemen, indem Sie schnell von Metriken zu den relevanten Spuren der spezifischen Protokolle wechseln können, in denen einige Probleme aufgezeichnet wurden.
Nachfolgend finden Sie die in Tempo verwendeten Konfigurationsoptionen.
- Verteiler: Diese werden verwendet, um Empfangsoptionen für den Empfang von Bereichen zu konfigurieren und diese dann an die Ingester zu senden.
- Einnahme: Diese werden verwendet, um Stapel von Traces zu erstellen und diese zur Speicherung an TempoDB zu senden.
- Compactor: Es überträgt Blöcke aus dem Speicher wie S3 oder GCS, kombiniert sie und schreibt sie zurück in den Speicher.
- Storage: Hiermit wird TempoDB konfiguriert. Sie müssen den Namen des Speicher-Backends (S3 oder GCS) mit anderen Parametern in dieser Konfiguration angeben.
- Mitgliederliste: Es wird zur Koordination zwischen Tempo-Komponenten verwendet.
- Authentifizierung / Server: Tempo verwendet Weaveworks / Common Server. Es wird verwendet, um Serverkonfigurationen festzulegen.
Tempo Architecture
Das obige Diagramm zeigt die Arbeitsarchitektur von Grafana Tempo.
Erstens empfängt der Distributor Spans in verschiedenen Formaten von Zipkin, Jaeger, OpenTelemetry, OpenCensus und sendet diese Spans an die Ingester, indem er die Trace-ID hasht. Ingester erstellt dann Stapel von Traces, die als Blöcke bezeichnet werden.
Anschließend werden diese Blöcke an den Backend-Speicher (S3 / GCS) gesendet. Wenn Sie eine Trace-ID haben, die Sie beheben möchten, verwenden Sie die Grafana-Benutzeroberfläche und fügen die Trace-ID in die Suchleiste ein. Jetzt ist der Abfrager dafür verantwortlich, die Details der von Ihnen eingegebenen Trace-ID entweder vom Ingester oder vom Objektspeicher abzurufen.
Zunächst wird überprüft, ob diese Trace-ID im Ingester vorhanden ist. Wenn es nicht gefunden wird, überprüft es das Speicher-Backend. Es verwendet einen einfachen HTTP-Endpunkt, um die Traces verfügbar zu machen. In der Zwischenzeit nimmt der Verdichter die Blöcke aus dem Speicher, kombiniert sie und sendet sie zurück an den Speicher, um die Anzahl der Blöcke im Speicher zu verringern.
Setup Tempo using Docker
In diesem Abschnitt werde ich Grafana Tempo Schritt für Schritt mit einrichten Docker. Zunächst benötigen Sie ein Tempo-Backend. Richten Sie daher ein Docker-Netzwerk ein.
[geekflare@geekflare ~]$ docker network create docker-tempo
Laden Sie die Tempo-Konfigurationsdatei herunter.
[geekflare@geekflare ~]$ curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml
Unten finden Sie eine Liste der Protokolloptionen, die Sie erhalten:
Protokoll | Hafen |
Öffnen Sie die Telemetrie | 55680 |
Jaeger - Thrift Compact | 6831 |
Jaeger - Thrift Binary | 6832 |
Jaeger - Thrift HTTP | 14268 |
Jaeger - GRPC | 14250 |
Zipkin | 9411 |
Führen Sie mithilfe der Tempo-Konfigurationsdatei einen Docker-Container aus. Hier wähle ich Jaeger - Thrift Compact-Format (Port 6831) zum Senden der Traces.
[geekflare@geekflare ~]$ 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 müssen Sie einen Tempo-Abfragecontainer ausführen. Laden Sie also zuerst die Konfigurationsdatei für die Tempo-Abfrage herunter.
[geekflare@geekflare ~]$ curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml
Führen Sie mithilfe der Konfigurationsdatei für die Tempo-Abfrage einen Docker-Container aus.
[geekflare@geekflare ~]$ 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
Jetzt ist die Jaeger-Benutzeroberfläche unter verfügbar http://localhost:16686, Wie nachfolgend dargestellt.
In der Suchleiste können Sie die Ablaufverfolgungs-ID aus einem Protokoll hinzufügen, das Sie beheben möchten, und die Ablaufverfolgungen werden für Sie generiert.
Running a Demo Application on Tempo
Es ist Zeit, ein Demo-Beispiel von Grafana Tempo zu starten. Ich werde ein Docker-Compose-Beispiel ausführen. Wenn Sie also dasselbe versuchen, muss Docker-Compose auf Ihrem Computer installiert sein.
Laden Sie die Grafana Tempo-Zip-Datei herunter: https://github.com/grafana/tempo
Extrahieren Sie es in den Home-Ordner und gehen Sie zu Docker-komponieren Verzeichnis. Sie finden mehrere Beispiele für Docker-Compose. Ich verwende das Beispiel, in dem die Daten einer Anwendung lokal gespeichert werden.
[geekflare@geekflare ~]$ cd tempo-master/example/docker-compose/
[geekflare@geekflare docker-compose]$ ls
docker-compose.loki.yaml docker-compose.s3.minio.yaml docker-compose.yaml etc
example-data readme.md tempo-link.png
Führen Sie den folgenden Befehl aus, um den Stapel zu starten.
[geekflare@geekflare 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
Sie können sehen, es hat Container für Grafana, Loki, Tempo, Tempo-Abfrage und gestartet Prometheus.
[geekflare@geekflare 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
Sie können auch zu Ihrem Browser gehen und überprüfen, ob Grafana, Jaeger UI, Prometheus ausgeführt werden.
Jetzt generiert der synthetische Lastgenerator, der in einem Container läuft, Trace-IDs, die er in das Tempo einfügt. Führen Sie den folgenden Befehl aus, und Sie können die Protokolle anzeigen.
[geekflare@geekflare 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
Dies sind die Ablaufverfolgungs-IDs, die Sie übergeben müssen, um Ablaufverfolgungen zu generieren.
Ich kopiere eine der Trace-IDs und füge sie in die Jaeger-UI-Suchleiste ein.
Sie können sehen, dass die Traces für die von mir angegebene Trace-ID erfolgreich generiert wurden.
Fazit
Das war also alles über Grafana Tempo. Verwenden Sie Tempo, um Traces zu generieren, um die Metriken und Probleme in Ihrem System zu verstehen Protokolle im Detail.
Alles wird in Tempo erfasst, und Sie werden kein Detail verpassen, da früher ein Downsampling durchgeführt wurde. Tempo ist für Entwickler oder Produktionsteams unkompliziert, um die Hauptursache für die Fehler oder Warnungen zu verstehen, die in den Protokollen auftreten können.