Présentation de la stack Elastic « ELK »

Nous profitons de la sortie de la version 6 de la stack Elastic pour présenter la réalisation récente d’un prototype rapide qui s’appuie sur ces outils. La stack Elastic est plus connue sous l’acronyme ELK pour « Elastic », « Logstash », « Kibana ». Ces composants sont publiés en opensource sous licence Apache.

Elasticsearch

Projet : https://github.com/elastic/elasticsearch

Rôle : « indexer » des données (stockage) et consulter

Interface : API HTTP REST pour :

    • alimenter des indexes : créer, mettre à jour, supprimer

    • et pour les interroger

Technologie principale : Java

Elasticsearch s’appuie sur des indexes Lucene. Il fournit un moteur de recherche distribué : il est possible de monter des clusters pour répartir la charge ou avoir de la redondance de données.

Logstash

Projet : https://github.com/elastic/logstash

Rôle : alimenter des données d’une instance Elascticsearch

Interface : configuration du comportement (fichiers texte)

  • initialement prévu pour intégrer des journaux serveurs. Aujourd’hui, il est muni de nombreux plugins :

    • entrée : pour intégrer des informations issues de bases de données, de fichiers, de messages JMS, de messages RabbitMQ, d’un cluster Elasticsearch, etc.

    • filtrage pour transformer les informations : remplacer des valeurs, dupliquer des événements, analyser des dates, supprimer des éléments, etc.

    • sortie : extraire des informations vers un fichier csv, une instance Elasticsearch, email, web service HTTP, etc.

  • testé avec le plugin logstash-input-jdbc pour lire directement depuis une base de données

Logstash est un ETL (Extract Transform Load)

Technologies principales : Ruby, Java

Kibana

Projet : https://github.com/elastic/kibana

Rôle : restituer des données issues d’Elasticsearch et les présenter

Interface : portail utilisateur avec :

  • de la découverte de données : types de données, structuration, contenu

  • des « visualisations » : tableaux, histogramme, courbes, etc.

  • des tableaux de bord : composés de visualisations

Technologies principales : Serveur javascript (NodeJS), Client Angular, React

Remarque : dans sa version actuelle, Kibana n’est pas francisé.

Exemple de mise en œuvre

Contexte

Atol Conseils & Développements utilise la stack Elastic dans le cadre du suivi de serveurs hébergés et infogérés. Lorsqu’un incident se produit sur un serveur ou la plateforme, des requêtes spécifiques sur les données indexées au fil de l’eau permettent d’analyser rapidement la situation. La rapidité de création d’un tableau de bord permet également de suivre l’évolution de la situation, le temps de rétablir un comportement normal et de conserver des indicateurs a posteriori.

D’autre part, un prototype a été mis en place dans le cadre d’un projet métier. La suite le décrit dans les grandes lignes.

Prototype ELK

L’objectif du prototype était d’apporter une réponse concernant la possibilité d’exploiter des données sans connaître leur structuration a priori et en minimisant les contraintes liées à la mise en place.

Le prototype a été réalisé rapidement avec les éléments suivants :

  • Jeu de données issue d’une base métier PostgreSQL : volumétrie d’environ 5 millions d’événements

  • Mise en place d’un container Docker composé de 4 services :

    • PostgreSQL avec une base de données métier

    • Elasticsearch pour indexer les données.

    • Kibana pour le restitution à l’utilisateur

    • Logstash pour l’intégration des données de la base métier vers l’instance Elasticsearch

  • Configuration du processus d’intégration des données

  • Création des éléments de restitution

L’objectif est de mettre à disposition des utilisateurs des indicateurs concernant les données métier initiales.

Flux stack Elastic

Flux stack Elastic

Container Docker

Le container a été créé à partir du projet deviantony/docker-elk

Exemple de configuration du container :

 

Logstash : chargement dans Elasticsearch

Le chargement des données dans un index Elasticsearch à partir de la base de données métier PostgreSQL a été réalisé par Logstash muni du plugin logstash-input-jdbc. La requête paramétrée pour le chargement est celle qui permet un archivage des données si bien qu’elle n’a nécessité aucune réflexion supplémentaire. De la même manière, nous n’avons mené aucune réflexion sur la manière dont allaient être exploitées les données à ce stade : dimensions, mesures, etc. telles qu’on doit les prévoir lorsqu’on met en place un cube de données.

Exemple de configuration de la reprise de données dans Logstash :

 

L’intégration peut être rejouée plusieurs fois sans création de doublons. Dans la mesure où nous avons précisé le document_id, un élément de données (notion de document) est inséré ou mis à jour par Elasticsearch (notion d’upsert).

Elasticsearch : requêtes via les outils pour les développeurs de Kibana

L’onglet Onglet dev-tools permet de réaliser directement des requêtes via une console.

