Coda Hale Metrics

« Mesurez vos performances ! »

... enfin surtout celles de votre application

Moi ?

Damien Raude-Morvan

Damien Raude-Morvan

Dictanova

Customer Intelligence

  • Que disent les internautes de ma marque ?
  • Comment en parlent-ils ?
  • Avec quel degré d'implication ?
  • Où en parlent-ils ?
  • Quelles sont les prises de paroles les plus représentatives ?

Performances ?

Avant d'optimiser, mesurer !

“We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.”

Donald Knuth, 1974

Mesurer le comportement

... plutôt que les performances

  • Monitoring Driven Development
  • Concevoir les métriques en même temps que le traitement
  • Obtenir rapidement une couverture des fonctions critiques

Combien d'erreurs est-ce que nos utilisateurs observent ?

Est-ce que notre application est assez rapide ?

Est-ce que nos projections d'usages sont correctes ?

Metrics

  • Framework Java
  • Permet d'obtenir des indicateurs métiers, sur la production
  • Développé par Coda Hale, pour Yammer
  • Gouvernance assurée par la communauté Dropwizard

Types de mesures

Gauge

La valeur instantanée d'un attribut.

  • nombre de jobs en file d'attente
metrics.register(name(QueueManager.class, name, "size"),
    new Gauge>Integer<() {
        public Integer getValue() {
                return queue.size();
        }
});

Counter

Une valeur que l'on peut incrémenter ou décrémenter.

  • nombre de jobs actifs
metrics.counter("pending-jobs");

    public void addJob(Job job) {
        pendingJobs.inc();
        queue.offer(job);
    }

    public Job takeJob() {
        pendingJobs.dec();
        return queue.take();
    }

Meter

Nombre moyen d'événements sur une période de temps

  • nombre de requêtes par seconde
private final Meter requests = metrics.meter("requests");

    public void handleRequest(Request request, Response response) {
        requests.mark();
        // etc
    }

Histogram

Distribution des valeurs dans un flux de données.

  • nombre de résulats retournés par une requête
private final Histogram resultCounts = metrics.histogram("result-counts");

    public Collection<Result> search(Request parameters) {
        // compute
        resultCounts.update(results.size());
        return results;
    }

Timer

Histogram + Meter = ♥

Durée et fréquence d'un événement sur une période de temps

final Timer timer = registry.timer("get-requests");
...
final Timer.Context context = timer.time();
try {
    // handle request
} finally {
    context.stop();
}

Intégration

Reporting

  • Console stdout
  • CSV
  • JMX
  • HTTP via Servlets
  • Graphite
  • Ganglia

Glue avec vos frameworks

Monitoring-as-a-Service

Bonnes pratiques

Donner des noms significatifs aux métriques

Créer des métriques....

... et surtout suivre leurs variations

Avoir des données chiffrées comme base de réflexion

Si cela affecte votre chiffre d'affaire, mesurez le !

Quelques exemples concrets

  • Vos API REST: utilisation de Timer
  • Requêtes MySQL ? MongoDB ?: Timer
  • Appels à des services externes: Timer
  • Dimension de vos requêtes: Histogram
    • Nombre d'octets téléchargés
    • Nombre de critères de recherche
    • Nombre de résultats de recherche

Demo time !

Source disponibles sur Github :

https://github.com/drazzib/metrics-sample

Crédits

Images d'illustrations en provenance de Flickr (CC-BY) :

Altemark | Becky Stern | boulter | Docklandsboy | jbcarre | jockew | mwichary | poster_boy | tanakawho