Introduction
Jaeger est devenu l'outil de référence pour le tracing distribué dans les architectures microservices. En 2026, les exigences en matière d'observabilité exigent bien plus qu'un simple déploiement : il faut gérer le sampling intelligent, la corrélation multi-services et l'intégration avec les pipelines CI/CD. Ce tutoriel vous guide pas à pas pour mettre en place une solution production-ready. Vous apprendrez à instrumenter des applications Node.js/TypeScript, configurer des collecteurs haute performance et optimiser les coûts de stockage des traces. Chaque étape inclut des exemples concrets et fonctionnels que vous pouvez copier directement.
Prérequis
- Docker et Docker Compose v2.20+
- Connaissances solides en TypeScript et OpenTelemetry
- Cluster Kubernetes (optionnel pour production)
- Node.js 20+ et npm
Déploiement production avec Docker Compose
version: '3.8'
services:
jaeger-collector:
image: jaegertracing/jaeger-collector:1.55
environment:
- COLLECTOR_OTLP_ENABLED=true
- SPAN_STORAGE_TYPE=elasticsearch
ports:
- "14268:14268"
- "4317:4317"
- "4318:4318"
jaeger-query:
image: jaegertracing/jaeger-query:1.55
environment:
- SPAN_STORAGE_TYPE=elasticsearch
ports:
- "16686:16686"Ce fichier déploie un collecteur et un query service Jaeger prêts pour la production. Le port 4317 gère l'OTLP gRPC et 4318 l'OTLP HTTP pour une ingestion moderne.
Vérification du déploiement
Lancez docker compose up -d. Accédez à l'interface Jaeger sur http://localhost:16686. Vérifiez que les services apparaissent bien dans le sélecteur de service.
Instrumentation OpenTelemetry avancée
import { NodeSDK } from '@opentelemetry/sdk-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { Resource } from '@opentelemetry/resources';
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
const sdk = new NodeSDK({
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: 'api-users',
[SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: 'production',
}),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();Ce module configure le SDK OpenTelemetry avec détection automatique des frameworks. Il envoie les traces vers le collecteur Jaeger via OTLP par défaut.
Configuration du sampling probabiliste
import { ParentBasedSampler, TraceIdRatioBasedSampler } from '@opentelemetry/core';
const sampler = new ParentBasedSampler({
root: new TraceIdRatioBasedSampler(0.1), // 10% des traces racines
});
// À passer dans les options du NodeSDKLe sampling à 10 % réduit drastiquement le volume de données tout en conservant une vision représentative du trafic. Utilisez ParentBasedSampler pour respecter les décisions de sampling des services parents.
Ajout de tags et spans personnalisés
import { trace } from '@opentelemetry/api';
const tracer = trace.getTracer('user-service');
export async function getUser(id: string) {
const span = tracer.startSpan('getUser');
span.setAttribute('user.id', id);
span.setAttribute('user.tier', 'premium');
try {
return await db.findUser(id);
} finally {
span.end();
}
}Les attributs personnalisés permettent de filtrer et analyser les traces dans l'interface Jaeger. Toujours terminer le span dans un finally pour éviter les fuites.
Configuration du Collector avec Elasticsearch
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
processors:
probabilistic_sampler:
hash_seed: 22
sampling_percentage: 15
exporters:
elasticsearch:
endpoints: ["http://elasticsearch:9200"]
service:
pipelines:
traces:
receivers: [otlp]
processors: [probabilistic_sampler]
exporters: [elasticsearch]Ce fichier de configuration avancé active le sampling au niveau du collecteur et stocke les traces dans Elasticsearch pour une rétention longue durée et des requêtes complexes.
Bonnes pratiques
- Toujours propager le contexte de trace entre les services avec les headers W3C TraceContext
- Utiliser des noms de span cohérents et hiérarchiques
- Configurer des limites de taille de span pour éviter les traces trop volumineuses
- Monitorer la latence du collecteur et la taille des queues
- Versionner vos schémas d'attributs pour faciliter l'analyse historique
Erreurs courantes à éviter
- Oublier d'activer OTLP sur le collecteur (port 4317/4318)
- Définir un taux de sampling trop bas en environnement de test
- Ne pas instrumenter les bases de données et files de messages
- Ignorer les erreurs de connexion au backend de stockage
Pour aller plus loin
Découvrez nos formations complètes sur l'observabilité et le tracing distribué : https://learni-group.com/formations. Vous y apprendrez notamment l'intégration de Jaeger avec Grafana Tempo et l'analyse de traces avec OpenSearch.