TP2

“On a des doutes sur la tolérance aux pannes de notre application, en fait personne n’a jamais regardé !” Comment est ce qu’on peut faire un état des lieux de la situation ?”

Objectifs

FuSIIon

Lancer FuSIIon en local

Aller dans le répertoire “TP2-docker-gatling”

cd TP2-docker-gatling

Lancer nos différents applicatifs et nos bases de données en local.

docker-compose up -d

Vérifier que les bases de données et les micro-services sont bien démarrés :

docker container ps

CONTAINER ID        IMAGE                                                     COMMAND                  CREATED             STATUS              PORTS                                                                                       NAMES
8336a1521f71        fusiion/sii-codelab-chaos-gestion-clients:latest          "java -XX:+UnlockExp…"   7 seconds ago       Up 6 seconds        8080/tcp, 0.0.0.0:8084->8084/tcp                                                            fusiion-gestion-clients
c001854b9395        fusiion/sii-codelab-chaos-gestion-collaborateurs:latest   "java -XX:+UnlockExp…"   7 seconds ago       Up 6 seconds        8080/tcp, 0.0.0.0:8083->8083/tcp                                                            fusiion-gestion-collaborateurs
47fbba6a4138        fusiion/sii-codelab-chaos-gestion-competences:latest      "java -XX:+UnlockExp…"   7 seconds ago       Up 6 seconds        8080/tcp, 0.0.0.0:8081->8081/tcp                                                            fusiion-gestion-competences
bc90ce18db5b        fusiion/sii-codelab-chaos-authentification:latest         "java -XX:+UnlockExp…"   8 seconds ago       Up 7 seconds        0.0.0.0:8080->8080/tcp                                                                      fusiion-authentification
84770180388c        fusiion/neo4j-docker:latest                               "/docker-entrypoint.…"   10 seconds ago      Up 8 seconds        7473/tcp, 0.0.0.0:17474->7474/tcp, 0.0.0.0:17687->7687/tcp                                  neo4j
e434a52c04b3        fusiion/bitnami-mongodb:latest                            "/app-entrypoint.sh …"   10 seconds ago      Up 8 seconds        0.0.0.0:27017->27017/tcp                                                                    mongodb
6cf87dab1620        fusiion/rabbitmq:latest                                   "docker-entrypoint.s…"   10 seconds ago      Up 8 seconds        4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:8088->5672/tcp, 0.0.0.0:8087->15672/tcp   rabbitmq

Gatling

Création du tir de charge

Configurer le tir de charge dans le fichier :

Codelab-Chaos-TP/TP2-docker-gatling/src/test/scala/fusiion/BasicSimulation.scala

Pour cela nous allons proceder étape par étape, et nous aider de la documentation de Gatling :

https://gatling.io/docs/current/general/simulation_structure

Définition du protocole de communication

  val httpProtocol = http
    .baseUrl("http://localhost")
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    .doNotTrackHeader("1")
    .acceptLanguageHeader("en-US,en;q=0.5")
    .acceptEncodingHeader("gzip, deflate")
    .userAgentHeader("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0")

Définition du scénario fonctionnel

Construire le scénario fonctionnel que nous allons utiliser pour ce tir de charge à l’aide des informations suivante et de la documentaion de Gatling

https://gatling.io/docs/current/general/scenario

Ajouter le début du scénario avec un premier appel au service d’authentification

  val scn = scenario("BasicSimulation")
    .exec(http("authentication") // Nom de l\'appel dans le rapport gatling
      .post(":8080/login") // appel HTTP POST sur la ressource REST /gestionAuthentification/login
      .body(StringBody("{\"username\" : \"pgaultier\", \"password\" : \"password\"}")) // body du POST avec user/password
      .check(header("Authorization").saveAs("token")) // stockage du token JWT dans une variable token
    )
    .pause(2) // pause de 2 seconde pour simuler un vrai utilisateur

Ajouter un deuxième appel au scénario en récuperant la liste des collaborateurs

    .exec(http("Collaborateur/pgaultier")
        .get(":8083/collaborateurs/pgaultier@sii.fr")
        .header("Authorization", "${token}")
        .check(status.is(session => 200))
    )
    .pause(2)

Completer la fin du scénario fonctionnel du tir de charge à l’aide de la feature suivante qui décrit le comportement attendu.

Pour cela, utiliser ce SWAGGER qui décrit les endpoints REST de FuSIIon.

Adresses des differents services :

Service Adresse
authentication localhost:8080
competences localhost:8081
collaborateurs localhost:8083
clients localhost:8084


Feature: FuSIIon cas nominal
Scenario: Connection a FuSIIon puis parcours sur l'application

Given Soit un utilisateur de FuSIIon
And un username "pgaultier@sii.fr"
And un password "password"
When l'utilisateur se connecte via la mire d'authentification de FuSIIon avec ses identifiants
Then il récupere un token d'authentification JWT

Given Soit un utilisateur de FuSIIon avec un token d'authentification
When l'utilisateur demande la liste des collaborateurs
Then il récupere une liste de collaborateurs

Given Soit un utilisateur de FuSIIon avec un token d'authentification
When l'utilisateur demande la liste des competences
Then il récupere une liste de competence

Given Soit un utilisateur de FuSIIon avec un token d'authentification
When l'utilisateur demande le profil d'un collaborateur avec son identifiant
Then il récupere le collaborateur correspondant à son identifiant 

