Upgrade to Pro — share decks privately, control downloads, hide ads and more …

La métrologie dans les applications Scala

La métrologie dans les applications Scala

Talk Scala.IO 2016

Ad8ea6b4c41d471967ea1bc7ccaa102b?s=128

Matthieu Guillermin

October 28, 2016
Tweet

Other Decks in Programming

Transcript

  1. La métrologie dans les applications Scala Matthieu Guillermin Scala.IO 2016

  2. Matthieu Guillermin Lead Dev Brainify - Analytics e-commerce

  3. Est-ce que mon service fonctionne ? Est-ce que les temps

    de réponse sont corrects ? Est-ce que mon service renvoie des erreurs 500 ? Il y a beaucoup d'erreurs, qu'est-ce qui cloche ? « Ça fait 1 heure que l'appli ne fonctionne plus, qu'est-ce qu'il se passe ? »
  4. Logs • Disponible dans toutes les applications • Très détaillé

    • Difficile à exploiter • Difficile d'avoir une vision synthétique
  5. Métriques • Valeurs numériques • Facile à stocker • Facile

    à exploiter • Affichage • Triggers / Alertes
  6. Statsd / Graphite Cabot Service A Kamon Service B Kamon

    Service C Kamon Grafana system C* ES Kafka Kong
  7. Enregistrement des métriques

  8. Kamon • JVM / Scala • Reactive-friendly • Modulaire •

    http://kamon.io
  9. Kamon - Metrics • Flush interval • Instruments • Counter

    • Histogram • ...
  10. // Counter val authCounter = Kamon.metrics.counter("auth") def auth(username: String, password:

    String) = { authCounter.increment() // ... } // Histogram val docSizeHistogram = Kamon.metrics.histogram("doc-size") def storeDocument(doc: Document) = { docSizeHistogram.record(doc.size) // ... }
  11. Kamon - Trace • Enregistrement du "temps passé" • Granularité

    : Traces / Segments
  12. def userCreate(user: User) = { val context = Kamon.tracer.newContext("userCreate") //

    ... validateUser(user) // ... context.finish() } def validateUser(user: User) = { val segment = Tracer.currentContext.startSegment("validateUser", "myCategory", "myLib") // ... segment.finish() }
  13. def userCreate(user: User) = { Tracer.withNewContext("userCreate", autoFinish = true) {

    validateUser(user) // ... } } def validateUser(user: User) = { Tracer.currentContext.withNewSegment("validateUser", "cat", "lib") { // ... } }
  14. def notifyUser(user: User) = { Tracer.currentContext.withNewAsyncSegment("notifyUser", "cat", "lib") { sendEmail(user.email)

    // sendEmail() is returning a Future } }
  15. Kamon - Intégrations • JVM : • Heap, GC, ...

    • Akka : Metrics sur Actor, Router, Dispatcher • Ex : time-in-mailbox, processing-time, errors,... • Play : Metrics sur requêtes HTTP • Ex : requêtes entrantes, WSClient,...
  16. class User @Inject()(val userService: UserService) extends Controller { def create(username:

    String, password: String) = TraceName("user-create") { Action.async { userService.create(username, password) .map(user => Ok(Json.toJson(user))) } } }
  17. kamon { statsd { hostname = my.statsd.server flush-interval = 1

    minute simple-metric-key-generator { application = "my-service" } } metric { tick-interval = 1 minute filters { akka-actor { includes = ["application/user/**"] # excludes = [] } } } system-metrics { sigar-enabled = false jmx-enabled = true } }
  18. Visualisation des métriques

  19. Grafana • Visualisation des métriques • Dashboards • Templating /

    annotations • http://grafana.org/
  20. None
  21. None
  22. None
  23. Alerting

  24. Alerting • Etre alerté d'un incident - hits / last

    2 minutes = 0 - 2xx_status = 0
  25. Alerting • Prévenir un incident - heap_usage > 90% -

    disk_free < 10% - response_time > 200ms
  26. Cabot • Services / Checks • ICMP / HTTP /

    Graphite • Notifications • Slack • Twilio (SMS / Phone) http://cabotapp.com/
  27. None
  28. None
  29. None
  30. None
  31. Conclusion • Mettre en place de la métrologie • Investissement

    qui en vaut la peine • Simple • Dev + Ops • Processus itératif