2025-12-16 16:23:49 +00:00
|
|
|
# Load Tests - veza-backend-api
|
|
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
|
|
|
### k6 (recommandé)
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Linux
|
|
|
|
|
sudo gpg -k
|
|
|
|
|
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D9
|
|
|
|
|
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
|
|
|
|
|
sudo apt-get update
|
|
|
|
|
sudo apt-get install k6
|
|
|
|
|
|
|
|
|
|
# macOS
|
|
|
|
|
brew install k6
|
|
|
|
|
|
|
|
|
|
# Windows
|
|
|
|
|
choco install k6
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Vegeta (alternative)
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Linux/macOS
|
|
|
|
|
go install github.com/tsenart/vegeta@latest
|
|
|
|
|
|
|
|
|
|
# Ou télécharger depuis https://github.com/tsenart/vegeta/releases
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Utilisation
|
|
|
|
|
|
|
|
|
|
### k6 Load Test
|
|
|
|
|
|
|
|
|
|
**Test basique** (endpoints critiques):
|
|
|
|
|
```bash
|
|
|
|
|
k6 run scripts/loadtest/k6_load_test.js
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Avec URL personnalisée**:
|
|
|
|
|
```bash
|
|
|
|
|
BASE_URL=http://staging.example.com:8080 k6 run scripts/loadtest/k6_load_test.js
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Avec token d'authentification** (pour tester endpoints protégés):
|
|
|
|
|
```bash
|
|
|
|
|
AUTH_TOKEN=your_jwt_token BASE_URL=http://localhost:8080 k6 run scripts/loadtest/k6_load_test.js
|
|
|
|
|
```
|
|
|
|
|
|
2025-12-25 00:55:22 +00:00
|
|
|
**Test upload endpoints** (concurrent uploads et chunked uploads):
|
|
|
|
|
```bash
|
|
|
|
|
AUTH_TOKEN=your_jwt_token BASE_URL=http://localhost:8080 k6 run scripts/loadtest/k6_upload_load_test.js
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Avec paramètres personnalisés pour uploads**:
|
|
|
|
|
```bash
|
|
|
|
|
AUTH_TOKEN=your_jwt_token \
|
|
|
|
|
BASE_URL=http://localhost:8080 \
|
|
|
|
|
CHUNK_SIZE=2097152 \
|
|
|
|
|
TOTAL_CHUNKS=10 \
|
|
|
|
|
k6 run scripts/loadtest/k6_upload_load_test.js
|
|
|
|
|
```
|
|
|
|
|
|
2025-12-16 16:23:49 +00:00
|
|
|
**Test plus intensif** (modifier les stages dans le script):
|
|
|
|
|
```javascript
|
|
|
|
|
stages: [
|
|
|
|
|
{ duration: '1m', target: 50 }, // 50 VUs
|
|
|
|
|
{ duration: '2m', target: 50 },
|
|
|
|
|
{ duration: '1m', target: 0 },
|
|
|
|
|
],
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Vegeta Load Test (alternative)
|
|
|
|
|
|
|
|
|
|
**Test simple**:
|
|
|
|
|
```bash
|
|
|
|
|
echo "GET http://localhost:8080/health" | vegeta attack -duration=30s -rate=10/s | vegeta report
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Test multiple endpoints**:
|
|
|
|
|
```bash
|
|
|
|
|
cat <<EOF | vegeta attack -duration=30s -rate=10/s | vegeta report
|
|
|
|
|
GET http://localhost:8080/health
|
|
|
|
|
GET http://localhost:8080/readyz
|
|
|
|
|
POST http://localhost:8080/api/v1/auth/login
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
{"email":"test@example.com","password":"test"}
|
|
|
|
|
EOF
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Seuils Attendus
|
|
|
|
|
|
|
|
|
|
### k6 Thresholds (définis dans le script)
|
|
|
|
|
|
2025-12-25 00:55:22 +00:00
|
|
|
**Tests généraux** (`k6_load_test.js`):
|
2025-12-16 16:23:49 +00:00
|
|
|
- **HTTP Request Duration**:
|
|
|
|
|
- P95 < 500ms
|
|
|
|
|
- P99 < 1s
|
|
|
|
|
- **Error Rate**: < 5%
|
|
|
|
|
- **Health Check Duration**: P95 < 100ms
|
|
|
|
|
- **Readyz Check Duration**: P95 < 200ms
|
|
|
|
|
|
2025-12-25 00:55:22 +00:00
|
|
|
**Tests upload** (`k6_upload_load_test.js`):
|
|
|
|
|
- **HTTP Request Duration**:
|
|
|
|
|
- P95 < 5000ms (uploads peuvent être plus lents)
|
|
|
|
|
- P99 < 10000ms
|
|
|
|
|
- **Error Rate**: < 10% (uploads plus fragiles)
|
|
|
|
|
- **Simple Upload Duration**: P95 < 3000ms
|
|
|
|
|
- **Chunked Upload Duration**: P95 < 8000ms
|
|
|
|
|
|
2025-12-16 16:23:49 +00:00
|
|
|
### Interprétation
|
|
|
|
|
|
|
|
|
|
**✅ Test réussi**: Tous les seuils sont respectés
|
|
|
|
|
**⚠️ Test partiel**: Certains seuils dépassés (vérifier logs)
|
|
|
|
|
**❌ Test échoué**: Seuils critiques dépassés (investigation nécessaire)
|
|
|
|
|
|
|
|
|
|
## Résultats
|
|
|
|
|
|
|
|
|
|
### k6
|
|
|
|
|
|
2025-12-25 00:55:22 +00:00
|
|
|
Les scripts génèrent:
|
2025-12-16 16:23:49 +00:00
|
|
|
- **stdout**: Résumé textuel dans la console
|
2025-12-25 00:55:22 +00:00
|
|
|
- **scripts/loadtest/k6_summary.json**: Résultats détaillés en JSON (tests généraux)
|
|
|
|
|
- **scripts/loadtest/k6_upload_summary.json**: Résultats détaillés en JSON (tests upload)
|
2025-12-16 16:23:49 +00:00
|
|
|
|
|
|
|
|
**Exemple de sortie**:
|
|
|
|
|
```
|
|
|
|
|
✓ health status is 200
|
|
|
|
|
✓ readyz status is 200
|
|
|
|
|
✓ login returns 401 or 400
|
|
|
|
|
✓ tracks returns 200 or 401
|
|
|
|
|
|
|
|
|
|
checks.........................: 100.00% ✓ 400 ✗ 0
|
|
|
|
|
data_received..................: 45 kB 1.5 kB/s
|
|
|
|
|
data_sent......................: 28 kB 933 B/s
|
|
|
|
|
http_req_duration..............: avg=45ms min=12ms med=38ms max=250ms p(95)=120ms p(99)=180ms
|
|
|
|
|
http_reqs.....................: 100 3.3/s
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Vegeta
|
|
|
|
|
|
|
|
|
|
**Exemple de sortie**:
|
|
|
|
|
```
|
|
|
|
|
Requests [total, rate, throughput] 100, 3.33, 3.30
|
|
|
|
|
Duration [total, attack, wait] 30.1s, 30s, 100ms
|
|
|
|
|
Latencies [min, mean, 50, 90, 95, 99, max] 12ms, 45ms, 38ms, 120ms, 150ms, 200ms, 250ms
|
|
|
|
|
Bytes In [total, mean] 45000, 450.00
|
|
|
|
|
Bytes Out [total, mean] 28000, 280.00
|
|
|
|
|
Success [ratio] 100.00%
|
|
|
|
|
Status Codes [code:count] 200:100
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Détection de Régressions
|
|
|
|
|
|
|
|
|
|
### Scénarios à surveiller
|
|
|
|
|
|
|
|
|
|
1. **Latence P95 > 500ms**: Performance dégradée
|
|
|
|
|
2. **Error rate > 5%**: Problèmes de stabilité
|
|
|
|
|
3. **Health check > 100ms**: Problème de base de données ou dépendances
|
|
|
|
|
4. **Readyz check > 200ms**: Problème de readiness
|
|
|
|
|
|
|
|
|
|
### Actions si seuils dépassés
|
|
|
|
|
|
|
|
|
|
1. **Vérifier logs application**: `tail -f /var/log/veza-backend-api/*.log`
|
|
|
|
|
2. **Vérifier métriques Prometheus**:
|
|
|
|
|
- `veza_db_pool_open_connections`
|
|
|
|
|
- `veza_gin_http_request_duration_seconds`
|
|
|
|
|
- `veza_gin_http_requests_total{status=~"5.."}`
|
|
|
|
|
3. **Vérifier ressources système**: `htop`, `iostat`, `netstat`
|
|
|
|
|
4. **Consulter runbooks**: `docs/runbooks/`
|
|
|
|
|
|
|
|
|
|
## Intégration CI/CD
|
|
|
|
|
|
|
|
|
|
### Exemple GitHub Actions
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
- name: Run load tests
|
|
|
|
|
run: |
|
|
|
|
|
k6 run scripts/loadtest/k6_load_test.js
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Exemple GitLab CI
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
load_test:
|
|
|
|
|
script:
|
|
|
|
|
- k6 run scripts/loadtest/k6_load_test.js
|
|
|
|
|
only:
|
|
|
|
|
- main
|
|
|
|
|
- staging
|
|
|
|
|
```
|
|
|
|
|
|
2025-12-25 00:55:22 +00:00
|
|
|
## Tests de Performance Go
|
|
|
|
|
|
|
|
|
|
Les tests de performance Go sont disponibles dans `tests/performance/upload_endpoints_performance_test.go`.
|
|
|
|
|
|
|
|
|
|
**Exécuter les tests de performance**:
|
|
|
|
|
```bash
|
|
|
|
|
cd veza-backend-api
|
|
|
|
|
go test -tags=performance ./tests/performance -run TestPerformance -v
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Exécuter les benchmarks**:
|
|
|
|
|
```bash
|
|
|
|
|
cd veza-backend-api
|
|
|
|
|
go test -tags=performance ./tests/performance -bench=Benchmark -benchmem
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Seuils de performance**:
|
|
|
|
|
- Simple Upload: < 2s
|
|
|
|
|
- Chunked Upload Initiate: < 100ms
|
|
|
|
|
- Chunked Upload Chunk: < 200ms par chunk
|
|
|
|
|
- Chunked Upload Complete: < 3s
|
|
|
|
|
- Concurrent Uploads (10): < 10s total
|
|
|
|
|
|
2025-12-16 16:23:49 +00:00
|
|
|
## Notes
|
|
|
|
|
|
|
|
|
|
- Les tests utilisent des **credentials invalides** pour `/api/v1/auth/login` (attendu: 401)
|
|
|
|
|
- Les tests **ne modifient pas** de données (read-only sauf login qui échoue)
|
2025-12-25 00:55:22 +00:00
|
|
|
- Les tests d'upload **nécessitent un token JWT valide** (AUTH_TOKEN)
|
|
|
|
|
- Les tests d'upload **créent des fichiers de test** en mémoire
|
2025-12-16 16:23:49 +00:00
|
|
|
- Ajuster les **seuils** selon votre infrastructure (ex: latence réseau, CPU, etc.)
|