Jaeger
Overview
Jaeger, c'est le système de distributed tracing open-source développé par Uber qui pense que comprendre ce qui se passe dans tes microservices, c'est mieux que deviner. Il trace les requêtes à travers tous tes services pour te donner une vue complète de ce qui se passe, combien de temps ça prend, et où ça coince. Si tu as des microservices et que tu veux débugger efficacement, c'est parfait.
Jaeger est maintenant un projet CNCF (Cloud Native Computing Foundation) et implémente le standard OpenTracing. Architecture scalable avec sampling intelligent, stockage multiple (Cassandra, Elasticsearch, Kafka), UI web intuitive pour explorer les traces. Compatible avec OpenTelemetry depuis la v2.
Jaeger se distingue par sa maturité (utilisé en production chez Uber depuis des années), son interface utilisateur excellente (explorer les traces, c'est du plaisir), et sa compatibilité avec les standards (OpenTracing, OpenTelemetry, tout y passe).
Informations essentielles
| Propriété | Valeur |
|---|---|
| Site officiel | https://www.jaegertracing.io/ |
| Repository | https://github.com/jaegertracing/jaeger |
| Licence | Apache 2.0 |
| Organisation | CNCF (Cloud Native Computing Foundation) |
| Langage | Go |
| Stockage | Cassandra, Elasticsearch, Kafka, Memory, BadgerDB |
Fonctionnalités principales
Distributed Tracing complet
- Traçage des requêtes à travers les microservices
- Corrélation automatique des spans parent-enfant
- Support des opérations asynchrones et parallèles
- Mesure de latence bout-en-bout
- Détection des goulots d'étranglement
Interface utilisateur avancée
- Exploration visuelle des traces
- Timeline interactive des spans
- Comparaison de traces similaires
- Recherche par tags, services, opérations
- Graphiques de dépendances entre services
Sampling intelligent
- Sampling adaptatif basé sur le trafic
- Stratégies par service ou opération
- Sampling probabiliste et par débit
- Remote sampling configuration
- Head-based et tail-based sampling
Architecture scalable
- Composants découplés (agent, collector, query, UI)
- Support multi-tenant
- Haute disponibilité avec clustering
- Intégration Kubernetes native
- Métriques et monitoring intégrés
Cas d'usage
- Debugging microservices : Tracer les problèmes dans les architectures distribuées
- Optimisation performance : Identifier les services lents et goulots d'étranglement
- Monitoring SLA : Mesurer les latences bout-en-bout
- Dépendances services : Comprendre les interactions entre microservices
- Root cause analysis : Analyser les causes racines des incidents
Installation
Via Docker Compose (all-in-one)
version: '3'
services:
jaeger:
image: jaegertracing/all-in-one:latest
ports:
- "16686:16686" # UI
- "14268:14268" # HTTP collector
- "6831:6831/udp" # Agent compact thrift
- "6832:6832/udp" # Agent binary thrift
environment:
- COLLECTOR_OTLP_ENABLED=true
Via Helm (Kubernetes)
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm install jaeger jaegertracing/jaeger \
--set storage.type=elasticsearch \
--set elasticsearch.host=elasticsearch.default.svc.cluster.local
Via Jaeger Operator (Kubernetes)
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: simple-prod
spec:
strategy: production
storage:
type: elasticsearch
elasticsearch:
nodeCount: 3
redundancyPolicy: SingleRedundancy
Utilisation basique
Configuration application (Go)
import (
"github.com/opentracing/opentracing-go"
"github.com/jaegertracing/jaeger-client-go/config"
)
func initJaeger(service string) (opentracing.Tracer, io.Closer) {
cfg := config.Configuration{
ServiceName: service,
Sampler: &config.SamplerConfig{
Type: "const",
Param: 1,
},
Reporter: &config.ReporterConfig{
LogSpans: true,
LocalAgentHostPort: "localhost:6831",
},
}
tracer, closer, _ := cfg.NewTracer()
opentracing.SetGlobalTracer(tracer)
return tracer, closer
}
Instrumentation avec OpenTelemetry (Python)
from opentelemetry import trace
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
# Configuration
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
# Export vers Jaeger
jaeger_exporter = JaegerExporter(
agent_host_name="localhost",
agent_port=6831,
)
span_processor = BatchSpanProcessor(jaeger_exporter)
trace.get_tracer_provider().add_span_processor(span_processor)
# Utilisation
with tracer.start_as_current_span("my-operation"):
# Votre code applicatif ici
pass
Requêtes via API
# Recherche de traces par service
curl "http://localhost:16686/api/traces?service=my-service&limit=20"
# Recherche avec filtres
curl "http://localhost:16686/api/traces?service=my-service&operation=my-operation&start=1609459200000000&end=1609545600000000"
# Liste des services
curl "http://localhost:16686/api/services"
Avantages
- ✅ Maturité prouvée : utilisé en production chez Uber et d'autres grandes entreprises, c'est du solide
- ✅ Interface excellente : UI intuitive pour explorer les traces, c'est un plaisir à utiliser
- ✅ Standards compatibles : OpenTracing et OpenTelemetry, tu n'es pas enfermé
- ✅ CNCF project : projet officiel avec gouvernance et support communautaire, c'est pérenne
- ✅ Scaling prouvé : architecture testée à grande échelle, ça scale vraiment
Limitations
- Configuration initiale peut être complexe pour les débutants : mais la doc est bien faite
- Overhead de performance avec sampling élevé : mais le sampling intelligent gère ça
- Stockage peut devenir volumineux sur gros volumes : mais les stratégies de retention existent
Alternatives
- Zipkin : Alternative similaire, plus simple mais moins de fonctionnalités
- AWS X-Ray : Solution managed AWS (propriétaire)
- Datadog APM : Solution SaaS enterprise (propriétaire)
- New Relic : Solution SaaS enterprise (propriétaire)
Ressources
- Documentation : https://www.jaegertracing.io/docs/
- GitHub : https://github.com/jaegertracing/jaeger
- Getting Started : https://www.jaegertracing.io/docs/getting-started/
- Architecture : https://www.jaegertracing.io/docs/architecture/