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

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