Mon blog-notes à moi que j'ai

Blog personnel d'un sysadmin, tendance hacker

Zabbix conference 2015: Superviser 1 milliard de kilomètres mensuels de covoiturage

J’ai eu l’occasion de présenter l’architecture de supervision de BlaBlaCar lors de la Zabbix Conference 2015, qui s’est déroulée à Riga (Lettonie) les 11 & 12 septembre 2015.

J’ai pu y détailler les choix que nous avons réalisé. Voici un résumé de la présentation, dont la vidéo est disponible ici.

Jean Baptiste Favre durant la Conférence Zabbix 2015

Standardiser & industrialiser la supervision

Cela peut paraître évident, mais la définition et l’utilisation de standards, doublé d’une gestion de configuration industrielle est un pré-requis à une supervision réellement efficace.
Pour cela, nous avons implémenté le protocole Zabbix Sender dans les 2 principaux langages utilisés pour le monitoring chez BlaBlaCar: Python et Java.

python-protobix

Projet personnel au départ, python-protobix s’est transformé en pierre angulaire de la supervision chez BlaBlaCar.
Toutes les sondes python utilisent donc python-protobix ce qui permet l’envoi des métriques vers le serveur Zabbix avec des performances impressionnantes grâce à l’utilisation des items de type trapper.

Le module implémente le protocole Zabbix Sender et permet donc d’offrir une interface aux sondes permettant l’abstraction des interactions avec le serveur Zabbix.
Il devient très facile, et rapide, de développer une nouvelle sonde puisque les aspects purement Zabbix sont gérés par le module.

La mise à disposition publique de la version 0.0.9 de python-protobix, déjà en production chez BlaBlaCar, est prévue pour fin septembre.

Les sondes utilisant python-protobix sont elles aussi publiquement disponibles.

jmx-zabbix

Implémentation Java du protocole Zabbix Sender, jmx-zabbix est le pendant de python-protobix pour le monde Java. Il a été développé par Arnaud Lemaire.
jmx-zabbix utilise la JMX pour accéder aux métriques du processus Java, afin d’éviter un couplage trop important entre le service Java et le monitoring.

Il peut être soit intégré au processus Java sous la forme d’une bibliothèque, soit être exécuté comme un service autonome. Nous l’utilisons dans le premier cas de figure pour superviser les applications Java développés en interne, dans le second cas pour les autres applications (Cassandra, Elasticsearch, etc…).

Il nécessite un fichier de configuration pour réaliser la traduction des métriques JMX en items Zabbix.

Industrialisation

Les entreprises, et c’est heureux, utilisent de plus en plus systématiquement un système de gestion des configurations.
BlaBlaCar n’échappe pas à la règle: nous utilisons Chef.

Il devient dès lors tentant de configurer Zabbix à partir du gestionnaire de configuration. Par exemple, l’ajout d’un serveur dans Zabbix, même si l’auto enregistrement existe, son ajout à un ou plusieurs groupes de serveurs de même que l’application de tel ou tel template est naturellement envisageable.
C’est d’autant plus tentant que Zabbix dispose d’une API permettant de réaliser toutes ces opérations. De plus, dans la mesure où Chef déploie et configure les sondes, il est par définition bien placé pour savoir quel template appliquer à une machine.

Cette manière de faire est, à l’heure actuelle, encore en expérimentation chez BlaBlaCar. Les premiers résultats sont bien sûr encourageant et devraient conduire à la généralisation de la procédure.

Utiliser le Low Level Discovery & les trappers Zabbix

Le passage à l’échelle de la supervision est largement facilité par ses performances. Pour cela, Zabbix offre 2 fonctionnalités:

  1. Le Low Level Discovery
  2. Le protocole Zabbix Sender qui permet l’envoi des métriques en masse, que l’on appelle aussi mode trapper.
    Côté serveur, les items doivent avoir le type Zabbix trapper.

Low Level discovery

Cette fonctionnalité de découverte « bas niveau » permet essentiellement 2 choses:

  1. découvrir dynamiquement des « objets » sur lesquels on veut appliquer les même métriques. Par exemple, des files d’attente RabbitMQ, des pool PHP-FPM, etc… cette fonctionnalité est utilisée par Zabbix pour découvrir les interface réseaux d’une machine, ainsi que les points de montage disques
  2. activer des items en fonction de la configuration. Nous l’utilisons ainsi pour détecter la présence, ou non, de Galera sur nos serveurs MariaDB. Ceci permet essentiellement de simplifier la mise au point et la gestion des templates

Le second cas d’utilisation n’est, à ma connaissance, pas publiquement utilisé, mais c’est une manière de faire qui s’est révélée particulièrement pratique et efficace chez BlaBlaCar.

Zabbix trappers

Les items trapper sont au cœur du monitoring chez BlaBlaCar. Ils permettent aux différentes sondes de réaliser le relever, préparer la liste d’items, et les envoyer au serveur à l’aide d’une seule et unique connexion TCP.
Il s’agit de la façon la plus performante pour gérer la collecte des métriques. Le second avantage de cette méthode et que cela évite un couplage trop important entre la sonde et Zabbix, modulo le format (JSON) qui est spécifique à Zabbix.

À titre d’exemple, on mentionnera que nos plus gros serveurs, en nombre de métriques, voient leurs métriques (environ un millier chaque minute) prises en compte par le serveur Zabbix en un peu moins de 300ms.

La visualisation est critique

La collecte et le stockage des métriques est une chose, leur exploitation en est une autre.
Il est possible de se limiter à la définition de seuils d’alerte, mais il est aussi souhaitable de faire en sorte que les métriques soient exploitées par les gens qui en ont besoin. Pour cela, la visualisation est critique.

Malheureusement, mon expérience motintre que l’interface Zabbix pèche un peu dans ce domaine. La plupart des développeurs & sysadmins que je fréquente ne sont pas à l’aise avec l’interface Web de Zabbix. En cause, notamment, la difficulté de définir un tableau de bord avec des critères suffisamment souples.
Afin d’assurer l’adoption d’un outil qui, par ailleurs, donne entière satisfaction, il fallait donc trouver une solution.

Cette solution a été trouvée, il s’agit de Grafana, adossé à une source de données adaptée à zabbix: grafana-zabbix.

Cette solution fonctionne parfaitement bien. Les dernières version de Grafana intègre même le support de l’authentification LDAP ce qui simplifie grandement la gestion des utilisateurs.

Les slides

Les diapos sont disponibles en ligne:

  • sur Speakerdeck
  • sur Slideshare

mais également :

La video