Suivi des mésortingques à l’aide de StatsD (via etsy) et de Graphite, les graphites ne semblent pas représenter graphiquement toutes les données

Nous avons une mésortingque que nous incrémentons chaque fois qu’un utilisateur effectue une certaine action sur notre site Web, mais les graphiques ne semblent pas être précis.

Alors, partant de ce pressentiment, nous avons investi le updates.log de carbone et découvert que l’action s’était déroulée plus de 4 000 fois aujourd’hui (en utilisant grep et wc), mais selon le résultat intégral du graphique, il n’a retourné que 220%.

Quelle pourrait en être la cause? Les données sont transmises à statsd à l’aide de la bibliothèque statsd php, et en appelant statsd::increment('mesortingc'); Comme indiqué ci-dessus, le journal confirme que plus de 4 000 mises à jour de cette clé ont été effectuées aujourd’hui.

Nous utilisons:

graphite 0.9.6 avec statsD (etsy)

Après avoir posté mon commentaire ci-dessus, j’ai découvert que Graphite 0.9.9 avait un (nouveau?) Fichier de configuration, storage-aggregation.conf, dans lequel on peut contrôler la méthode d’agrégation par modèle. Les options disponibles sont moyenne, sum, min, max et dernière.

http://readthedocs.org/docs/graphite/en/latest/config-carbon.html#storage-aggregation-conf

Après quelques recherches dans la documentation et des conversations avec d’autres, j’ai trouvé le problème – et la solution.

De la manière dont le format de fichier chuchoteur est conçu, il est prévu que vous (ou votre application) publiez des mises à jour pas plus rapidement que l’intervalle minimal dans votre fichier storage-schemas.conf . Ce fichier est utilisé pour configurer la quantité de rétention de données dont vous disposez à différentes résolutions d’intervalle de temps.

Mon fichier storage-schemas.conf été défini avec un temps de rétention minimum de 1 minute. Le démon StatsD par défaut (d’ETSY) est conçu pour mettre à jour Carbon (le démon graphite) toutes les 10 secondes. Cela est dû à un problème: sur une période de 60 secondes, StatsD signale 6 fois, chaque écriture écrase la dernière (dans cet intervalle de 60 secondes, car la mise à jour est plus rapide qu’une fois par minute). Cela produit des résultats vraiment étranges sur votre graphique car les 10 dernières secondes d’une minute pourraient être complètement inactives et indiquer un 0 pour l’activité de cette période, ce qui aurait pour effet de détruire complètement toutes les données que vous aviez écrites pour cette minute.

Pour résoudre ce problème, j’ai dû reconfigurer mon fichier storage-schemas.conf afin qu’il stocke les données à une résolution maximale de 10 secondes. Ainsi, chaque mise à jour de StatsD serait sauvegardée dans la firebase database silencieuse sans être écrasée.

Etsy a publié la configuration de storage-schemas.conf utilisée pour l’installation de carbone, qui ressemble à ceci:

 [stats] priority = 110 pattern = ^stats\..* retentions = 10:2160,60:10080,600:262974 

Cela a un temps de rétention minimum de 10 secondes et en stocke 6 heures. Cependant, en raison de mon prochain problème, j’ai considérablement allongé les délais de conservation.

En laissant ces données collecter pendant quelques jours, j’ai remarqué qu’elles semblaient toujours inactives (et sous-déclarées). Cela était dû à 2 problèmes.

  1. StatsD (anciennes versions) n’a signalé qu’un nombre moyen d’événements par seconde pour chaque période de rapport de 10 secondes. Cela signifie que si vous incrémentiez une clé 100 fois en 1 seconde et 0 fois pour les 9 prochaines secondes, à la fin de la 10ème seconde, statsD afficherait 10 au graphite au lieu de 100. (100/10 = 10). Cela n’a pas permis de signaler le nombre total d’événements pendant une période de 10 secondes (évidemment).

    Les versions les plus récentes de statsD corrigent ce problème en introduisant le stats_counts , qui enregistre le nombre total d’événements par mésortingque pour chaque période de 10 secondes (ainsi, au lieu de signaler 10 dans l’exemple précédent, il en rapporte 100).

    Après avoir mis à niveau StatsD, j’ai remarqué que les 6 dernières heures de données paraissaient superbes, mais j’ai regardé au-delà de ces dernières – les choses semblaient étranges et la raison suivante est la raison pour laquelle:

  2. Lorsque le graphite stocke des données, il déplace les données d’une rétention de haute précision à une rétention de précision inférieure. Cela signifie storage-schemas.conf utilisant l’exemple etsy storage-schemas.conf , après 6 heures de précision 10 secondes, les données ont été déplacées à une précision de 60 secondes (1 minute). Afin de déplacer 6 points de données d’une précision de 10s à 60s, le graphite effectue une moyenne des 6 points de données. Donc, il prendrait la valeur totale des 6 points de données les plus anciens et diviserait par 6. Cela donne un nombre moyen d’événements par 10 secondes pour cette période de 60 secondes (et non le nombre total d’événements, ce qui nous importe sur spécifiquement).

    C’est la façon dont le graphite est conçu. Dans certains cas, cela peut être utile, mais dans notre cas, ce n’est pas ce que nous voulions. Pour “résoudre” ce problème, j’ai augmenté notre délai de conservation de précision de 10 secondes à 60 jours. Au-delà de 60 jours, je stocke les précisions minutieuses et minutieuses, mais elles sont essentiellement là pour rien, car ces données ne nous sont pas aussi utiles.

J’espère que cela aide quelqu’un, je sais que cela m’a agacé pendant quelques jours – et je sais qu’il n’y a pas beaucoup de gens qui utilisent cette stack de logiciels à cette fin. Il a donc fallu un peu de recherche pour vraiment comprendre ce qui se passait et comment obtenir un résultat que je voulais.