4.3 KiB
4.3 KiB
diagnosis.md — Contexte mode diagnostic
Type : Contexte — propriétaire :
debug,monitoringRédigé : 2026-03-14 Résout : "debug multi-infra sans ordre de lecture des logs = hypothèses au hasard, diagnostic circulaire"
Problème résolu
En environnement multi-services (VPS + containers + Node.js + MySQL + Apache + pm2), un bug peut venir de n'importe quelle couche. Sans ordre de lecture formalisé, le debug suit l'intuition — ce qui amène à relire les mêmes logs en boucle sans jamais identifier la cause racine.
Ce contexte impose un ordre d'investigation et un protocole d'hypothèses.
Ordre de lecture des logs — multi-infra
Couche 1 — Infrastructure (première)
systemctl status <service> # est-il up ?
journalctl -u <service> -n 50 # dernières erreurs système
dmesg | tail -20 # erreurs kernel (OOM, disk)
df -h && free -h # ressources (disk full = cause fréquente silencieuse)
Couche 2 — Réseau / Proxy
# Apache / Nginx
tail -n 100 /var/log/apache2/error.log
tail -n 100 /var/log/nginx/error.log
# SSL
openssl s_client -connect <host>:443 -brief
# Ports
ss -tlnp | grep <port>
Couche 3 — Application
# pm2
pm2 logs <app> --lines 100
pm2 show <app> # état mémoire, restarts
# Docker
docker logs <container> --tail 100
docker stats <container> # mémoire / CPU
Couche 4 — Base de données
# MySQL — dernières erreurs
tail -n 50 /var/log/mysql/error.log
# Connexions actives
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
Couche 5 — Application code
# Uniquement après avoir éliminé les couches 1-4
# Logs applicatifs, stack traces, erreurs TypeScript runtime
Protocole d'hypothèses
Règle : une hypothèse à la fois, vérifiée avant la suivante.
1. Formuler l'hypothèse : "Je pense que X est causé par Y parce que Z"
2. Identifier le log ou la commande qui confirme ou infirme Y
3. Exécuter — lire le résultat
4. Confirmer ou infirmer explicitement
5. Si infirmé → hypothèse suivante (pas de "peut-être les deux")
Anti-pattern à éviter :
- Proposer 3 causes simultanées sans les tester → confus, lent
- Modifier le code avant d'identifier la cause → cache le vrai problème
- "Ça vient sûrement de X" sans log qui confirme
Questions de cadrage au démarrage d'un diagnostic
1. Quel service est affecté ? (nom précis)
2. Depuis quand ? (heure, event déclencheur)
3. C'est reproductible ? (always / intermittent / once)
4. Qu'est-ce qui a changé juste avant ? (deploy, config, restart)
5. Quel est le symptôme exact ? (message d'erreur complet ou comportement observé)
Ces 5 questions évitent 80% des diagnostics circulaires.
Cross-services — quel serveur, quelle stack
En multi-infra (prod@desktop + VPS + containers) :
| Symptôme | Première couche à vérifier |
|---|---|
| 502 Bad Gateway | Apache → pm2/container (dans cet ordre) |
| Connexion refusée | Port ouvert ? → Service up ? → Firewall ? |
| Lenteur API | pm2 logs → MySQL PROCESSLIST → Node heap |
| Auth échoue | JWT valide ? → Redis (sessions) → MySQL (user) |
| Mail non livré | SPF/DKIM → Stalwart logs → DNS |
| Deploy échoue | CI/CD logs → Docker build → VPS disk |
Trigger de chargement
Propriétaire : debug, monitoring
Trigger : session de type "debug" détectée, ou symptôme multi-services
Section : Sources conditionnelles (debug — si infra détectée dans le scope)
Maintenance
Propriétaire : debug (mise à jour si nouveau pattern de diagnostic validé)
Mise à jour : en fin de session debug si une nouvelle séquence d'investigation a été utile
Jamais modifié par : agents non-debug
Cycle de vie
| État | Condition | Action |
|---|---|---|
| Actif | Sessions debug fréquentes | Enrichi après chaque pattern validé |
| Stable | Stack stable, peu de bugs infra | Consulté, rarement modifié |
| Archivé | N/A | Non applicable |
Changelog
| Date | Changement |
|---|---|
| 2026-03-14 | Création — ordre lecture 5 couches, protocole hypothèses, cross-services table, questions cadrage |