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

Avatar for Matthieu Guillermin

Matthieu Guillermin

October 28, 2016
Tweet

Other Decks in Programming

Transcript

  1. 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. Logs • Disponible dans toutes les applications • Très détaillé

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

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

    Service C Kamon Grafana system C* ES Kafka Kong
  5. // 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. 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. def userCreate(user: User) = { Tracer.withNewContext("userCreate", autoFinish = true) {

    validateUser(user) // ... } } def validateUser(user: User) = { Tracer.currentContext.withNewSegment("validateUser", "cat", "lib") { // ... } }
  8. 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. 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. 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. Alerting • Prévenir un incident - heap_usage > 90% -

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

    Graphite • Notifications • Slack • Twilio (SMS / Phone) http://cabotapp.com/
  13. Conclusion • Mettre en place de la métrologie • Investissement

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