L’exemple suivant montre l’interrogation d’une instance Elasticsearch avec :

  • un filtre sur le contenu des données : transmetteur_numserie 520106D4

  • un filtre sur les données restituées : id, dhevt, astype_code, transmetteur_numserie, etc.

  • un tri avec dates d’événement plus récentes en priorité : dhevt desc

  • et de la pagination : size 10, from 5

La requête est à gauche (GET /journalembarque/_search) et la réponse à droite (json) :

Dev tools

Kibana : Découverte

L’onglet Onglet discover permet de parcourir les données sans connaître la structuration des documents à l’avance.

Dans la partie de gauche, on retrouve les champs disponibles. Dans la partie de droite, on retrouve les « lignes » avec pour chacune le contenu présenté en « table » ou en json :

Discover

La vue table fournit des filtres :

Vue table

Par exemple en partant du capteur 0B, on obtient les événements du capteur 0B uniquement lorsqu’on clique sur le symbole  sur un événement avec cette valeur :

Json filtre

Les actions de filtrage sont les suivantes :

  • pour filtrer sur une valeur existante

  • pour annuler un filtre

  • pour basculer la colonne en « table »

  • pour filtrer sur la présence du champ

Par exemple en activant la « colonne en table » pour _id, sensor_code et dureems, on se retrouve avec la présentation « tabulaire » suivante :

Présentation tabulaire

Remarque :

  • Il est possible de paramétrer un filtre via un assistant en cliquant sur Ajout filtre. Exemple :

Exemple de filtre

Pour finir, on peut enregistrer son parcours pour le réutiliser ultérieurement ou le partager :

Actions

Kibana : Visualisations

L’onglet Onglet visualize permet de créer des visualisations de données.

L’exemple suivant montre une courbe avec l’évolution des événements dans le temps (le jeu de données présenté est limité) :

Visualize courbe

Ci-dessous, le camembert met en avant la répartition des événements des 5 capteurs les plus utilisés :

Visualize camembert

L’histogramme suivant montre les sommes des durées de communication par transmetteurs, trié par volume et limité aux 10 plus gros consommateurs.

Visualize histogramme

La configuration est réalisée directement dans l’outil :

  • les métriques (count, sum, etc.). Ici, une métrique somme des durées en ms :

Metrics

  • les regroupements. Ici, un regroupement par numéro de série de transmetteur trié limité à 10 :

Buckets

De la même manière que pour la découverte, l’utilisateur peut sauvegarder et partager des visualisations.

Kibana : Tableaux de bord

L’onglet Onglet Dashboard permet de créer des tableaux de bords.

Un tableau de bord est composé de visualisations.

Exemple de tableau de bord composé de 6 visualisations :

Dashboard

En cliquant sur Partage, on obtient le code permettant d’intégrer le tableau de bord dans une iframe ou un lien direct (du type http://<SERVEUR_HOTE>:<PORT>/app/kibana#/dashboard/AV9IwydInXPdlHXryKhG?embed=true&_g=()). A partir du lien, on se retrouve avec le même tableau de bord en pleine page.

Dans le tableau de bord en question, on peut également appliquer des filtres. Ici, en cliquant sur le capteur « 10 » dans le camembert et sur le type d’événement « 07 » dans le tableau de données, toutes les visualisations composant le tableau de bord sont filtrées sur ces deux critères. On retrouve les filtres en haut, qu’on peut également manipuler : les désactiver, supprimer, etc. L’application d’un filtre est réalisée en quasi temps-réel : les résultats sont disponibles en moins d’une seconde :

Dashboard partagé

Utilisée telle que décrite, la stack Elastic représente un outil de stockage NoSQL qui permet de faire de l’analyse de données type Big Data de manière intéressante et à moindre coût. De plus la montée en charge est assurée de manière horizontale par la prise en charge en natif de la gestion des clusters Elastic (calculs répartis ou réplication).

Le prototype mis en place rapidement dans une instance Docker montre des temps de réponse satisfaisants (de l’ordre de la seconde).

Intégration dans une application métier

Nous avons vu l’interface produite à destination d’un profil avancé. Voyons maintenant un exemple d’interface produite au sein d’une application métier pour ayant un profil classique.

Exemple de tableau de bord général avec l’intégration de plusieurs « visualisations » au sein d’un tableau de bord à destination d’un profil métier :

Intégration application métier

Intégration dans une application métier

D’un point de vue technique, un proxy est mis en place côté serveur entre le client Kibana et le serveur Elasticsearch. Son rôle est double :

  • masquer l’utilisation de la stack Elastic
  • sécuriser les accès
Flux en mode intégré

Flux en mode intégré

Nous distinguons deux profils d’utilisateurs :

  • L’utilisateur métier « avancé » type administrateur qui paramètre les visualisations Kibana et leur utilisation dans l’application métier (configuration du tableau de bord)
  • L’utilisateur métier qui consulte le résultat à travers l’application métier

Ainsi, l’utilisateur métier n’a qu’un seul point d’entrée. Il s’agit de l’application métier.