Publié par et

Il y a 4 années -

Temps de lecture 2 minutes

Monitorer ses requêtes Spray

Dans le cadre de l’un de nos développements, nous avons mis en place une application basée sur Scala, Akka et Spray afin de communiquer avec une autre application.
Nous avons rapidement eu le besoin de monitorer les requêtes échangées entre ces deux applications. Pour cela Spray fournit un module de statistique. Dans cet article, nous allons voir sa mise en place.

1. Configuration

Voici les dépendances à importer avec SBT :

"io.spray" % "spray-can" % "1.3.1",
"io.spray" % "spray-http" % "1.3.1",
"io.spray" % "spray-httpx" % "1.3.1",
"io.spray" % "spray-routing" % "1.3.1"

Précision, nous utilisons Scala 2.10.

Pourquoi quatre dépendances me direz vous ? Tout simplement parce que Spray est découpé assez finement :

  • Les objets concernant les statistiques sont présents dans spray-can
  • Les "path" se retrouvent dans spray-routing
  • Le support du Json avec Spray est dans spray-httpx
  • Les media types sont dans spray-http

Nous devons activer les statistiques de Spray dans notre fichier application.conf :

spray.can {
    server {
      stats-support = on
    }
}

2. Utilisation

Nous allons créer un acteur qui va se charger d’afficher les statistiques :

class RestServiceActor extends RestService {
  implicit def actorRefFactory = ActorSystem("myApp")
  override def receiveActor = runRoute(rest)
}
trait RestService extends HttpService with spray.httpx.SprayJsonSupport {
 val actorListener: ActorSelection = actorRefFactory.actorSelection("/user/IO-HTTP/listener-0")
   val rest = respondWithMediaType(MediaTypes.`application/json`) {
    path("stats") {
         import JsonStats._
         get {
             complete {
                 actorListener.ask(Http.GetStats)(1.second).mapTo[Stats]
             }
         }
       }
   }
}

Quelques explications :

  • Nous utilisons la fonction runRoute de Spray qui exécute le endpoint passé en paramètre. La fonction rest fait référence à celle définie dans le trait RestService
  • Nous voulons retourner le résultat sous le format JSON
  • Nous retrouvons l’acteur HTTP listener sur lequel nous allons récupérer les statistiques (actorRefFactory.actorSelection("/user/IO-HTTP/listener-0"))
  • Nous demandons à cet acteur les statistiques ask(Http.GetStats) et effectuons un mapping sur l’objet Stats

Afin d’effectuer le mapping au format JSON, nous devons définir et importer l’objet JsonStats. Il définit des implicits permettant d’effectuer cette transformation.

object JsonStats extends Json4sSupport {
  implicit def json4sFormats: Formats = DefaultFormats
  implicit val statsMarshaller = json4sMarshaller[Stats]
}

Nous avons choisi d’utiliser la librairie json4s suivante :

"org.json4s" %% "json4s-native" % "3.2.9"

Cette dernière nous permet notamment d’utiliser la classe DefaultFormats afin de sérialiser et déserialiser nos objets.

Il ne reste plus qu’à lancer l’application et saisir l’url suivante : http://localhost:8080/stats

Nous avons alors accès aux statistiques suivantes :

{
    "uptime": {
        "length": 12556219319,
        "unit": {}
    },
    "totalRequests": 2,
    "openRequests": 1,
    "maxOpenRequests": 1,
    "totalConnections": 2,
    "openConnections": 2,
    "maxOpenConnections": 2,
    "requestTimeouts": 0
}

Il devient alors simple d’effectuer du monitoring et du tunning sur nos requêtes.

Publié par et

Publié par Nicolas Jozwiak

Nicolas est delivery manager disposant de 12 ans d’expérience en conception et développement. Son parcours chez un éditeur avant son entrée chez Xebia lui a notamment permis de développer de solides compétences dans le domaine de la qualité et de l’industrialisation (tests, intégration continue, gestion de configuration, contrôle qualité). Bénéficiant d’une expérience très solide de mise en place des méthodes agiles et d’accompagnement d’équipes sur le terrain, il s’attache à mettre à profit quotidiennement son expérience qui est reconnue pour son approche pragmatique, proactive et pédagogique.

Publié par Xebia France

Xebia est un cabinet de conseil international spécialisé dans les technologies Big Data, Web, les architectures Java et la mobilité dans des environnements agiles. Depuis plus de 11 ans nous avons la volonté de partager notre expertise et nos actualités à travers notre blog technique.

Commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Xebian, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.