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

Transcript

  1. 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 ? »
  2. 4.

    Logs • Disponible dans toutes les applications • Très détaillé

    • Difficile à exploiter • Difficile d'avoir une vision synthétique
  3. 5.

    Métriques • Valeurs numériques • Facile à stocker • Facile

    à exploiter • Affichage • Triggers / Alertes
  4. 6.

    Statsd / Graphite Cabot Service A Kamon Service B Kamon

    Service C Kamon Grafana system C* ES Kafka Kong
  5. 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) // ... }
  6. 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() }
  7. 13.

    def userCreate(user: User) = { Tracer.withNewContext("userCreate", autoFinish = true) {

    validateUser(user) // ... } } def validateUser(user: User) = { Tracer.currentContext.withNewSegment("validateUser", "cat", "lib") { // ... } }
  8. 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,...
  9. 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))) } } }
  10. 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 } }
  11. 20.
  12. 21.
  13. 22.
  14. 23.
  15. 24.
  16. 25.

    Alerting • Prévenir un incident - heap_usage > 90% -

    disk_free < 10% - response_time > 200ms
  17. 26.

    Cabot • Services / Checks • ICMP / HTTP /

    Graphite • Notifications • Slack • Twilio (SMS / Phone) http://cabotapp.com/
  18. 27.
  19. 28.
  20. 29.
  21. 30.
  22. 31.

    Conclusion • Mettre en place de la métrologie • Investissement

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