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).
# En-tête W3C propagé entre les services
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
# ver <------- trace-id (16 octets) -----> <-span-id-> flags2. 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ère | Grafana Tempo | Jaeger | Zipkin |
|---|---|---|---|
| Stockage | Objet (S3, GCS, Azure) ou local | Elasticsearch, Cassandra, OpenSearch | Elasticsearch, Cassandra, MySQL |
| Coût à grande échelle | Très faible | Moyen à élevé | Moyen |
| Langage de requête | TraceQL | Filtres UI/API | Filtres UI/API |
| Intégration Grafana | Native (logs, métriques, profils) | Datasource | Datasource |
| Protocoles d'entrée | OTLP, Jaeger, Zipkin | OTLP, Jaeger | Zipkin |
3. L'architecture #
Écriture et lecture.
Les composants #
| Composant | Rôle |
|---|---|
| Distributor | Reçoit les spans (OTLP, Jaeger, Zipkin), les groupe par TraceID et les envoie aux ingesters |
| Ingester | Assemble les traces en mémoire et dans le WAL, écrit des blocs dans le stockage |
| Compactor | Fusionne les blocs, applique la rétention |
| Query Frontend | Découpe les recherches en sous-requêtes parallèles |
| Querier | Cherche les traces dans les ingesters et le stockage |
| Metrics-generator | Dé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 --versionBonne Pratique : Démarrez en monolithique ; passez au chart tempo-distributed quand l'ingestion dépasse quelques dizaines de Mo/s.