RousselTMLEARNING

Observabilité

Grafana Tempo : le backend de traces distribuées à grande échelle

Comprendre le tracing distribué et Grafana Tempo : traces, spans, TraceID, architecture (distributor, ingester, querier, compactor), stockage objet, comparaison avec Jaeger et Zipkin.

1. Le tracing distribué en bref #

Suivre une requête à travers les services.

Traces, spans et contexte #

Dans une architecture de microservices, une requête utilisateur traverse souvent des dizaines de services. Une trace représente le trajet complet de cette requête ; elle est composée de spans, chacun correspondant à une opération (appel HTTP, requête SQL, traitement interne) avec une durée, des attributs et un statut. Tous les spans d'une trace partagent le même TraceID, propagé d'un service à l'autre dans les en-têtes (traceparent W3C).

Anatomie d'une trace distribuée
Le chemin critique est la plus longue chaîne de spans : c'est là qu'on gagne du temps.
# En-tête W3C propagé entre les services
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
#            ver  <------- trace-id (16 octets) -----> <-span-id-> flags

2. Pourquoi Tempo ? #

Un backend simple et économique.

La philosophie #

Grafana Tempo ne nécessite qu'un stockage objet (S3, GCS, Azure Blob, MinIO) : pas de base de données à gérer, pas d'index lourd. On retrouve une trace par son TraceID ou en la cherchant avec TraceQL sur les attributs. Il accepte de nombreux protocoles : OTLP, Jaeger, Zipkin.

CritèreGrafana TempoJaegerZipkin
StockageObjet (S3, GCS, Azure) ou localElasticsearch, Cassandra, OpenSearchElasticsearch, Cassandra, MySQL
Coût à grande échelleTrès faibleMoyen à élevéMoyen
Langage de requêteTraceQLFiltres UI/APIFiltres UI/API
Intégration GrafanaNative (logs, métriques, profils)DatasourceDatasource
Protocoles d'entréeOTLP, Jaeger, ZipkinOTLP, JaegerZipkin

3. L'architecture #

Écriture et lecture.

Les composants #

Composants de Grafana Tempo
Chaque composant peut être mis à l'échelle séparément.
ComposantRôle
DistributorReçoit les spans (OTLP, Jaeger, Zipkin), les groupe par TraceID et les envoie aux ingesters
IngesterAssemble les traces en mémoire et dans le WAL, écrit des blocs dans le stockage
CompactorFusionne les blocs, applique la rétention
Query FrontendDécoupe les recherches en sous-requêtes parallèles
QuerierCherche les traces dans les ingesters et le stockage
Metrics-generatorDérive des métriques (service graphs, span metrics) des traces

Modes de déploiement #

tempo -config.file=tempo.yaml -target=all            # monolithique (tests, petits volumes)
tempo -config.file=tempo.yaml -target=distributor     # microservices
tempo -config.file=tempo.yaml -target=querier
tempo --version
Bonne Pratique : Démarrez en monolithique ; passez au chart tempo-distributed quand l'ingestion dépasse quelques dizaines de Mo/s.

Articles liés

Installer Grafana Tempo (Docker Compose, binaire et Helm)

Installer Grafana Tempo : configuration tempo.yaml, Docker Compose avec Grafana et Prometheus, ports OTLP, vé…

Envoyer des traces vers Tempo : instrumentation OpenTelemetry et Alloy

Produire et acheminer des traces vers Tempo : auto-instrumentation Python/Java/Node, SDK manuel, variables d'…

TraceQL : le langage de requête des traces

Maîtriser TraceQL : sélecteurs de spans, attributs de ressource et de span, opérateurs, comparaisons de durée…

Pour aller plus loin