technique:monitoring:influxdb:metrics_influxdb

Collecte de métriques

Picasoft héberge plusieurs services sur son infrastructure. Ces différents logiciel, ainsi que les machines elle-mêmes, peuvent produire un certain nombre de métrique sur leur utilisation ou leur état. Quelques exemples :

  • La température CPU d’un serveur physique
  • Le nombre d’utilisateurs sur Mattermost
  • Le nombre de pad crées sur Etherpad
  • L’utilisation RAM d’une machine virtuelle

Il est intéressant de collecteur ces mesures et de les stocker, pour ensuite les afficher sous forme graphique et pouvoir observer leur évolution dans le temps. Bien entendu, il ne s’agit pas de collecter des données sur l’utilisation personnelle des services, mais bien de mesurer l’état de notre infrastructure dans son ensemble pour en connaître son évolution.

Pour le stockage de métriques, on utilise généralement ce qui s’appelle une Time series database (ou TSDB). Ce sont des bases de données qui sont orientées pour stocker et manipuler des données temporelles, des Time series, c’est à dire une suite de points. Chaque point de la série est associé à un instant donné.
Par exemple on peut imaginer une série cpu_temp qui va contenir la mesure de température du CPU. La série sera remplie avec des points ayant pour date le timestamp du moment de la mesure et pour valeur la température du CPU.

Il existe plusieurs TSDB, chacune avec des avantages et des inconvénients. Pour Picasoft, nous avons choisi InfluxDB qui est une TSDB libre et open-source maintenue par la société InfluxData. Sa version ouverte convient très bien à notre cas d’utilisation (simple) : écrire et lire une série de points pour différentes métriques.

Pour notre déploiement de InfluxDB, nous avons les besoins suivants :

  • déploiement avec Docker
  • utilisation derrière notre reverse-proxy Traefik pour la gestion du HTTPS
  • gestion des droits d’accès en lecture et écriture (pour ne pas ouvrir notre base sur le grand internet mondial)

InfluxDB est relativement simple à déployer dans la mesure où une image Docker officielle très complète existe déjà. De plus tout peut se faire derrière une API HTTP (qui est donc exposée derrière Traefik, en HTTPS) et il est possible de créer des utilisateurs avec des droits d’administration, d’écriture ou de lecture sur différentes bases de données.

Picasoft a donc fait sa propre image Docker, qui est rien de plus qu’une copie de l’image officielle (qui fait déjà le café). Le README explique comment utiliser l’image.

On déploie donc notre InfluxDB sur la VM monitoring, en lui donnant les informations suivantes :

  • la base de donnée à créer
  • des utilisateurs/mot de passe à créer avec des droits spécifiques
  • les labels qui vont bien pour exposer le service derrière Traefik
  • un volume pour avoir une persistance des données

On obtient un service Docker Compose comme celui-ci :

influxdb:
  image: registry.picasoft.net:5000/influxdb:1.6-1
  container_name: influxdb
  volumes:
    - /DATA/docker/influxdb:/var/lib/influxdb
  environment:
    - INFLUXDB_DB=databasename
    - INFLUXDB_HTTP_AUTH_ENABLED=true
    - INFLUXDB_ADMIN_USER=admin_user_name
    - INFLUXDB_ADMIN_PASSWORD=admin_user_password
    - INFLUXDB_WRITE_USER=write_user_name
    - INFLUXDB_WRITE_USER_PASSWORD=write_user_password
    - INFLUXDB_READ_USER=read_user_name
    - INFLUXDB_READ_USER_PASSWORD=read_user_password 
  labels:
    - "traefik.frontend.rule=Host:influxdb.picasoft.net"
    - "traefik.port=8086"
    - "traefik.enable=true"
  restart: always

InfluxDB est ensuite directement utilisable via son API HTTP sur https://influxdb.picasoft.net. L’utilisation de l’API ne sera pas détaillé ici mais la documentation de InfluxDB propose des ressources très complètes :

La base de donnée étant prête, il faut maintenant remonter les métriques des différents services. Pour cela un script en Python a été développé : le picasoft-metrics-bot. Il a été conçu de manière assez modulaire, pour permettre facilement l’ajout d’autres services. Son principe de fonctionnement est simple : on lui donne (par fichier de configuration) des informations sur les services, et il va se charger de collecter les informations puis de les pousser dans la base InfluxDB.

