Utilisation du StatsdBundle avec le composant Console

Utilisation du StatsdBundle avec le composant Console

Avatar for Cytron team Cytron team

Le StatsdBundle

Chez M6Web, nous [utilisons StatsD]({% post_url 2014-01-28-how-we-use-statsd %}) et nous avons créé un bundle pour cela. Ce bundle permet d’ajouter facilement des incréments et des timings dans StatsD sur des événements Symfony2.

De la Request à la console

Or pour des raisons de performances, lors des événements Symfony, les incréments et timings sont seulement stockés dans une variable et ne sont envoyés réellement à StatsD que pendant le kernel.terminate qui se déroule après l’envoi de la réponse HTTP au client. Ceci pose un problème pour les événements lancés depuis une commande Symfony puisque en console, il n’y pas de Request et donc pas de kernel.terminate. Nous avons envisagé d’utiliser l’événement console.terminate pour palier à cela, mais cela pose deux problèmes :

La première solution était donc d’appeler manuellement $container->get('m6_statsd')->send() dans la commande ou dans un ConsoleExceptionListener mais cela nous fait perdre le principal intérêt du StatsdBundle à savoir le découplage entre la commande et le client StatsD.

La seconde solution a donc été de modifier le StatsdBundle et d’ajouter une configuration au niveau de l’événement pour forcer l’envoi instantané des données.

Ainsi, avec la configuration suivante :

{% highlight yaml %} clients: event: console.exception: increment: mysite.command.<command.name>.exception immediate_send: true m6kernel.exception: increment: mysite.errors.<status_code> {% endhighlight %}

L’incrément mysite.command.<command.name>.exception sera envoyé en temps réel, alors que les autres comme mysite.errors.<status_code> continueront à être envoyés pendant kernel.terminate.