# Operational Drills - veza-backend-api Scripts de validation opérationnelle pour prouver que l'observabilité fonctionne en conditions réelles. ## Scripts Disponibles ### 1. `db_down_drill.sh` - DB Down Drill **Objectif**: Vérifier que `/readyz` retourne `503` + status `not_ready` quand DB est down. **Usage**: ```bash ./scripts/ops_drills/db_down_drill.sh [API_URL] [PROMETHEUS_URL] ``` **Exemple**: ```bash ./scripts/ops_drills/db_down_drill.sh http://localhost:8080 http://localhost:9090 ``` **Déroulé**: 1. État initial - Vérifie `/readyz` et métriques DB 2. Simulation DB down - 3 options (arrêter PostgreSQL, DSN invalide, firewall) 3. Vérification `/readyz` - Doit retourner 503 + `not_ready` 4. Vérification métriques Prometheus - DB pool stats 5. Vérification alertes - `VezaDBPoolExhausted`, `VezaReadinessFailed` 6. Restauration - Option pour restaurer DB **Critères de succès**: - ✅ `/readyz` retourne `503 Service Unavailable` - ✅ Status = `"not_ready"` - ✅ DB check status = `"error"` - ✅ Métriques Prometheus exposées - ✅ Alertes déclenchées (si seuils atteints) ### 2. `circuit_breaker_drill.sh` - Circuit Breaker Drill **Objectif**: Simuler dépendance externe en 5xx/timeout pour ouvrir circuit breaker. **Usage**: ```bash ./scripts/ops_drills/circuit_breaker_drill.sh [API_URL] [PROMETHEUS_URL] [SERVICE_URL] ``` **Exemple**: ```bash ./scripts/ops_drills/circuit_breaker_drill.sh http://localhost:8080 http://localhost:9090 http://localhost:8082 ``` **Déroulé**: 1. État initial - Vérifie état circuit breaker (CLOSED) 2. Simulation dépendance externe - 4 options (mock server, arrêter service, firewall, service de test) 3. Génération requêtes - Pour déclencher échecs consécutifs 4. Vérification état - Circuit breaker doit passer en OPEN (après 5 échecs) 5. Vérification alertes - `VezaCircuitBreakerOpen` 6. Vérification comportement API - Requêtes rejetées quand OPEN 7. Restauration - Attendre timeout pour HALF_OPEN **Critères de succès**: - ✅ Circuit breaker détecté dans Prometheus - ✅ État = `2` (OPEN) après 5 échecs consécutifs - ✅ Métriques `veza_circuit_breaker_*` exposées - ✅ Alerte `VezaCircuitBreakerOpen` déclenchée (après 5 min) ## Prérequis ### Outils Requis - `curl` - Pour requêtes HTTP - `jq` - Pour parsing JSON - `bash` - Shell (version 4+) - Accès à Prometheus (pour vérifier métriques/alertes) ### Installation jq (si manquant) ```bash # Ubuntu/Debian sudo apt-get install jq # macOS brew install jq # CentOS/RHEL sudo yum install jq ``` ### Configuration 1. **Prometheus** doit être configuré et accessible 2. **Alertes** doivent être chargées (`ops/prometheus/alerts.yml`) 3. **API** doit être démarrée et accessible 4. **Permissions** - Certaines options nécessitent sudo (arrêter PostgreSQL, firewall) ## Exécution en Staging ### Avant le Drill 1. **Notifier l'équipe** - Les drills peuvent affecter le service 2. **Vérifier backups** - S'assurer que DB peut être restaurée 3. **Planifier fenêtre** - Prévoir 15-30 minutes par drill 4. **Documenter état initial** - Capturer métriques avant drill ### Pendant le Drill 1. **Suivre le script** - Le script guide étape par étape 2. **Vérifier logs** - Surveiller logs application en parallèle 3. **Vérifier Prometheus UI** - Ouvrir `http://prometheus:9090` pour voir métriques en temps réel 4. **Documenter observations** - Noter tout comportement inattendu ### Après le Drill 1. **Vérifier restauration** - S'assurer que tout est revenu à la normale 2. **Analyser logs** - Vérifier logs pour patterns intéressants 3. **Documenter résultats** - Noter dans le log du drill (`/tmp/*_drill_*.log`) 4. **Post-mortem** - Si échecs, documenter causes et actions correctives ## Logs Chaque drill génère un log timestampé dans `/tmp/`: - `db_down_drill_YYYYMMDD_HHMMSS.log` - `circuit_breaker_drill_YYYYMMDD_HHMMSS.log` Les logs contiennent: - Toutes les étapes exécutées - Résultats des vérifications - Métriques Prometheus capturées - Résumé final (succès/échec) ## Dépannage ### Drill DB Down échoue **Problème**: `/readyz` ne retourne pas 503 - Vérifier que DB est vraiment down: `psql -h localhost -U veza -d veza_db -c "SELECT 1;"` - Vérifier logs application pour erreurs DB - Vérifier que health handler vérifie bien la DB **Problème**: Métriques non trouvées - Vérifier que Prometheus scrape `/metrics`: `curl http://localhost:8080/metrics | grep veza_db_pool` - Vérifier configuration Prometheus (`prometheus.yml`) ### Drill Circuit Breaker échoue **Problème**: Circuit breaker reste CLOSED - Vérifier que le circuit breaker est utilisé par l'endpoint testé - Vérifier que les requêtes échouent vraiment (5xx/timeout) - Vérifier configuration circuit breaker (seuil = 5 échecs consécutifs) **Problème**: Métriques non trouvées - Vérifier que le circuit breaker est initialisé - Vérifier que les métriques sont mises à jour dans `CircuitBreakerHTTPClient.Do()` ## Intégration CI/CD Ces scripts peuvent être intégrés dans un pipeline CI/CD pour validation automatique: ```yaml # .github/workflows/ops-drills.yml name: Operational Drills on: schedule: - cron: '0 2 * * 0' # Dimanche 2h du matin workflow_dispatch: jobs: db-down-drill: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Run DB Down Drill run: ./scripts/ops_drills/db_down_drill.sh ``` **Note**: En CI/CD, utiliser des mocks/services de test plutôt que couper de vrais services. ## Références - Runbooks: `docs/runbooks/` - Alertes Prometheus: `ops/prometheus/alerts.yml` - Documentation observabilité: `docs/PROD_WEEK1_HARDENING_REPORT.md`