Backend Spring Boot¶
Structure du projet¶
perfshop-app/src/main/java/com/perfshop/
├── chaos/
│ ├── ChaosService.java # État des anomalies (AtomicInteger)
│ ├── ChaosController.java # API REST /api/chaos/backend
│ ├── CpuChaosScheduler.java # Boucle SHA-256 fixedRate=100ms
│ ├── MemoryLeakService.java # Accumulation objets en mémoire
│ ├── ThreadPoolChaosService.java
│ ├── DbPoolChaosService.java
│ ├── SlowQueryChaosService.java
│ ├── DeadlockChaosService.java
│ └── NetworkDelayChaosService.java
├── controller/
│ ├── ProductController.java
│ ├── CartController.java
│ ├── OrderController.java
│ └── AuthController.java
├── service/
├── repository/
└── model/
API Chaos Backend¶
Lire l'état actuel¶
{
"cpu": 0,
"memory": 0,
"threadPool": 0,
"dbPool": 0,
"slowQuery": 0,
"deadlock": 0,
"network": 0
}
Modifier une anomalie¶
CpuChaosScheduler — détail technique¶
@Scheduled(fixedRate = 100) // toutes les 100ms comme un métronome
public void executeCpuChaos() {
int intensity = chaosService.getCpuIntensity().get();
if (intensity == 0) return;
// 100% slider = 320 000 iterations = ~100% CPU sur i7
int iterations = intensity * 3_200;
MessageDigest digest = MessageDigest.getInstance("SHA-256");
// ... boucle de hashage non optimisable par le JIT
}
Calibrage
La formule intensity × 3200 est calibrée pour un i7-8700T.
Sur un serveur plus puissant, 100% slider ≠ 100% CPU container.
Ajuster la constante dans CpuChaosScheduler.java si nécessaire.
Métriques Prometheus clés¶
| Métrique | Type | Anomalie associée |
|---|---|---|
docker_container_cpu_percent{container="perfshop-app"} |
gauge | CPU Burn |
jvm_memory_used_bytes{area="heap"} |
gauge | Memory Leak |
tomcat_threads_busy_threads |
gauge | Thread Pool |
hikaricp_connections_active |
gauge | DB Pool |
hikaricp_connections_pending |
gauge | DB Pool |
http_server_requests_seconds_bucket |
histogram | Slow Query, Network |
jvm_gc_pause_seconds_sum |
counter | Memory Leak |
jvm_threads_states_threads{state="blocked"} |
gauge | Deadlock |