Suite à la demande d’un client de réaliser un test de charge sur une infrastructure de production, nous avons eu besoin de nous tourner vers une solution de monitoring.
Bien qu’actuellement nous utilisons Nagios, celui-ci ne convenait pas dans ce contexte. En effet, nous avions besoin de récolter des données en temps réel, mais surtout l’état de l’infrastructure à chaque seconde, chose que la majorité des outils de monitoring ne permettent pas (Nagios, Cacti, etc.). C’est pourquoi nous nous sommes tournés vers le trio Telegraf, Chronograf et InfluxDB, qui sont des outils en open-sources proposés par influxdata.
InfluxDB, est une base de données de série temporelle. Ce type de base de données a émergé principalement grâce à l’IoT. Contrairement à une base de données de type MySQL où l’ID entier est la clé d’un point, ici nous avons le timestamp. Celle-ci va donc se charger de stocker l’ensemble de nos données. Nous allons voir plus loin dans cet article comment mettre en place de manière automatique une rétention des données afin de garder sa vitesse de traitement, mais aussi pour ne pas stocker des données devenues inutiles.
Telegraf est un collecteur, qui va se charger de récupérer les différentes informations – charge CPU, consommation de mémoire, load average, etc. – des serveurs à intervalles réguliers (dans notre cas toute les secondes). Ensuite, il va se charger de transmettre ces données vers InfluxDB.
Chronograf quant à lui est un système de visualisation de données. Il va venir se connecter à notre base de données InfluxDB et nous proposer la création de graphiques à l’aide des données récupérées. Il permet également la création de dashboards. Dans notre cas, cela permet de regrouper les visualisations des différends serveurs sur un dashboard dédié.
Installation d’InfluxDB
Ajout des repos d’InfluxData
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian jessie stable" > /etc/apt/sources.list.d/influxdb.list
On met à jour et on installe InfluxDB
apt update
apt install influxdb
On créé une base de donnée dédiée à Telegraf
influx
CREATE DATABASE telegraf;
CREATE USER telegraf WITH PASSWORD 'password';
GRANT ALL ON telegraf TO telegraf;
Mettre en place la rétention des données
Dans notre cas, nous n’avons pas besoin de garder les données plus de 45 jours, nous avons donc mis la rétention des données à 45 jours, mais il suffit de modifier la valeur dans la commande ci-dessous. Évidemment, cette étape n’est pas obligatoire, si vous ne souhaitez pas en mettre en place, passez simplement à l’étape suivante.
CREATE RETENTION POLICY auto_delete ON telegraf DURATION 45d REPLICATION 1 DEFAULT
Mettre en place un proxy apache pour InfluxDB
Afin de ne pas ouvrir de port, nous avons mis en place un proxy apache vers le localhost:8086, cela nous permet d’avoir une URL plus jolie, mais aussi de passer l’ensemble des requêtes vers InfluxDB en https. Pour ce faire, il suffit de faire votre virtualhost comme à votre habitude, mais en rajoutant les paramètres suivants :
ProxyPreserveHost On
ProxyPass / http://localhost:8086/
ProxyPassReverse / http://localhost:8086/
Installation de Telegraf
Telegraf étant sur les repos d’InfluxData, nous pouvons directement l’installer. Dans cet exemple, nous allons l’installer sur une autre machine, mais celui-ci peux être installé sur la même machine qu’InfluxDB, comme il peut l’être sur un nombre illimité d’autres machines.
apt install telegraf
Configuration de Telegraf
Nous allons partir sur un fichier de configuration vierge afin de n’y mettre que ce qui nous intéresse.
mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.save
nano /etc/telegraf/telegraf.conf
N’oubliez pas de remplacer l’hostname qui nous permettra par la suite de reconnaître les machines entre elles. Ou de modifier l’interval si vous n’avez pas besoin d’avoir des laps de temps aussi court entre chaque mesure.
[tags]
[agent]
flush_buffer_when_full = true
flush_interval = "15s"
flush_jitter = "0s"
hostname = "server.domain.tld"
interval = "1s"
round_interval = true
Configuration de l’output de Telegraf vers InfluxDB
nano /etc/telegraf/telegraf.d/outputs.conf
On vient définir les informations définies plus haut, tel que l’URL de notre proxy apache, le nom d’utilisateur et mot de passe d’InfluxDB que nous avons créé précédemment.
[[outputs.influxdb]]
database = "telegraf"
precision = "s"
urls = [ "https://server.domain.tld" ]
username = "telegraf"
password = "password"
Configuration des inputs de Telegraf
nano /etc/telegraf/telegraf.d/inputs_system.conf
Il est possible de récupérer un peu toutes sortes de données selon nos besoins. InfluxData fourni plusieurs plugins qui sont intégrés de base, il suffit de les renseigner dans le fichier de configuration. Dans notre exemple, nous allons rester sur des metrics basiques.
[[inputs.cpu]]
percpu = false
totalcpu = true
[[inputs.mem]]
[[inputs.netstat]]
[[inputs.processes]]
[[inputs.system]]
[[inputs.disk]]
On vérifie qu’il n’y a pas d’erreur dans notre configuration avant de redémarrer Telegraf
telegraf -test -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d
Si il n’y pas d’erreurs, on redémarre le processus pour prendre en compte les modifications
service telegraf restart
Installation de Chronograf
apt install chronograf
service chronograf start
Par défaut, Chronograf tourne sur le port 10000. Comme pour InfluxDB, nous avons mis en place un proxy apache afin d’avoir une URL plus friendly et d’ajouter un système d’authentification par-dessus, ce que ne propose pas Chronograf.
Après, il vous suffit de vous rendre sur votre URL, la première étape sera de rentrer les informations d’accès à la base de données InfluxDB (hostname, nom d’utilisateur et mot de passe) que nous avons créé au tout début. Et pour terminer, à vous de vous amuser en ajoutant des visualisations en fonction de vos besoins !
Avantages et inconvénients de cette solution
La solution est vraiment puissante puisqu’elle permet la remontée de données précises tout en ayant des consommations ressources très faibles, qui passent inaperçues. De plus, le temps de génération des graphiques – même avec beaucoup de données – est très rapide : nous allons sous peu intégrer l’ensemble de notre infrastructure sur celle-ci. Malheureusement la solution étant encore récente, on retrouve quelques limitations comme l’impossibilité de définir le nom d’une courbe.
Et vous, quelle solution employez-vous pour mesurer un test de charge ?