181 lines
5.6 KiB
Markdown
181 lines
5.6 KiB
Markdown
|
|
# 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`
|