Construire un Dashboard Open-data avec Docker, Elasticsearch et Kibana

Contexte

Dans le cadre d’un atelier dédié à Docker et Elasticsearch, nous avons décidé d’implémenter un dashboard permettant de visualiser les données Open — data libérées par l’INSEE, qui recensent les données économiques françaises, ventilées par ilot géographique (qu’on appelle Iris).

Dans un premier temps, l’objectif de cet atelier est de mettre à disposition des participants les outils nécessaires pour construire une plateforme unifiée, quelque soit leur machine ou leur système d’exploitation, grâce à Docker.

Par la suite, chaque participant aura la liberté d’aller requêter et visualiser les données qu’il souhaite, en construisant simplement son dashboard, en quelques clics. Pour cela, nous utiliserons Kibana.

Dashboard réalisé avec Kibana

Concevoir un environnement de travail unifié

Comme nous l’indiquions, Docker est l’outil idéal pour réaliser cette plateforme unifiée, quelque soient les machines des participants et leurs OS. Nous allons donc compiler un container Docker dans laquelle nous construirons un environnement Ubuntu et nous lui ajouterons de manière automatisée tous les prérequis nécessaires pour exécuter notre code (python, node, etc.). Cette approche a le gros avantage de ne compiler qu’une seule fois cette image, et de la mettre à disposition d’autres développeurs via le Docker Hub, qui pourront directement l’utiliser.

Pour monter cette nouvelle image et y installer les outils dont nous aurons besoin, il suffit de définir dans un Dockerfile le contenu de cette image:

Ce fichier est la recette de construction de l’environnement de travail. Dans cet exemple, on part d’une base ubuntu et on y exécute des commandes RUN pour installer les outils nécessaires (python et nodeJs principalement), en utilisant les utilitaires d’installation de ubuntu. Au moment de la compilation, une machine virtuelle ubuntu va démarrer et exécuter ces commandes de l’intérieur.

Quel est l’intérêt des termes RUN qui préfixent les commandes SHELL, et pourquoi ne pas directement faire appel à ces commandes ? D’abord, indiquons que RUN n’est pas la seule commande prévue par Docker (WORDIR, ENV, il y a une liste exhaustive sur le site de docker). Ensuite, chaque RUN correspond à une surcouche d’ubuntu qui est mise en cache (en modifiant la Dockerfile, les éléments qui précèdent le changement dans le fichier ne seront pas recompilés). Enfin, lorsque des images sont échangées avec le Docker Hub, seules les couches nécessaires seront transitées (en envoyant 2 images issues d’ubuntu où Python et NodeJs auraient respectivement été installés, la base Ubuntu ne sera pushée qu’une seule fois).

Voyons maintenant comment utiliser ce container Docker pour télécharger nos données:

  • il faut d’abord compiler le container
— rm” indique qu’on ne souhaite conserver que le l’image finale, et supprimer les containers intermédiaires. “-t” permet de baliser notre container en lui indiquant un nom
  • puis l’éxécuter en prenant la main
“-ti” ajoute le mode interactif, “-v” mappe le disque virtuel du container sur notre répertoire local
  • enfin, lancer les instructions de téléchargement manuellement

Note: la version actuelle de VirtualBox, associée à DockerToolbox-1.8.2a, comporte un bug qui peut empêcher d’exécuter les commandes “npm install” au sein du container. L’alternative consiste à les exécuter de l’extérieur (en local), en attendant une mise à jour de Docker (l’issue est disponible ici).

A la fin de cette étape, notre plateforme est opérationnelle et nos données disponibles, à la fois dans le container et en local sur notre disque physique.

Génération d’un moteur Elasticsearch

Nous avons vu comment développer dans un environnement spécifique. Il est également possible d’utiliser Docker pour structurer notre architecture en micro-services, chaque micro-service correspondant à une tache et un container dédié. Nous allons notamment interagir avec Elasticsearch, moteur qui structurera nos données et permettra l’édition de requêtes avec l’outil de dashboard Kibana.

Pour coordonner cet écosystème, Docker a conçu un outil qui répond parfaitement à notre besoin, docker-compose. Nous allons donc définir un schéma qui s’articule autour de 2 containers issus d’images disponibles sur le Docker Hub, Elasticsearch et Kibana, ainsi que l’image locale créée précédemment.

Structure Docker-compose et flux des données

Cette architecture est décrite dans un dockerfile, docker-compose.yml:

Note: “build” indique que le premier container (évoqué) doit être compilé dans le répertoire dashboard, vs. “image” pour les suivants qui correspondent à des images directement utilisables depuis le Docker Hub. “command” est l’instruction à exécuter au démarrage du container, “links” le lien à persister avec les autres containers, “environment” la définition de variables d’environnement, “volumes” le mapping entre chemin physique et chemin au sein du container, “ports” l’équivalent des volumes pour les ports d’écoute.

Nous allons maintenant monter nos 3 containers ensemble, et préciser au démarrage le code Node qui doit être exécuté pour le binding de nos données CSV vers le moteur Elasticsearch. En complément nous allons géolocaliser chacun des IRIS dont les coordonnées sont référencées dans un autre fichier geojson IRIS.json.

La structure qui définit le type des champs à intégrer dans Elasticsearch est appelée mapping:

On notera le champ de géolocalisation “center” de type geo_point

Note: les statistiques INSEE que l’on souhaite conserver entre les csv et Elasticsearch sont filtrées dans index.js.

A l’exécution, certaines erreurs d’Elasticsearch sans importance peuvent apparaître dans la console, mais sont simplement liées à des tentatives de connexion sur des containers qui ne sont pas encore montés.

Création d’un dashboard de reporting avec Kibana

Dès le début de l’enregistrement des données dans Elasticsearch, vous aurez le loisir de prendre la main sur Kibanna à l’adresse http://localhost:5061. Sous OsX et Windows, vous devrez remplacer localhost par l’IP du container disponible avec la commande “docker-machine ls”. Il vous faudra alors déclarer le nom de votre mapping (dans notre cas, iris), dans l’onglet Settings:

Vous pourrez alors construire un certain nombre d’indicateurs sous forme graphique -onglet Visualize- et les organiser en tableaux -onglet Dashboard-. Nous ne détaillerons pas la démarche pour mettre en place ce genre de tableau étape par étape, des informations sont disponibles sur le site du produit https://www.elastic.co/products/kibana. Sachez que la prise en main est assez rapide, et qu’aucune étape n’implique de difficultés particulières.

Lien vers le repo Github: https://github.com/anthill/open-moulinette

Atelier et article co-réalisés avec Alexandre Vallette