Aller au contenu
BackJavaSpring Bootchaos

Introduisez du chaos dans votre application Spring Boot

Le chaos n'est pas une menace, mais un révélateur : il expose les failles et forge la résilience. Découvrez comment Chaos Monkey met votre application Spring Boot à l'épreuve pour la rendre plus robuste que jamais.

Professeur Chaos - South Park

Mais pourquoi vouloir introduire du chaos volontairement dans mon application ?
C'est sans doute la question qui vous a traversé l'esprit en lisant le titre de cet article.
Et c'est ce que nous allons voir dans cet article en introduisant divers types de chaos dans une application Spring Boot.

Le chaos engineering

Le Chaos Engineering est une discipline qui consiste à tester la résilience des systèmes en introduisant des perturbations contrôlées. L’objectif est d’identifier les failles avant qu’elles ne se manifestent en production et de s’assurer que l’application peut tolérer les pannes sans compromettre son bon fonctionnement.

Pourquoi utiliser le chaos engineering ?

Les systèmes modernes sont distribués, complexes et dynamiques (microservices, cloud, conteneurs…). Les pannes sont inévitables :
Tester la robustesse face aux pannes de réseau, surcharges ou erreurs applicatives.
Identifier les points faibles avant qu’un incident ne survienne en production.
Améliorer la résilience en optimisant la tolérance aux erreurs et en renforçant l’architecture.

Exemple d'outils de chaos engineering

Développé par Netflix, Chaos Monkey injecte des pannes aléatoires dans un environnement pour tester sa robustesse.

L’armée des singes du chaos : définition
Découvrez pourquoi introduire du chaos dans votre infrastructure, une pratique qui peut sembler contre-intuitive, peut finalement vous permettre d’être plus résilient.

Chaos Monkey pour Spring Boot

GitHub - codecentric/chaos-monkey-spring-boot: Chaos Monkey for Spring Boot
Chaos Monkey for Spring Boot. Contribute to codecentric/chaos-monkey-spring-boot development by creating an account on GitHub.

Chaos Monkey for Spring Boot est un projet open source inspiré de la Simian Army de Netflix mais centré sur ... Spring Boot.

Le but du projet ? Après avoir mis en place pléthore de tests unitaires et d'intégration, avoir entre 70-80% de couverture de code, il reste encore une zone d'incertitude :

  • Comment l'application fera-t-elle face à de la latence ?
  • Et si un service ne répondait plus ?

Ce sont ces questions qui ont conduit à la création de ce projet.

Installation dans Spring Boot

Pour ajouter Chaos Monkey dans votre application Spring Boot, il vous faut modifier votre fichier pom.xml afin d'y rajouter la dépendance suivante :

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>chaos-monkey-spring-boot</artifactId>
    <version>3.1.2</version>
</dependency>

dépendance chaos monkey

Et ensuite d'activer le profil adéquat dans votre fichier application.properties

spring.profiles.active=chaos-monkey