Given Soit un utilisateur de FuSIIon avec un token d'authentification
When l'utilisateur demande la liste des clients
Then il récupere une liste de clients

Définition du set-up du tir

Completer le setup du tir à l’aide des informations suivantes et de la documentation de Gatling:

https://gatling.io/docs/current/general/simulation_setup

# Pour ce TP2, nous allons faire des tirs de charge de 3 minutes, soit 180 secondes.
# FuSIIon est à destination des collaborateurs de SII Atlantique, soit environ 300 personnes.
# Pour que ce tir soit validant, nous avons besoin que 80% des requetes soit en succès et moins de 5% d'erreur sur le service d'authentification.

  setUp(
    scn.inject(
      rampUsers(nb_User) during (nb_Seconde seconds))).protocols(httpProtocol)
    .assertions(
      global.successfulRequests.percent.gt(percentage_Successful_Resquest),
      details("authentication").failedRequests.percent.lt(percentage_Failed_Request)
    )

🐵 Si il vous reste du temps à la fin de ce TP, vous pouvez rajouter d’autres assertions, par exemple sur le temps de reponses ou le nombre de requetes par secondes : https://gatling.io/docs/current/general/assertions

Lancer un tir de charge

Lancer le tir

mvn -Dgatling.compilerJvmArgs="-Xmx256m" gatling:test

🐵 Vous pouvez suivre l’évolution des résultats du tir de charge en console pendant toute la durée du tir

Ouvrir le rapport du tir de charge Ce rapport est disponible via le lien en en console à la fin de l’éxecution du goal maven

Please open the following file: ..\Codelab-Chaos-TP\TP2-docker-gatling\target\gatling\basicsimulation-numero_de_simulation\index.html

Chaos-Monkey for Springboot : LATENCY

Redémarrer l’application avec des chaos-monkey activés sur nos différents micro-services

Configurer les variables d’environnement dans le fichier docker-compose.yml pour chaque service : Compétences, Collaborateur, Authentification et Clients

    environment:
        - SPRING_PROFILES_ACTIVE=chaos-monkey
        - CHAOS_MONKEY_ENABLED=true
        - CHAOS_MONKEY_LEVEL=10
        - CHAOS_MONKEY_KILL_APPLICATION_ACTIVE=false
        - CHAOS_MONKEY_LATENCY_ACTIVE=true
        - CHAOS_MONKEY_LATENCY_RANGE_START=800
        - CHAOS_MONKEY_LATENCY_RANGE_END=2000

Relancer l’application avec les nouvelles propriétés

docker-compose down
docker-compose up -d

Vérifier que les services ont bien démarrés avec Chaos-monkey dans les logs de démarrage

    docker container ps

    docker logs idDuContainer

    2020-01-03 14:25:20.895  INFO 1 --- [           main] d.c.s.b.c.monkey.component.ChaosMonkey   : 
         _____ _                       __  __             _
        / ____| |                     |  \/  |           | |
       | |    | |__   __ _  ___  ___  | \  / | ___  _ __ | | _____ _   _
       | |    | '_ \ / _` |/ _ \/ __| | |\/| |/ _ \| '_ \| |/ / _ | | | |
       | |____| | | | (_| | (_) \__ \ | |  | | (_) | | | |   |  __| |_| |
        \_____|_| |_|\__,_|\___/|___/ |_|  |_|\___/|_| |_|_|\_\___|\__, |
                                                                    __/ |
        _ready to do evil!                                         |___/
    
    :: Chaos Monkey for Spring Boot                                    ::

Gatling

Lancer un tir de charge

Lancer le tir

mvn -Dgatling.compilerJvmArgs="-Xmx256m" gatling:test

🐵 Pendant l’éxecution de ce tir ( 3 minutes), n’hesitez pas à poser des questions à vos speakers !

Ouvrir le rapport du tir de charge

Please open the following file: ..\Codelab-Chaos-TP\TP2-docker-gatling\target\gatling\basicsimulation-numero_de_simulation\index.html

Chaos-Monkey for Springboot : KILLING

Redémarrer l’application avec des chaos-monkey activés sur nos différents micro-services

Configurer les variables d’environnement dans le fichier docker-compose.yml pour chaque service : Compétences, Collaborateur, Authentification et Clients

    environment:
        - SPRING_PROFILES_ACTIVE=chaos-monkey
        - CHAOS_MONKEY_ENABLED=true
        - CHAOS_MONKEY_LEVEL=250
        - CHAOS_MONKEY_KILL_APPLICATION_ACTIVE=true
        - CHAOS_MONKEY_LATENCY_ACTIVE=true
        - CHAOS_MONKEY_LATENCY_RANGE_START=1000
        - CHAOS_MONKEY_LATENCY_RANGE_END=10000

Relancer l’application avec les nouvelles propriétés

docker-compose down
docker-compose up -d

Gatling

Lancer un tir de charge

Lancer le tir

mvn -Dgatling.compilerJvmArgs="-Xmx256m" gatling:test

Note : Ce tir de charge va durer 3 minutes, un tir de charge peut durer plusieurs heures !

Ouvrir le rapport du tir de charge

Please open the following file: ..\Codelab-Chaos-TP\TP2-docker-gatling\target\gatling\basicsimulation-numero_de_simulation\index.html

Conclusion et debriefing

🐵 N’oubliez pas de stopper votre application en local à la fin de ce tp

docker-compose down