Introduzione a Chaos Monkey

1. Introduzione

In questo tutorial, parleremo di Chaos Monkey per Spring Boot.

Questo strumento ci aiuta a introdurre alcuni dei principi dell'ingegneria del caos nelle nostre applicazioni Web Spring Boot aggiungendo latenza ai nostri endpoint REST, generando errori o persino uccidendo un'app.

2. Configurazione

Per aggiungere Chaos Monkey alla nostra applicazione, abbiamo bisogno di una singola dipendenza Maven nel nostro progetto:

 de.codecentric chaos-monkey-spring-boot 2.0.0 

3. Configurazione

Una volta che abbiamo la configurazione delle dipendenze nel nostro progetto, dobbiamo configurare e avviare il nostro caos.

Possiamo farlo in un paio di modi:

  • All'avvio dell'applicazione, utilizzando il profilo della molla chaos-monkey (consigliato)
  • Utilizzo della proprietà chaos.monkey.enabled = true

Avviando l'applicazione con il profilo della molla chaos-monkey non dobbiamo arrestare e avviare l'applicazione se vogliamo abilitarla o disabilitarla mentre la nostra app è in esecuzione:

java -jar your-app.jar --spring.profiles.active=chaos-monkey

Un'altra proprietà utile è management.endpoint.chaosmonkey.enabled. L'impostazione di questa proprietà su true abiliterà l'endpoint di gestione per il nostro Chaos Monkey:

//localhost:8080/chaosmonkey

Da questo punto finale, possiamo vedere lo stato della nostra libreria. Ecco l'elenco completo degli endpoint e la loro descrizione che aiuteranno a modificare la configurazione, abilitare o disabilitare Chaos Monkey e altri controlli più granulari.

Utilizzando tutte le proprietà disponibili, possiamo avere un controllo più dettagliato su ciò che accade nel nostro caos generato.

4. Come funziona

Chaos Monkey è composto da Watchers e Assaults. Un Watcher è un componente Spring Boot. Utilizza Spring AOP per vedere quando un metodo pubblico viene eseguito in classi annotate con le seguenti annotazioni Spring:

  • Componente
  • Controller
  • RestController
  • Servizio
  • Repository

In base alla configurazione nel nostro file delle proprietà dell'app, i nostri metodi pubblici saranno attaccati o meno da uno dei seguenti:

  • Latency Assault: aggiunge latenza casuale alla richiesta
  • Eccezione Assalto: genera un'eccezione di runtime casuale
  • AppKiller Assault - ehm, l'app muore

Diamo un'occhiata a come possiamo configurare il nostro watcher e gli assalti per un assalto più controllato.

5. Watcher

Per impostazione predefinita, Watcher è abilitato solo per i nostri servizi . Ciò significa che i nostri assalti verranno eseguiti solo per metodi pubblici nelle nostre classi annotate con @Service.

Ma possiamo cambiarlo facilmente configurando le proprietà:

chaos.monkey.watcher.controller=false chaos.monkey.watcher.restController=false chaos.monkey.watcher.service=true chaos.monkey.watcher.repository=false chaos.monkey.watcher.component=false

Tieni presente che una volta avviata l'applicazione, non possiamo cambiare dinamicamente il watcher utilizzando il port di gestione Chaos Monkey per Spring Boot di cui abbiamo parlato in precedenza.

6. Assalti

Gli assalti sono fondamentalmente scenari che vogliamo testare nella nostra applicazione. Prendiamo ogni tipo di attacco e vediamo cosa fa e come possiamo configurarlo.

6.1. Latency Assault

Questo tipo di attacco aggiunge latenza alle nostre chiamate. In questo modo la nostra applicazione risponde più lentamente e possiamo monitorare come si comporta quando ad esempio il database risponde più lentamente.

We can configure and turn on or of this type of attack using the properties file of our app:

chaos.monkey.assaults.latencyActive=true chaos.monkey.assaults.latencyRangeStart=3000 chaos.monkey.assaults.latencyRangeEnd=15000

Another way to configure and switch on and off this type of attack is through the management endpoint of Chaos Monkey.

Let's turn on the latency attack and add a range of latency between two and five seconds:

curl -X POST //localhost:8080/chaosmonkey/assaults \ -H 'Content-Type: application/json' \ -d \ ' { "latencyRangeStart": 2000, "latencyRangeEnd": 5000, "latencyActive": true, "exceptionsActive": false, "killApplicationActive": false }'

6.2. Exception Assault

This tests how well our application can handle exceptions. Based on configuration it will throw a random Runtime Exception once enabled.

We can enable it using a curl call similar to our latency assault:

curl -X POST //localhost:8080/chaosmonkey/assaults \ -H 'Content-Type: application/json' \ -d \ ' { "latencyActive": false, "exceptionsActive": true, "killApplicationActive": false }'

6.3. AppKiller Assault

This one, well, our app will die at some random point. We can enable or disable it with a simple curl call like the previous two types of assault:

curl -X POST //localhost:8080/chaosmonkey/assaults \ -H 'Content-Type: application/json' \ -d \ ' { "latencyActive": false, "exceptionsActive": false, "killApplicationActive": true }'

7. Conclusion

In questo articolo abbiamo parlato di Chaos Monkey per Spring Boot . Abbiamo visto che ci vogliono alcuni dei principi dell'ingegneria del caos e ci consente di applicarli a un'applicazione Spring Boot.

Come sempre, il codice completo degli esempi può essere trovato su Github.