Lab 1 — Démarrage de la stack d'observabilité
Bienvenue dans l’équipe SRE de l’Astronomy Shop 🔭 — une boutique e-commerce composée d’une vingtaine de micro-services, instrumentée avec OpenTelemetry (démo officielle).
Dans ce premier lab, entièrement guidé, vous démarrez la plateforme d’observabilité complète : le collecteur OpenTelemetry, Grafana, Jaeger (traces), Prometheus (métriques) et OpenSearch (logs), ainsi que la boutique elle-même et son générateur de trafic.
💡 Toute la stack tourne dans un cluster Kubernetes local (Kind). Kubernetes n’est pas le sujet de cette formation : toutes les commandes
kubectlsont fournies, avec leur explication.
Prérequis
- Docker installé et fonctionnel (
docker psne renvoie pas d’erreur). kubectl,helmetktbxinstallés.kind≥ v0.27 (kind version) — les versions plus anciennes ne savent pas charger d’images dans les nœuds récents (erreurfailed to detect containerd snapshotter). Mise à jour :go install sigs.k8s.io/kind@v0.30.0.- Le dépôt de la formation cloné :
Étapes
- Créer le cluster et installer la démo OpenTelemetry :
🏫 Serveur partagé : si le formateur vous a fourni un compte
student<N>sur un serveur commun, la commande est la même, mais elle va beaucoup plus vite : votre cluster a généralement été créé la veille, avec les images déjà chargées. Le script le réutilise et n’a plus que la démo à installer — une minute environ.Vous partagez la machine avec les autres participants : pour que vos accès n’entrent pas en conflit avec les leurs, chacun écoute sur sa propre adresse de boucle locale au lieu de
localhost—student3sur127.0.0.3, aliaslocalhost3. Les ports, eux, sont les mêmes pour tout le monde (8080 pour les UIs). Une variable déjà présente dans votre shell porte ce nom :$PF_HOST, celui de vos URLs.open-ui.shles affiche — ouvrez-les depuis le navigateur du serveur (Guacamole).
Sur un poste neuf, comptez quelques minutes : c’est le téléchargement des images. Pendant ce temps, regardez ce que fait le script, dans l’ordre :
- il vérifie si le cluster Kind à votre nom existe. S’il est là, il le réutilise ; sinon il le crée (
ktbx create -s). Il ne le détruit jamais — vous pouvez donc relancerup.shautant de fois que vous voulez sans perdre votre travail. Pour supprimer le cluster, il faut le demander explicitement, avec./scripts/down.sh; - il pré-télécharge les images de la démo sur la machine et les injecte dans le cluster (
scripts/preload-images.sh) — celles que le cluster possède déjà sont sautées ; - il installe le chart Helm
open-telemetry/opentelemetry-demodans le namespaceotel-demo— c’est la démo officielle OpenTelemetry, l’« Astronomy Shop ».
- Vérifier que tous les pods sont démarrés :
kubectl get pods -n otel-demoliste les conteneurs qui tournent dans le namespaceotel-demo. Tous doivent être en étatRunningavecREADY 1/1.
Combien de micro-services applicatifs identifiez-vous ? Lesquels tournent sur la JVM ?
- Accéder aux interfaces web :
Ce script ouvre tous les accès dont les labs ont besoin — les UIs sur le port 8080 (derrière le proxy frontal : la boutique, Grafana, Jaeger…), Prometheus, OpenSearch, les zPages du collecteur et votre
review-service— puis rend la main : il travaille en arrière-plan et vous affiche vos URLs exactes. Il les rouvre tout seul à chaque redéploiement, et./scripts/open-ui.sh -sles ferme.Un accès qui n’existe pas encore n’est pas une erreur : le
review-serviceest celui que vous déploierez au Lab 2, son URL répondra à ce moment-là.
Utilisez les URLs que le script vient d’afficher, et elles seules :
⚠️ N’écrivez jamais
localhosten dur sur le serveur partagé. Chaque compte a son adresse (student1→localhost1,student2→localhost2…), etlocalhosttout court est celle destudent1. Un participant qui tapehttp://localhost:8080/tombe donc sur la boutique de son voisin — elle répond, tout a l’air normal, et il cherchera ensuite sa trace dans le Jaeger de quelqu’un d’autre.Le même piège vaut pour les URLs affichées par Helm à la fin de l’installation : elles annoncent
http://localhost:8080parce que le chart ne connaît pas votre compte. Fiez-vous àopen-ui.sh, pas à elles.Sur un poste individuel,
$PF_HOSTvaut simplementlocalhostet la question ne se pose pas.
- Générer votre propre trafic :
Ouvrez la boutique, choisissez un télescope et passez une commande complète (panier → checkout).
⚠️ Vous n’êtes pas seul à commander : la démo embarque un load generator (Locust, 10 utilisateurs virtuels démarrés automatiquement) qui navigue et passe des commandes en continu, pour que la plateforme ait toujours des données à observer. Résultat : Jaeger contient en permanence des dizaines de traces de checkout qui ne sont pas les vôtres — et elles ressemblent beaucoup aux vôtres.
Pour isoler votre commande, mettez le générateur en pause avant de commander :
- ouvrez le load generator (l’URL
/loadgen/affichée paropen-ui.sh), cliquez sur Stop ; - attendez ~30 s (le temps que les requêtes en cours se terminent), puis notez l’heure et passez votre commande ;
- relancez le générateur après l’étape 5 — bouton New en haut à droite, puis Start dans la fenêtre Start new load test : les labs suivants ont besoin de ce trafic de fond.
- Retrouver votre commande dans Jaeger :
Dans Jaeger, cherchez les traces du service checkout (opération oteldemo.CheckoutService/PlaceOrder) et ouvrez la plus récente — celle dont l’horodatage correspond à votre clic.
⏱️ Une trace met quelques secondes à devenir visible (le SDK et le collecteur envoient par paquets, pas span par span). Si vous ne la voyez pas tout de suite, relancez la recherche (Find Traces) au bout de 5 à 10 secondes.
💡 Si vous n’avez pas arrêté le load generator, triez par Most Recent et repérez la trace à l’heure de votre commande — c’est le critère le plus fiable. Indice complémentaire : les traces issues des requêtes HTTP du générateur contiennent un span du service
load-generator(visible dans les badges de services de la liste de résultats), que les vôtres n’ont pas.
Combien de services différents cette trace traverse-t-elle ? Que représente chaque barre horizontale ?
- Une première métrique dans Grafana :
Dans Grafana, ouvrez le dashboard Demo Dashboard (dossier General). Observez le taux de requêtes et les latences par service — c’est le trafic du load generator que vous voyez en direct.
- Le fil rouge — un service invisible :
L’équipe Java vient de livrer le micro-service review-service (avis produits). Cherchez-le dans Jaeger (liste des services) et dans Grafana.
Livrable
Une capture d’écran d’une trace de checkout de bout en bout dans Jaeger, montrant le span Kafka publish orders.
🔍 Comment l’afficher sans dérouler 48 spans : dans la barre Find en haut de la trace, tapez
kafka, puis cliquez sur l’icône cible ⌖ juste à droite du champ (entre le?et les flèches). Jaeger masque tout le reste et ouvre les résultats, détails dépliés. Cliquez à nouveau sur la cible pour revenir à la trace entière.
kafkaremonte deux résultats, et c’est normal : le champ Find ne cherche pas que dans les noms d’opération, il fouille aussi les attributs et les events de chaque span. Le second résultat est le spanoteldemo.CheckoutService/PlaceOrder, qui contient un event d’évaluation du feature flagkafkaQueueProblems— un des interrupteurs de panne de la démo. Cherchezpublish orderssi vous voulez atterrir directement sur le bon span.