Au démarrage de votre application, en plus de la traditionnelle bannière Spring (si vous n'avez pas personnalisé celle-ci) vous devriez voir dans vos logs ceci :

     _____ _                       __  __             _
    / ____| |                     |  \/  |           | |
   | |    | |__   __ _  ___  ___  | \  / | ___  _ __ | | _____ _   _
   | |    | '_ \ / _` |/ _ \/ __| | |\/| |/ _ \| '_ \| |/ / _ | | | |
   | |____| | | | (_| | (_) \__ \ | |  | | (_) | | | |   |  __| |_| |
    \_____|_| |_|\__,_|\___/|___/ |_|  |_|\___/|_| |_|_|\_\___|\__, |
                                                                __/ |
    _ready to do evil!                                         |___/

:: Chaos Monkey for Spring Boot                                    ::

Nous sommes maintenant prêts à déchaîner le chaos.

Enfin pas tout à fait.

Activation

Chaos Monkey for Spring Boot est livré avec des APIs qui permettent de modifier la configuration de ce dernier au runtime de l'application.

Pour profiter de cette fonctionnalité, il faut au préalable avoir inclus les actuators dans vos dépendances, et pour les plus curieux qui veulent avoir les différents contrats des APIs l'on peut également ajouter celle de l'UI de swagger :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.8.4</version>
</dependency>

dépendance des actuators

Et modifier encore une fois nos propriétés :

management.endpoint.chaosmonkey.enabled=true
management.endpoints.web.exposure.include=health,info,chaosmonkey

springdoc.show-actuator=true
chaos.monkey.apidoc.enabled=true

Il nous reste alors plus qu'a appeler /actuator/chaosmonkey/enable pour activer Chaos Monkey.

Déchainer le chaos

Pour ce cas pratique, j'ai créé 2 APIs avec une architecture REST tout ce qu'il y a de plus de classique :

  • Controller
  • Service
  • Repository

Chacune avec ses propres exceptions.

Définir ou le chaos va survenir

Les watchers jouent le rôle de singes du chaos pour les différents types de composant Spring Boot.

  • @Controller
  • @RestController
  • @Service
  • @Repository
  • @Component

Avec l'aide de Spring AOP, Chaos Monkey détecte l'exécution d'une méthode publique dans un bean surveillé et choisira soit de ne rien faire, soit de lancer une de ses attaques.
Nous pouvons modifier ces configurations grâce à l'API /actuator/chaosmonkey/watchers.

{
  "controller": false,
  "restController": true,
  "service": false,
  "repository": false,
  "component": false
}

exemple de requête de mise à jour de watcher

Ici nous indiquons que nous souhaitons attaquer nos composants annotés @RestController (nous pouvons très bien mettre true partout).

Définir le type de chaos que nous souhaitons

Grâce à l'API /actuator/chaosmonkey/assaults nous pouvons décider quel type de chaos nous voulons provoquer dans notre application.

  • Latence
  • Exception
  • Kill de l'application via cron
  • Mémoire de la JVM
{
  "level": 5,
  "deterministic": true,
  "latencyRangeStart": 5000,
  "latencyRangeEnd": 10000,
  "latencyActive": true,
  "watchedCustomServices": [
    "fr.eletutour.controller.ArticleController"
  ]
}

exemple de requête de mise à jour d'assault

Regardons de plus près ce que va faire cette requête :

  • level : indique le nombre de requête à attaquer (1 = chaque requête, 5 toutes les 5 requêtes).
  • deterministic : Si on veut que le niveau soit déterminé, attaqué X requête ou bien une chance sur X d'être attaqué.
  • latencyRangeStart et latencyRangeEnd : le minimum et le maximum de latence à ajouter au requête en ms.
  • latencyActive : activation des attaques de type latence.
  • watchedCustomServices : limite le service sur lequel déclenché le chaos, si vide pas de limite, tout y passera en fonction des watchers préalablement choisit.

Voyons maintenant ce que peut donner un appel à mon API article avec et sans chaos.

appel sans chaos
appel avec chaos

Comme vous pouvez le constater, le temps de réponse de mon API a grandement augmenté, et je ne cible que les RestController, imaginez si j'avais décidé de cibler également les Services et les Repository.

Conclusion

Je ne vous ai montré ici, qu'une infime partie du chaos que vous pouvez déclencher dans vos applications, il ne reste qu'à vous lancer pour découvrir toutes les possibilités de cet outil.
Mais n'oubliez pas une chose, vous allez devoir apprendre à devenir sociable et très rapidement si vous ne l'êtes pas déjà, car si jamais vous décidez de vous lancer dans le chaos engineering sans prévenir vos collègues à l'avance, car vous allez sans doute avoir beaucoup à faire avec eux quand le chaos frappera.


Toute la documentation de l'outil et comment le paramétrer est trouvable ici

Chaos Monkey for Spring Boot Reference Guide

Tout le code relatif à cet article est trouvable ici si jamais vous souhaitez faire des tests de votre coté.

GitHub - ErwanLT/springboot-demo: Demo project for spring-boot possibility
Demo project for spring-boot possibility. Contribute to ErwanLT/springboot-demo development by creating an account on GitHub.

Dernier