De la personnalisation des journaux dans le code à la surveillance dans Kibana
Cet article présente une approche permettant de rendre le flux d'injection de données plus transparent dans le lac de données grâce à la surveillance des logs personnalisés dans Kibana.
Le projet précédent sur lequel je travaillais était consacré à la construction d'un lac de données. Son objectif était d'injecter des gigaoctets de données provenant de diverses sources dans le système et de les mettre à la disposition de plusieurs utilisateurs au sein de l'organisation. Il s'est avéré qu'il n'était pas toujours facile de certifier que toutes les données avaient été insérées avec succès et, même si le problème était déjà évident, il fallait des heures pour en identifier la cause. Il ne faisait donc aucun doute que le système devait être corrigé.
D'un point de vue technique, la solution que nous avons proposée peut être divisée en trois blocs principaux :
- l'enregistrement des informations nécessaires dans le code,
- l'indexation des journaux dans Elasticsearch à l'aide de Logstash,
- la visualisation des logs dans des tableaux de bord personnalisés sur Kibana.
Dans le développement logiciel, la journalisation est un moyen de décrypter la boîte noire d'une application en cours d'exécution. Lorsque l'application devient de plus en plus complexe, il devient plus difficile de comprendre ce qui se passe à l'intérieur et c'est là que les journaux deviennent de plus en plus influents. Qui peut en bénéficier ? Les développeurs et les utilisateurs de logiciels ! Grâce aux journaux, le développeur peut rétablir le chemin parcouru par le programme et obtenir un signal de localisation d'un bogue potentiel, tandis que l'utilisateur peut obtenir les informations nécessaires concernant le programme et ses résultats : temps d'exécution, données sur les fichiers traités, etc.
Afin d'améliorer la robustesse de l'application, les journaux doivent répondre à ces deux normes : nous voulons qu'ils soient personnalisés de manière à ne contenir que les données qui nous intéressent. Il est donc important de réfléchir à ce qui compte vraiment dans l'application : il peut s'agir du nom d'un script ou d'un environnement, de l'heure d'exécution, du nom du fichier contenant une erreur, etc. Les journaux doivent être lisibles par l'homme afin que le problème puisse être détecté le plus rapidement possible, quel que soit le volume de données traitées.
Étape 1 : Enregistrement des informations essentielles dans le code.
Le premier sous-objectif est de préparer les logs qui peuvent être facilement analysés par Logstash et Elasticsearch. Pour cette raison, nous conservons les messages de logs sous la forme d'un JSON multi-lignes qui contient les informations que nous souhaitons afficher : message de log, timestamp, nom du script, environnement (prod ou dev), niveau de log (debug, info, warning, error), stack trace.
Le code ci-dessous peut vous aider à créer vos journaux personnalisés au format JSON pour une application fictive qui se compose des parties suivantes : le corps de l'application est écrit dans le script main.py, l'objet logger est défini dans logging_service.py, ses paramètres sont décrits dans logging_configuration.yml. Pour ajouter les champs spécifiques dans la déclaration d'enregistrement, nous avons écrit la classe CustomJsonFormatter qui écrase la méthode add_fields de sa superclasse importée du paquet pythonjsonlogger. La fonction get_logger de logging_service.py renvoie le nouveau logger avec les configurations souhaitées. Note : la meilleure pratique consiste à définir le logger au début de chaque module de votre application.
Pour créer file.log, exécutez le code ci-dessus, en plaçant les fichiers dans le même dossier et en exécutant la commande suivante depuis votre terminal :
Étape 2 : Indexation des journaux dans Elasticsearch à l'aide de Logstash
Pour favoriser la lisibilité des logs, nous utilisions la pile ELK : la combinaison des trois projets open-source Elasticsearch, Logstash, Kibana. Il existe de nombreux articles qui peuvent vous donner un aperçu de ce que c'est et de ses avantages et inconvénients. En voici un.
Les principales étapes de l'installation d'ELK :
- Installer Logstash sur la machine où se trouvent les logs. Démarrer un conteneur Logstash.
- Installer Elasticsearch et Kibana. Dans notre cas, ils étaient situés sur une machine séparée.
- Configurez Logstash pour qu'il pointe vers Elasticsearch et recherche les bons fichiers. Notes :
- 1) L'expression régulière folder/**/*.log* vous permet de rechercher les fichiers .log dans tous les sous-dossiers du dossier.
- 2) L'astérisque (*) supplémentaire à la fin vous permet de rechercher également les fichiers en rotation.
- 3) Toutes les lignes mal analysées par Logstash et marquées d'un tag _jsonparsefailure sont supprimées afin de ne pas les indexer dans Elasticsearch.
- 4) Afin de ne pas mélanger les données provenant de différents environnements, vous pouvez utiliser l'index. Cela permettra à Elasticsearch de regrouper les données.
- Démarrez les conteneurs Elasticsearch et Kibana sur une machine dédiée (assurez-vous que leurs versions correspondent à celle de Logstash ou il y aura des incompatibilités entre leurs APIs).
- Configurer les services pour relancer automatiquement Logstash.
- Logstash, Elasticsearch et Kibana produisent leurs propres logs. Dans le cas où vous n'avez pas assez de mémoire sur votre machine, cela peut poser un problème très rapidement. Pour cela, configurez la journalisation de votre ELK, en précisant par exemple la taille maximale des fichiers de logs et le nombre de sauvegardes.
Étape 3 : Visualisation avec Kibana
Créez des tableaux de bord Kibana qui contiennent toutes vos visualisations. Saisissez la vue d'ensemble et choisissez votre angle d'analyse. Le premier intérêt des tableaux de bord est de pouvoir plonger dans toutes les dimensions possibles (comme il est présenté dans le graphique ci-dessous, il s'agit d'un environnement source ou d'un niveau de log). Affichez les détails de chaque journal. Le tableau derrière les graphiques permet de voir les détails de chaque journal filtré.
Voici un instantané du tableau de bord Kibana de notre application finale :
J'espère que cet article vous a plu ! Et je vous souhaite une bonne journalisation dans vos aventures de développement logiciel.
Merci à Pierre Marcenac, Nicolas Jean et Alexandre Sapet.
Si vous recherchez des experts en Data Engineering, n'hésitez pas à nous contacter !