À la fin de ce tutoriel, vous saurez expliquer OpenTelemetry (OTel), distinguer traces / metrics / logs, déployer un Collector en réception OTLP, instrumenter une app minimale, et corréler les signaux — le tout dans un lab
ca-central-1sans facture inutile.Niveau : Intermédiaire · Temps estimé : 55–75 min · Versions cibles : OpenTelemetry Collector contrib 0.100+ · OTLP/gRPC · Python SDK 1.27+ (ou Node équivalent) · Docker Compose · Dernière vérification : 2026-09-11 · Region :
ca-central-1Slug :
wow-opentelemetry-stack· Série : WOW (24/50) · Mot-clé SEO : OpenTelemetry · Publish : HOLD→ Précédent : EventBridge : architectures event-driven · → Suivant : Prometheus + Thanos · Aussi : Grafana Loki Tempo · CloudWatch alarmes
Prérequis
- Bases conteneurs — Docker · Kubernetes (optionnel pour le lab local)
- Compte AWS de lab (profil
lab) — Démarrer avec AWS - Notions d’observabilité (logs / métriques) utiles — CloudWatch alarmes & logs
- Docker Desktop ou Docker Engine local pour le Collector
Coût estimé : 0 € sur le lab local (Collector + app en Docker). Si vous exportez vers AWS X-Ray / CloudWatch en ca-central-1, restez Free Tier et détruisez les ressources après le lab. Pas d’EKS « juste pour OTel ».
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
aws sts get-caller-identity
Ce que nous allons construire
OpenTelemetry stack (WOW 24/50) — ca-central-1
├── Signaux : traces · metrics · logs
├── API / SDK / Collector / OTLP
├── Lab : app instrumentée → Collector → backend
├── Corrélation trace_id dans les logs
├── Anti-patterns & check-list DEH
└── Quiz + FAQ + maillage WOW
(Schéma — alt : « App Python envoie OTLP au Collector OpenTelemetry qui exporte traces et métriques vers un backend d’observabilité ».)
Étape 1 — Pourquoi OpenTelemetry en 2026 ?
Avant OTel, chaque vendor imposait son agent (Datadog, New Relic, Elastic APM, X-Ray…). Changer d’outil = réécrire l’instrumentation. OpenTelemetry est le standard CNCF pour générer, collecter et exporter télémétrie de façon vendor-neutral.
En pratique DEH : vous instrumentez une fois (SDK + auto-instrumentation), vous poussez en OTLP vers un Collector, et vous choisissez le backend (Tempo, Jaeger, Prometheus, Loki, CloudWatch, vendor SaaS) sans recoller l’app.
| Avant | Avec OpenTelemetry |
|---|---|
| Agent propriétaire dans l’image | SDK / auto-instr. standard |
| Formats incompatibles | OTLP (gRPC / HTTP) |
| Vendor lock-in | Collector + exporters |
| Traces sans logs liés | trace_id / span_id partagés |
| Métriques « à part » | Même pipeline |
Étape 2 — Les trois signaux (et la corrélation)
| Signal | Question | Exemple |
|---|---|---|
| Trace | Quel chemin a pris une requête ? | Span HTTP → DB → queue |
| Metric | Combien / à quelle vitesse ? | http_server_duration p95 |
| Log | Que s’est-il passé ici ? | Erreur SQL + contexte |
La valeur OTel n’est pas « avoir trois outils », c’est corréler : un log d’erreur porte le trace_id, la trace montre le span lent, la métrique alerte sur le p95. Sans corrélation, vous avez trois silos.
Ressources sémantiques utiles : service.name, deployment.environment, cloud.region=ca-central-1, http.route. Gardez un dictionnaire d’attributs dans le golden path plateforme — Platform Engineering.
Étape 3 — Architecture de référence DEH
[ App / Sidecar ]
│ OTLP (4317 gRPC / 4318 HTTP)
▼
[ OpenTelemetry Collector ]
├── receivers: otlp
├── processors: batch, memory_limiter, resource
└── exporters: otlp/tempo · prometheus · loki · awsxray (opt)
▼
[ Backends ]
Tempo / Jaeger · Prometheus (+ Thanos) · Loki · Grafana
Règle d’or : l’app ne parle qu’au Collector. Jamais d’exporteur vendor direct dans le code prod si vous pouvez l’éviter — ça simplifie les rotations de backend et les politiques (sampling, PII).
Étape 4 — Lab : Collector + app OTLP
Créez un dossier de lab :
mkdir -p ~/otel-lab && cd ~/otel-lab
otel-collector-config.yaml (récepteur OTLP, export debug + fichier) :
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
memory_limiter:
check_interval: 1s
limit_mib: 256
resource:
attributes:
- key: deployment.environment
value: lab
action: upsert
- key: cloud.region
value: ca-central-1
action: upsert
exporters:
debug:
verbosity: detailed
otlp/tempo:
endpoint: tempo:4317
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch, resource]
exporters: [debug]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch, resource]
exporters: [debug]
logs:
receivers: [otlp]
processors: [memory_limiter, batch, resource]
exporters: [debug]
docker-compose.yml (Collector seul pour démarrer) :
services:
otel-collector:
image: otel/opentelemetry-collector-contrib:0.100.0
command: ["--config=/etc/otel-collector-config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml:ro
ports:
- "4317:4317"
- "4318:4318"
docker compose up -d
docker compose logs -f otel-collector
App Python minimale (app.py) avec SDK traces :
from opentelemetry import trace
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
resource = Resource.create({
"service.name": "deh-payments",
"service.version": "0.1.0",
"deployment.environment": "lab",
"cloud.region": "ca-central-1",
})
provider = TracerProvider(resource=resource)
provider.add_span_processor(
BatchSpanProcessor(OTLPSpanExporter(endpoint="localhost:4317", insecure=True))
)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer("deh.lab")
with tracer.start_as_current_span("charge_card") as span:
span.set_attribute("payment.amount", 42)
span.set_attribute("payment.currency", "CAD")
print("span envoyé — regardez les logs du Collector")
python3 -m venv .venv && source .venv/bin/activate
pip install opentelemetry-api opentelemetry-sdk
opentelemetry-exporter-otlp-proto-grpc
python app.py
Vous devez voir le span charge_card dans les logs debug du Collector. C’est le happy path OTel : SDK → OTLP → Collector.
Étape 5 — Sampling, cardinality et coûts
Sans garde-fous, OTel peut exploser le volume (et la facture backend).
| Levier | Pratique DEH |
|---|---|
| Sampling | head (SDK) ou tail (Collector) — commencez 10–20 % hors incident |
| Cardinality | jamais user_id / UUID en label métrique |
| Batch | processor batch obligatoire en prod |
| PII | redaction processor avant export |
| Region | tags cloud.region=ca-central-1 pour FinOps |
En incident : montez temporairement le sampling, puis redescendez. Documentez ça dans le runbook — Incident runbooks · SRE error budgets.
Étape 6 — Vers la stack Grafana / AWS
Deux chemins fréquents chez DEH :
- OSS : Collector → Tempo (traces) + Prometheus (metrics) + Loki (logs) + Grafana — voir wow-grafana-loki-tempo et wow-prometheus-thanos.
- AWS natif : Collector → AWS Distro for OpenTelemetry (ADOT) → X-Ray / CloudWatch en
ca-central-1. Utile si vous êtes déjà all-in AWS ; gardez OTLP côté app.
Sur Kubernetes : DaemonSet ou Gateway Collector, service.name via Downward API / resource processor, et pas de credentials longs — OIDC / IRSA / Pod Identity — wow-eks-pod-identity.
Check-list golden path observabilité
service.namestable et unique par service- Export uniquement vers le Collector (OTLP)
deployment.environment+cloud.region=ca-central-1- Logs structurés avec
trace_id/span_id - Sampling documenté + processor
batch - Dashboard Grafana « RED/USE » ou équivalent dès le jour 1
- Alerte sur SLO (pas sur chaque métrique brute) — wow-sre-error-budgets
- Destruction lab :
docker compose down -v
docker compose down -v
deactivate 2>/dev/null || true
rm -rf ~/otel-lab/.venv
Erreurs fréquentes
| Erreur | Impact | Correction |
|---|---|---|
| Exporter vendor dans le code | Lock-in | OTLP → Collector |
service.name = hostname |
Chaos dashboards | Nom logique stable |
| Labels haute cardinalité | Coût / perf | Attributs bornés |
Pas de trace_id dans les logs |
Debug lent | Logger instrumenté OTel |
Collector sans memory_limiter |
OOM | Limiter + batch |
| Region oubliée | FinOps flou | Forcer ca-central-1 |
Quiz (5 questions)
1. OpenTelemetry sert surtout à :
– A. Remplacer Kubernetes
– B. Standardiser génération / collecte / export de télémétrie
– C. Stocker des secrets
2. Le protocole d’export recommandé app → Collector est :
– A. Syslog UDP seul
– B. OTLP (gRPC ou HTTP)
– C. FTP
3. Pourquoi un Collector devant le backend ?
– A. Pour ralentir les traces
– B. Sampling, batch, redaction, multi-export sans toucher l’app
– C. Obligatoire par la loi
4. Region lab DEH :
– A. us-east-1
– B. ca-central-1
– C. ap-south-1
5. Mettre user_id en label Prometheus :
– A. Bonne idée
– B. Anti-pattern (explosion de cardinalité)
– C. Requis par OTel
Réponses : 1‑B · 2‑B · 3‑B · 4‑B · 5‑B
FAQ
OpenTelemetry remplace-t-il Prometheus ?
Non. OTel génère et route ; Prometheus (ou un backend compatible) stocke et requête les métriques. Souvent : SDK → Collector → Prometheus remote-write / exporter.
Traces + logs : comment les lier ?
Injectez trace_id / span_id dans le logger (handlers OTel). Dans Grafana, un clic trace → logs filtrés.
Faut-il instrumenter à la main ou en auto ?
Les deux. Auto-instrumentation pour HTTP/DB courants ; spans manuels pour le métier (charge_card, settle_payment).
Collector en DaemonSet ou Gateway ?
DaemonSet proche des nœuds (logs/agents) ; Gateway central pour sampling / export. Beaucoup d’équipes combinent les deux.
Pourquoi ca-central-1 ?
Standard lab DevOps Elastic Hayway : cohérence IAM, FinOps et maillage entre tutos.
ADOT ou Collector upstream ?
ADOT si vous ciblez surtout AWS (X-Ray, CloudWatch, EMF). Upstream contrib si stack Grafana OSS / multi-cloud. L’app reste en OTLP dans les deux cas.
Pour aller plus loin
- Prometheus + Thanos : rétention longue (WOW 25)
- Grafana Loki Tempo : stack observability (WOW 26)
- SRE : error budgets et SLOs
- CloudWatch alarmes
- EventBridge patterns
- Platform Engineering / IDP
- Démarrer avec AWS
Maillage série WOW
| ← Précédent | EventBridge : architectures event-driven |
| → Suivant | Prometheus + Thanos |
| Aussi | Grafana Loki Tempo · SRE error budgets · Incident runbooks · Lambda Powertools |
Meta publication (SEO)
- Title SEO : OpenTelemetry : traces, metrics et logs unifiés (guide FR)
- Meta description : OpenTelemetry : unifier traces, metrics et logs avec Collector OTLP. Lab ca-central-1, corrélation, FAQ, quiz et check-list DEH.
- Focus keyword : OpenTelemetry
- Secondary : OTLP, OpenTelemetry Collector, traces metrics logs, observability
- Image :
assets/web/devopelastichayway/cover-wow-opentelemetry-stack-1200x630.webp(à générer) - Catégorie : WOW / Observability · Niveau : Intermédiaire
- URL cible : https://devopelastichayway.com/tutoriels/wow-opentelemetry-stack/
- Post live : N/A (nouveau) · slug
wow-opentelemetry-stack· Publish : HOLD (draft only — feu vert Maître requis)
Pour aller plus loin — hubs live
Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.