Pour le moment, il contient un module pour Etherpad et un module pour Mattermost. Le fonctionnement du script, des modules, et de leur développement est largement documenté dans le README.

Le bot a un Dockerfile que l’on utilise pour build une image Docker de celui-ci. On le déploie ensuite sur la VM monitoring. Le conteneur va simplement lancer le script à intervalle régulier (dans notre cas, toutes les 60 secondes), poussant ainsi des métriques régulièrement dans InfluxDB.

picasoft-metrics-bot:
  image: registry.picasoft.net:5000/picasoft-metrics-bot:1.0.0
  container_name: picasoft-metrics-bot
  volumes:
    - /DATA/docker/picasoft-metrics-bot/config/config.json:/code/config/config.json
  environment:
    - INTERVAL_SECONDS=60
  restart: always

Maintenant que la base InfluxDB se remplie avec les métriques de nos services, on souhaite pouvoir les visualiser. Une solution logicielle très largement répandue est Grafana. C’est un logiciel libre qui permet de réaliser un vaste panel de graphiques différents en se connectant à différents types de TSDB, le tout dans une interface Web avec un accès fin des droits de lecture et écriture des dashboards.

Pour notre déploiement de Grafana, nous avons les besoins suivants :

  • déploiement avec Docker
  • utilisation derrière notre reverse-proxy Traefik pour la gestion du HTTPS
  • gestion des droits d’accès en lecture et écriture

Grafana est relativement simple à déployer dans la mesure où une image Docker officielle très complète existe déjà. Tout se passe via une interface Web donc le service est simple à exposer derrière Traefik, et il est possible de créer des utilisateurs et de gérer les droits d’accès aux différentes parties de Grafana.

Picasoft a donc fait sa propre image Docker, qui est rien de plus qu’une copie de l’image officielle. Le README explique comment utiliser l’image.

On déploie donc notre Grafana sur la VM monitoring, en lui donnant les informations suivantes :

  • le nom et l’URL de l’instance
  • un utilisateur/mot de passe d’administration a créer automatiquement
  • les labels qui vont bien pour exposer le service derrière Traefik
  • un volume pour avoir une persistance des données

On obtient un service Docker Compose comme celui-ci :

grafana:
  image: registry.picasoft.net:5000/grafana:5.2.4-1
  container_name: grafana
  volumes:
    - /DATA/docker/grafana:/var/lib/grafana
  environment:
    - GF_DEFAULT_INSTANCE_NAME=picasoft
    - GF_SERVER_ROOT_URL=https://grafana.picasoft.net
    - GF_SECURITY_ADMIN_USER=admin_user_name
    - GF_SECURITY_ADMIN_PASSWORD=admin_user_password
  labels:
    - "traefik.frontend.rule=Host:grafana.picasoft.net"
    - "traefik.port=3000"
    - "traefik.enable=true"
  restart: always

Comme Grafana s’execute en utilisateur non-root, il faudra correctement donner les droits d’accès au volume qui est monté. L’utilisateur de Grafana a l’UID/GID 472, on fait donc mkdir -p /DATA/docker/grafana && chown 472:472 /DATA/docker/grafana

Une fois l’instance déployée, on peut se connecter dessus à l’aide des identifiants d’administration et commencer à configurer Grafana.

Il y a 2 concepts importants à comprendre dans Grafana : les datasources et les dashboards.
Les datasources sont, comme le nom l’indique, des sources de données pour Grafana. Ce sont des connecteurs qui peuvent se connecter à un grand nombre de base de données : InfluxDB, Prometheus, OpenTSDB, etc.
Les dashboards sont tout simplement des vues sur lesquelles il est possible de mettre plusieurs graphiques à visualiser.

Datasources

Dans notre cas, Picasoft a simplement configuré un datasource de type InfluxDB. Il suffit de lui indiquer l’URL de InfluxDB ainsi que les identifiants permettant de lire la base de donnée. Il est important de spécifier, pour des raisons de sécurité, des accès en lecture seule à Grafana puisqu’il n’y a pas besoin d’aller écrire dans la base.

Dashboards

Pour Picasoft, il convient de créer un dashboard pour chaque service, et d’y afficher l’ensemble des métriques du service. Nous n’allons pas entrer dans le détail sur la configuration de dashboards Grafana ici, car la documentation est relativement complète.

Quelques ressources :

  • technique/monitoring/influxdb/metrics_influxdb.1581002903.txt.gz
  • de qduchemi