Το kit του εργαστηρίου — https://github.com/hrhouma2/aiopsatlas-observabilite-labo-fr — κλωνοποιημένο στο
lab3στο μάθημα 03. Όλες οι εντολές αυτού του μαθήματος πληκτρολογούνται από αυτόν τον φάκελο. Το Grafana περιγράφεται στη θύρα 3000· αν επέλεξεςGRAFANA_PORT=3001, αντικατάστησε το 3000 με 3001 παντού.
Να ξεκινήσεις το εργαστήριο είναι σαν να γυρίζεις το κλειδί: ο κινητήρας (Docker) εκκινεί τις δέκα υπηρεσίες, οι μετρητές ανάβουν ένας-ένας, και μετά από ένα λεπτό το ταμπλό είναι ζωντανό. Οι εννέα διεπαφές web είναι τα εννέα καντράν αυτού του ταμπλό: καθεμία δείχνει το ίδιο εργαστήριο από διαφορετική γωνία. Ο Prometheus είναι ο ακατέργαστος μετρητής· το Grafana είναι το παρμπρίζ, η άνετη θέα στους ίδιους αριθμούς· ο Alertmanager και το webhook είναι τα λαμπάκια· το API είναι ο δρόμος που το αυτοκίνητο διανύει αυτή τη στιγμή.
Το demarrer εκτελεί αλυσιδωτά τέσσερις φάσεις. Κατεβάζει τις έξι δημόσιες εικόνες (Prometheus, Alertmanager, Grafana, Alloy, node-exporter, cAdvisor: περίπου 1,5 GB την πρώτη φορά, τίποτα στη συνέχεια)· κατασκευάζει τις τέσσερις τοπικές εικόνες (api, charge, webhook από python:3.13-slim, και loki για να του προστεθεί ένα δυαδικό busybox που χρησιμεύει στον έλεγχο υγείας)· δημιουργεί ένα δίκτυο Docker (labo-observabilite_labo) και τρεις τόμους (grafana-data, prometheus-data, loki-data)· και μετά ξεκινά τα δέκα containers και περιμένει καθένα να απαντήσει στον έλεγχο υγείας του (healthcheck). Ορισμένες υπηρεσίες εξαρτώνται από άλλες: το charge ξεκινά μόνο όταν το API είναι υγιές, το grafana και το alloy περιμένουν τον Prometheus και το Loki.
Οι τρεις τόμοι είναι η μνήμη του εργαστηρίου. Το arreter σταματά τα containers αλλά κρατά τους τόμους: οι σειρές του Prometheus, τα logs του Loki και οι ρυθμίσεις του Grafana επιζούν, και το demarrer συνεχίζει από εκεί που ήσουν. Το reinitialiser διαγράφει τους τόμους: καινούριο εργαστήριο. Τεκμηρίωση: Docker Compose — Volumes και Docker Compose — Healthchecks και depends_on.
| Εντολή | Τι κάνει | Πότε να τη χρησιμοποιείς |
|---|---|---|
prerequis | Ελέγχει Docker, Compose, τη μνήμη, τους επεξεργαστές, τις εννέα θύρες | Πριν από το πρώτο demarrer (μάθημα 03) |
demarrer | Κατεβάζει, κατασκευάζει, δημιουργεί δίκτυο και τόμους, ξεκινά τις 10 υπηρεσίες, περιμένει να είναι έτοιμες | Στην αρχή κάθε συνεδρίας |
etat | Πίνακας των containers, στόχοι Prometheus, σειρές, ειδοποιήσεις, κατάσταση κάθε διεπαφής | Συνεχώς: είναι το πρώτο σου αντανακλαστικό |
journal <service> | Οι 100 τελευταίες γραμμές ημερολογίου μιας υπηρεσίας | Όταν μια υπηρεσία δεν απαντά, ή για να διαβάσεις τα logs του API |
casser <scenario> | Προκαλεί μια βλάβη: api, erreurs, lenteur, disque | Πρακτική αυτής της ενότητας και των επόμενων |
reparer | Ακυρώνει όλες τις βλάβες | Μετά από κάθε casser |
arreter | Σταματά τα containers, κρατά τα δεδομένα | Στο τέλος της συνεδρίας |
reinitialiser | Διαγράφει containers και τόμους, μετά από επιβεβαίωση | Για να ξεκινήσεις από το μηδέν |
Οι εννέα διεπαφές, και τι κοιτάς σε καθεμία:
| Διεπαφή | URL | Τι κοιτάς εκεί |
|---|---|---|
| Prometheus | http://localhost:9090 | Η σελίδα Query για να πληκτρολογήσεις ένα ερώτημα, Alerts για τους κανόνες, Status → Target health για τους 8 στόχους |
| Alertmanager | http://localhost:9093 | Οι ληφθείσες ειδοποιήσεις, ομαδοποιημένες ανά alertname και service· οι σιγάσεις |
| Grafana | http://localhost:3000 | Οι τρεις προ-ρυθμισμένοι πίνακες ελέγχου, Explore, οι τρεις πηγές δεδομένων |
| API καταλόγου | http://localhost:8000 | /cours, /cours/C0001, /sante, /metrics: η παρατηρούμενη υπηρεσία, όπως φαίνεται από έξω |
| webhook | http://localhost:8090 | Η λίστα των ειδοποιήσεων που λήφθηκαν από τον Alertmanager, ανανεωμένη κάθε 10 s |
| Loki | http://localhost:3100/ready | Απαντά ready· το Loki δεν έχει διεπαφή, το ερωτάς μέσω Grafana |
| Alloy | http://localhost:12345 | Η διεπαφή διάγνωσής του: τα συστατικά του config.alloy και η κατάστασή τους |
| node-exporter | http://localhost:9100/metrics | Η ακατέργαστη σελίδα των μετρικών του μηχανήματος-οικοδεσπότη |
| cAdvisor | http://localhost:8080 | Οι μετρικές ανά container· /metrics για την ακατέργαστη σελίδα |
Εκκίνηση. Από το lab3:
.\labo.ps1 demarrer./labo.sh demarrerΣτο μηχάνημα του μαθήματος, στην πρώτη εκκίνηση (οι γραμμές λήψης και κατασκευής έχουν κοπεί):
== Téléchargement des images (long la première fois : ~1,5 Go) ==
Image labo-webhook:1.0.0 Skipped Image can be built
Image labo-api:1.0.0 Skipped Image can be built
Image labo-charge:1.0.0 Skipped Image can be built
Image labo-loki:3.7.7 Skipped Image can be built
…
== Construction des images du labo (api, charge, webhook, loki) et démarrage ==
…
Network labo-observabilite_labo Created
Volume labo-observabilite_grafana-data Created
Volume labo-observabilite_prometheus-data Created
Volume labo-observabilite_loki-data Created
…
Container labo-prometheus Healthy
Container labo-api Healthy
Container labo-charge Starting
Container labo-charge Started
Container labo-loki Healthy
Container labo-alloy Started
Container labo-grafana Started
== Attente que chaque service soit prêt ==
prometheus prêt (0 s)
alertmanager prêt (0 s)
loki prêt (0 s)
alloy .. prêt (6 s)
node-exporter prêt (0 s)
cadvisor prêt (0 s)
api prêt (0 s)
webhook prêt (0 s)
charge prêt (0 s)
grafana ... prêt (9 s)
Le labo est prêt.
Grafana http://localhost:3000 (utilisateur admin · mot de passe aiopsatlas2026)
Prometheus http://localhost:9090 (Status → Target health, puis onglet Graph)
Alertmanager http://localhost:9093
API catalogue http://localhost:8000/cours · http://localhost:8000/metrics
Webhook http://localhost:8090 (les alertes reçues)
Loki http://localhost:3100/ready · Alloy http://localhost:12345
node-exporter http://localhost:9100/metrics · cAdvisor http://localhost:8080
Étape suivante : .\labo.ps1 etat (laissez tourner 2 minutes pour avoir des courbes)Τι πρέπει να δεις: τα τέσσερα Skipped Image can be built (οι τοπικές εικόνες δεν κατεβαίνουν, κατασκευάζονται), οι τρεις τόμοι που δημιουργήθηκαν, το labo-charge Starting μόνο μετά το labo-api Healthy, και μετά τα δέκα prêt. Στο μηχάνημα του μαθήματος, το demarrer πήρε 44 δευτερόλεπτα με τις εικόνες ήδη σε cache. Η τελευταία γραμμή σου λέει να περιμένεις δύο λεπτά: ο Prometheus χρειάζεται μερικά scrapes για να σχεδιάσει μια καμπύλη.
Ανάγνωση του etat.
.\labo.ps1 etat
== Conteneurs ==
NAME SERVICE STATUS
labo-alertmanager alertmanager Up About a minute (healthy)
labo-alloy alloy Up 48 seconds (healthy)
labo-api api Up About a minute (healthy)
labo-cadvisor cadvisor Up About a minute (healthy)
labo-charge charge Up About a minute (healthy)
labo-grafana grafana Up 48 seconds (healthy)
labo-loki loki Up About a minute (healthy)
labo-node-exporter node-exporter Up About a minute (healthy)
labo-prometheus prometheus Up About a minute (healthy)
labo-webhook webhook Up About a minute (healthy)
== Supervision ==
✔ Prometheus répond — cibles up : 8/8
séries en mémoire : 9038
alertes : 0 active(s), 0 en attente (pending)
✔ Alertmanager répond (http://localhost:9093)
✔ Grafana répond (http://localhost:3000)
✔ Loki répond (http://localhost:3100)
✔ API catalogue répond — version 1.0.0, 64 cours
✔ Webhook répond — 0 alerte(s) reçue(s) (http://localhost:8090)
Labo : 10/10 services, 8/8 cibles up, 0 alertes actives.Τι πρέπει να δεις: δύο μπλοκ. Conteneurs (containers): δέκα γραμμές, όλες Up … (healthy). Supervision (εποπτεία): ο Prometheus διαβάζει τους 8 στόχους του, αποθηκεύει 9038 σειρές (αυτός ο αριθμός ανεβαίνει τα πρώτα λεπτά, μετά σταθεροποιείται γύρω στις 12 000 έως 15 000 στο μηχάνημα του μαθήματος), καμία ειδοποίηση· το API γνωρίζει 64 μαθήματα· το webhook δεν έχει λάβει τίποτα. Η τελευταία γραμμή, Labo : 10/10 services, 8/8 cibles up, 0 alertes actives., είναι αυτή που πρέπει να ξαναβρίσκεις στο τέλος κάθε πρακτικής.
Prometheus: Query, Alerts, Status. Άνοιξε το http://localhost:9090. Το πάνω μενού έχει τρεις καταχωρήσεις: Query, Alerts, Status. Στο Status, το υπομενού προτείνει Target health, Rule health, Service discovery, Runtime & build information, TSDB status, Command-line flags, Configuration, Alertmanager discovery. Πήγαινε στο Target health: οκτώ μπλοκ, ένα ανά job, καθένα με 1 / 1 up, το URL που διαβάζεται (Endpoint), τα labels, την ημερομηνία του τελευταίου scrape και την κατάσταση UP. Στο μηχάνημα του μαθήματος:
api
1 / 1 up
Endpoint Labels Last scrape State
http://api:8000/metrics instance="api:8000" job="api" service="api" 6.014s ago UPΓύρνα στο Query, πληκτρολόγησε up στο πεδίο εισαγωγής και κάνε κλικ στο Execute (ή Enter). Κάτω από το πεδίο, τρεις καρτέλες: Table, Graph, Explain. Στο Table, οκτώ γραμμές της μορφής up{instance="localhost:9090", job="prometheus"} 1, όλες στο 1. Κάτω από τις καρτέλες, μια γραμμή του τύπου Load time: 40ms Result series: 8 σου λέει πόσες σειρές απάντησαν. Πέρασε στο Graph: οκτώ επίπεδες γραμμές στο 1. Η ενότητα 2 θα περάσει τον υπόλοιπο χρόνο σε αυτή τη σελίδα.
Grafana: τρεις έτοιμοι πίνακες ελέγχου. Άνοιξε το http://localhost:3000, χρήστης admin, κωδικός aiopsatlas2026. Η αρχική σελίδα καταγράφει τα Recent dashboards: οι τρεις πίνακες ελέγχου που προ-ρυθμίστηκαν από το kit, στον φάκελο Labo observabilite. Το κύριο μενού (εικονίδιο πάνω αριστερά) δίνει Dashboards, Explore, Alerting, Connections → Data sources. Στο Connections → Data sources, τρεις πηγές: Prometheus (προεπιλογή), Loki, Alertmanager. Το API του Grafana επιβεβαιώνει την ίδια λίστα:
uid=api-catalogue titre=« API catalogue — signaux dorés » panneaux=23 dossier=Labo observabilite
uid=hote-conteneurs titre=« Hôte et conteneurs » panneaux=16 dossier=Labo observabilite
uid=journaux-api titre=« Journaux de l'API » panneaux=6 dossier=Labo observabilite
source Prometheus type=prometheus uid=prometheus default=True
source Loki type=loki uid=loki default=False
source Alertmanager type=alertmanager uid=alertmanager default=FalseΆνοιξε το API catalogue — signaux dorés (API καταλόγου — χρυσά σήματα): τα τέσσερα χρυσά σήματα (κίνηση, σφάλματα, καθυστέρηση, κορεσμός) του API, πλέον δύο επιχειρησιακές μετρικές (εγγραφές, μαθήματα που ανοίχτηκαν). Οι καμπύλες είναι επίπεδες στην αρχή: χρειάζονται δύο λεπτά φορτίου. Τι πρέπει να δεις: τίποτα από όσα βλέπεις εδώ δεν αποθηκεύεται στο Grafana. Κάθε πίνακας (panel) στέλνει ένα ερώτημα PromQL στον Prometheus τη στιγμή που κοιτάς. Το Grafana είναι το παρμπρίζ, όχι ο κινητήρας.
Το Loki διαβάζεται στο ίδιο σημείο. Άνοιξε το Explore στο μενού, διάλεξε την πηγή Loki στον επιλογέα πάνω, πληκτρολόγησε {service="api"} στο πεδίο ερωτήματος και εκτέλεσε με Run query: οι γραμμές JSON του API κυλούν, οι πιο πρόσφατες πάνω, καθεμία με τα labels της. Το Loki γνωρίζει μόνο τέσσερα σε αυτό το εργαστήριο, που λαμβάνονται από το http://localhost:3100/loki/api/v1/labels: code, conteneur, niveau, service. Τα service και conteneur έρχονται από το Docker, τα niveau και code εξάγονται από το JSON μέσω του Alloy. Γύρισε τον επιλογέα στο Prometheus, πληκτρολόγησε up, Run query: οι οκτώ σειρές του βήματος 3 εμφανίζονται, σε πίνακα και σε καμπύλη. Το Explore είναι το σημείο όπου δοκιμάζεις ένα ερώτημα πριν το κάνεις πίνακα (panel) (μάθημα 07).
Το API καταλόγου, από έξω. Άνοιξε τα τέσσερα παρακάτω URL στον περιηγητή, ή με Invoke-RestMethod / curl:
http://localhost:8000/sante → {"etat":"ok","version":"1.0.0","cours":64}
http://localhost:8000/cours/C0001 → {"id":"C0001","titre":"Introduction à Python","categorie":"programmation","niveau":"debutant","prix":89,"duree_heures":6,"professeur":"Karim Haddad","tags":["code","algorithmes"],"note":4.8,"inscrits":2319}
http://localhost:8000/cours/C9999 → 404 {"detail":"cours C9999 introuvable"}
http://localhost:8000/metrics → 271 lignes de texte, les métriques de la leçon 02Τι πρέπει να δεις: το /sante είναι η διαδρομή που καλεί το Docker για το healthcheck· το /cours/C0001 είναι ένα από τα 64 μαθήματα· το /cours/C9999 απαντά ένα καθαρό 404, που το API μετρά στο http_requetes_total{code="404",route="/cours/{id}"} και γράφει σε ένα log WARNING· το /metrics είναι αυτό που διαβάζει ο Prometheus. Κάθε απόκριση φέρει μια κεφαλίδα x-id-requete (για παράδειγμα c5c49525ea53), το ίδιο αναγνωριστικό με αυτό του log JSON αυτού του αιτήματος.
Alertmanager και webhook: τα λαμπάκια, σβηστά. Άνοιξε το http://localhost:9093: το μενού προτείνει Alerts, Silences, Status, Settings, και ένα κουμπί New Silence. Σε κανονική λειτουργία, η σελίδα Alerts είναι κενή. Άνοιξε το http://localhost:8090: μια σελίδα «Alertes reçues d'Alertmanager» (Ειδοποιήσεις που λήφθηκαν από τον Alertmanager) με έναν πίνακα έξι στηλών (Reçue à, Alerte, Sévérité, État, Service, Résumé) και τη γραμμή Aucune alerte reçue pour l'instant.· η σελίδα ανανεώνεται κάθε 10 δευτερόλεπτα. Η ακατέργαστη μορφή βρίσκεται στο http://localhost:8090/alertes.json ([]) και η κατάσταση της υπηρεσίας στο http://localhost:8090/sante:
{"etat":"ok","alertes_en_memoire":0,"notifications":0,"alertes":0}Τι πρέπει να δεις: δύο κενές σελίδες, και αυτό είναι που θέλουμε. Η πρακτική αυτής της ενότητας τις γεμίζει με casser api.
Loki, Alloy, node-exporter, cAdvisor: τα παρασκήνια. Τέσσερις σελίδες χωρίς άνετη διεπαφή:
http://localhost:3100/ready → ready
http://localhost:12345/-/ready → Alloy is ready.
http://localhost:9100/metrics → 1578 lignes (node_cpu_seconds_total, node_memory_MemTotal_bytes…)
http://localhost:8080/metrics → 3444 lignes (container_memory_working_set_bytes{name="labo-api"}…)Τι πρέπει να δεις: το Loki και το Alloy απαντούν με μια λέξη· δουλεύουν για το Grafana, όχι για σένα απευθείας. Οι δύο exporters εκθέτουν την ίδια μορφή σελίδας με το API (# HELP, # TYPE, μια γραμμή ανά σειρά), με πολύ περισσότερες γραμμές. Άνοιξε το http://localhost:8080 χωρίς /metrics: το cAdvisor ανακατευθύνει στο /containers/, μια μικρή σελίδα που δείχνει ολόκληρο το μηχάνημα (Usage Overview, CPU Total Usage, Memory Total Usage, Network Throughput) και έναν σύνδεσμο Docker Containers προς τη λεπτομέρεια κάθε container.
Ανάγνωση ενός ημερολογίου.
.\labo.ps1 journal apilabo-api | {"horodatage": "2026-09-15T19:33:25.839+00:00", "niveau": "INFO", "id_requete": "46bb533b33e9", "methode": "GET", "route": "/cours/{id}", "code": 200, "duree_ms": 13.9, "message": "GET /cours/C0038 -> 200"}
labo-api | {"horodatage": "2026-09-15T19:33:25.843+00:00", "niveau": "INFO", "id_requete": "5c0d4e124807", "methode": "GET", "route": "/cours", "code": 200, "duree_ms": 30.4, "message": "GET /cours -> 200"}
labo-api | {"horodatage": "2026-09-15T19:33:25.916+00:00", "niveau": "INFO", "id_requete": "5ccaee4d1a2a", "methode": "GET", "route": "/sante", "code": 200, "duree_ms": 1.0, "message": "GET /sante -> 200"}Μετά journal charge:
labo-charge | {"horodatage": "2026-09-15T19:33:22.848+00:00", "niveau": "INFO", "message": "résumé des 30 dernières secondes", "requetes": {"201": 28, "total": 264, "200": 210, "404": 21, "422": 2, "500": 3}}Τι πρέπει να δεις: το API γράφει μια γραμμή ανά αίτημα· η γεννήτρια φορτίου γράφει μια περίληψη κάθε 30 δευτερόλεπτα, περίπου 260 αιτήματα (σχεδόν 9 ανά δευτερόλεπτο), από τα οποία καμιά εικοσαριά 404 και μερικά εκούσια 500. Αυτοί οι αριθμοί είναι αυτοί που θα ξαναβρείς στον Prometheus με rate() στην ενότητα 2.
Σταμάτημα, και μετά επανεκκίνηση χωρίς να χάσεις τίποτα.
.\labo.ps1 arreter Container labo-webhook Stopping
Container labo-alertmanager Stopping
…
Container labo-api Stopped
Container labo-prometheus Stopped
✔ conteneurs arrêtés — vos données sont conservées ; .\labo.ps1 demarrer pour reprendreΤο docker compose ps -a δείχνει τότε δέκα γραμμές Exited· το etat τελειώνει με Labo : 0/10 services, ?/? cibles up, ? alertes actives. (τα ? γιατί ο Prometheus δεν απαντά πλέον). Ξαναεκτέλεσε .\labo.ps1 demarrer: αυτή τη φορά, καμία λήψη, καμία κατασκευή, καμιά τριανταριά δευτερόλεπτα. Στον Prometheus, πληκτρολόγησε up και πέρασε στο Graph με εύρος μιας ώρας: η καμπύλη διακόπτεται κατά το σταμάτημα και συνεχίζει, με το προηγούμενο ιστορικό άθικτο. Ο τόμος prometheus-data είναι που κράτησε τις σειρές.
Το demarrer σταματά σε μια υπηρεσία. Το μήνυμα είναι σαφές: Un service n'a pas démarré. Regardez son journal : .\labo.ps1 journal <service>. Κάνε το. Η πιο συχνή περίπτωση είναι μια θύρα που καταλήφθηκε ανάμεσα στο prerequis και το demarrer (ένα άλλο πρόγραμμα που εκκινήθηκε στο μεταξύ): το Docker αρνείται τότε να δημοσιεύσει τη θύρα, και το ημερολόγιο του container είναι κενό γιατί δεν ξεκίνησε ποτέ. Ξαναεκτέλεσε το prerequis.
journal χωρίς όνομα υπηρεσίας. Το .\labo.ps1 journal μόνο του εμφανίζει:
usage : .\labo.ps1 journal <prometheus|alertmanager|loki|alloy|node-exporter|cadvisor|api|webhook|charge|grafana>Τα δέκα έγκυρα ονόματα είναι εκεί· είναι τα ονόματα των υπηρεσιών στο docker-compose.yml, όχι αυτά των containers (api, όχι labo-api). Ομοίως, το .\labo.ps1 casser tout απαντά usage : .\labo.ps1 casser <api|erreurs|lenteur|disque>.
Το Grafana απαντά Unauthorized. Αν καλέσεις το API του Grafana χωρίς να είσαι συνδεδεμένος, για παράδειγμα το http://localhost:3000/api/search σε μια ιδιωτική καρτέλα, παίρνεις:
{"extra":null,"message":"Unauthorized","messageId":"auth.unauthorized","statusCode":401,"traceID":""}Είναι φυσιολογικό: οι σελίδες API απαιτούν μια συνεδρία ή έναν κωδικό. Συνδέσου πρώτα στο http://localhost:3000 (admin / aiopsatlas2026), και μετά επαναφόρτωσε.
Οι πίνακες ελέγχου Grafana εμφανίζουν «No data». Δύο αίτια, με αυτή τη σειρά: το εργαστήριο τρέχει λιγότερο από δύο λεπτά (περίμενε)· ή το χρονικό εύρος πάνω δεξιά δείχνει σε μια περίοδο όπου το εργαστήριο ήταν σταματημένο (ξαναβάλε «Last 15 minutes» ή «Last 1 hour»).
Το etat εμφανίζει Labo : 0/10 services, ?/? cibles up, ? alertes actives. Το εργαστήριο είναι σταματημένο. .\labo.ps1 demarrer.
Σε PowerShell, το demarrer εμφανίζει κόκκινες γραμμές NativeCommandError γύρω από το Container labo-api Stopping. Είναι τα μηνύματα προόδου του Docker Compose, γραμμένα στην έξοδο σφαλμάτων· όταν το labo.ps1 εκκινείται το ίδιο από ένα άλλο σενάριο ή με 2>&1, το PowerShell 5.1 τα ντύνει ως σφάλμα. Το εργαστήριο ξεκίνησε κανονικά: έλεγξε με etat.
Το demarrer κατεβάζει έξι εικόνες, κατασκευάζει τέσσερις τοπικές εικόνες, δημιουργεί ένα δίκτυο και τρεις τόμους, και μετά εκκινεί δέκα containers και περιμένει τους ελέγχους υγείας τους· 44 δευτερόλεπτα στο μηχάνημα του μαθήματος με τις εικόνες ήδη σε cache. Το etat έχει δύο μπλοκ: τα containers (δέκα Up … (healthy)) και την εποπτεία (8/8 στόχοι, ο αριθμός σειρών, οι ειδοποιήσεις, η κατάσταση κάθε διεπαφής)· η ονομαστική τελευταία γραμμή του είναι Labo : 10/10 services, 8/8 cibles up, 0 alertes actives.. Ο Prometheus (9090) έχει τρεις σελίδες: Query με τις καρτέλες Table, Graph, Explain· Alerts· Status → Target health με τους 8 στόχους UP. Το Grafana (3000, admin / aiopsatlas2026) έχει τρεις προ-ρυθμισμένους πίνακες ελέγχου στον φάκελο Labo observabilite και τρεις πηγές δεδομένων, Prometheus ως προεπιλογή· δεν αποθηκεύει καμία μέτρηση το ίδιο. Το API (8000) απαντά στο /sante, /cours/C0001, /metrics, και ένα καθαρό 404 σε ένα άγνωστο μάθημα, με μια κεφαλίδα x-id-requete σε κάθε απόκριση. Ο Alertmanager (9093) και το webhook (8090) είναι κενά σε κανονική λειτουργία. Το journal <service> παίρνει το όνομα της υπηρεσίας, όχι του container. Το arreter κρατά τους τόμους: οι σειρές επιζούν, η καμπύλη up διακόπτεται και μετά συνεχίζει.
grafana/provisioning/. Γι' αυτό ο φάκελος Labo observabilite σημειώνεται ως «managed by classic file provisioning» στο API.docker compose ps, logs, stop: οι εντολές που το labo.ps1 και το labo.sh εκτελούν αλυσιδωτά για σένα· το journal api είναι docker compose logs --tail 100 api.etat, στο Target health, στον Alertmanager και στο webhook, πριν επιδιορθώσεις.