<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Logstash on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/logstash/</link><description>Recent content in Logstash on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 17 Oct 2017 11:30:19 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/logstash/index.xml" rel="self" type="application/rss+xml"/><item><title>ElasticStack : Visualisez vos données dans Kibana</title><link>https://blog.zwindler.fr/2017/10/17/elasticstack-afficher-les-donnees-dans-kibana/</link><pubDate>Tue, 17 Oct 2017 11:30:19 +0000</pubDate><guid>https://blog.zwindler.fr/2017/10/17/elasticstack-afficher-les-donnees-dans-kibana/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/10/elastic_3.webp" alt="Featured image of post ElasticStack : Visualisez vos données dans Kibana" /&gt;&lt;h2 id="collecter-cest-bien--visualiser-cest-mieux"&gt;Collecter, c’est bien ; visualiser, c’est mieux
&lt;/h2&gt;&lt;p&gt;Cet article fait partie d’une suite d’articles sur ElasticStack, un produit &lt;a class="link" href="https://www.elastic.co/fr/" target="_blank" rel="noopener"
&gt;elastic.co&lt;/a&gt;, composé des produits ElasticSearch, Logstash, Kibana et depuis plus récemment des agents Beats.&lt;/p&gt;
&lt;p&gt;Pour ceux qui auraient raté les articles précédents, j’explique plus en détail de quoi il s’agit dans 2 articles. Et bon DevOps que je suis, tout est bien entendu entièrement automatisé par des playbooks Ansible (et oui, vous n’avez rien à faire) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2017/10/03/elasticstack-kibana-elasticsearch-logstash-beats/" &gt;ElasticStack : Déployer Kibana, Elasticsearch, Logstash &amp;amp; Beats avec Ansible&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2017/10/10/elasticstack-collecter-et-exploiter-des-logs-nginx/" &gt;ElasticStack : Collecter et exploiter des métriques provenant de nginx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="on-en-est-où-"&gt;On en est où ?
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk-infrastructure.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans les deux articles précédents nous avons donc travaillé en amont d’ElasticSearch. Les données des serveurs ont été collectées, centralisées, traitées puis intégrées dans ElasticSearch. On sait faire des requêtes simples dessus via des curl.&lt;/p&gt;
&lt;p&gt;C’est bien beau tout ça, mais on en fait quoi maintenant ? Et bien maintenant on va aller en aval et travailler avec Kibana !&lt;/p&gt;
&lt;h2 id="premiers-pas-avec-kibana"&gt;Premiers pas avec Kibana
&lt;/h2&gt;&lt;p&gt;Normalement si tout s’est bien passé, on peut maintenant se connecter à Kibana, et Kibana peut communiquer avec ElasticSearch.&lt;/p&gt;
&lt;p&gt;L’URL par défaut est &lt;code&gt;http://@IP_MON_SERVEUR_ELK:5601&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/kibana_log.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Joli logo qui change de couleur pendant le chargement&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;S’il y a un souci de connexion entre les deux logiciels qu’on vient de citer, vous aurez rapidement un message d’erreur plutôt explicite qui vous indiquera que ElasticSearch n’est pas joignable. Parfois c’est temporaire, par exemple lorsque vous démarrez ElasticSearch il arrive qu’il mette du temps à récupérer les index mais ça sera indiqué dans le message d’erreur.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/kibana_elastic_ko.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="création-des-index-patterns"&gt;Création des Index Patterns
&lt;/h2&gt;&lt;p&gt;La première page sur laquelle vous devriez tomber est une page de Management pour la création des Index Pattern. Il s’agit ni plus ni moins d’indiquer à Kibana quels sont les données (index) dans ElasticSearch nous intéressent (on peut en avoir plusieurs) et ensuite de lister les différentes colonnes pour chaque information contenue dans l’index en question.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk1.1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention il s’agit là d’une notion importante&lt;/strong&gt; : Plus les données présentes dans un même index seront différentes (différentes sources, différents champs), plus le nombre de champs dans votre « index pattern » sera important (logique).&lt;/p&gt;
&lt;p&gt;Ça compliquera d’autant plus la création de nouveau graphique et l’exploitation de l’outil en général. Si vous voulez ajouter un nouveau graphique, il faudra filtrer potentiellement beaucoup de données pour n’extraire que celle qui vous intéresse et EN PLUS, de nombreux champs ne vous serviront à rien du tout et compliqueront la conception des visualisation.&lt;/p&gt;
&lt;p&gt;Dans la mesure du possible, on s’astreindra donc à séparer en amont (lors de la configuration Logstash ou Beats) les données trop différentes dans des index distincts.&lt;/p&gt;
&lt;p&gt;Si vous avez suivi les 2 premiers tutos, ça devrait fonctionner tout seul puisque les playbooks utilisent l’index par défaut, &lt;strong&gt;logstash-&lt;/strong&gt;*. Sélectionnez @timestamp comme &lt;strong&gt;Time Filter&lt;/strong&gt; puis cliquez simplement sur &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="discover"&gt;Discover
&lt;/h2&gt;&lt;p&gt;L’interface d’ELK est relativement simple une fois qu’on sait à quoi sert chaque menu. Maintenant que les index sont configurés, la conception des graphiques peut commencer, dans l’onglet Discover.&lt;/p&gt;
&lt;p&gt;Cette vue est la plus importante pour la conception des graphiques puisque c’est là que vous pourrez explorer puis filtrer vos données, pour en tirer des indicateurs pertinents à surveiller.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk_discover.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Cette vue se découpe en plusieurs parties que je vais décrire ici :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En jaune, l’index courant et l’ensemble des champs qu’il possède. Dans mon cas, j’en ai pratiquement 200 sur cet index, d’où la nécessité de ne pas trop en rajouter !&lt;/li&gt;
&lt;li&gt;En vert, un rapide graphique permettant de visualiser le nombre d’occurrences correspondant aux filtres et à la plage horaire sélectionnée. Très pratique pour avoir une idée du volume de données récoltées avec le filtre en cours.&lt;/li&gt;
&lt;li&gt;En bleu, un extract des données en elles même. On peut ainsi analyser ce qui tombe dans notre filtre, et ainsi concevoir les graphiques en fonction.&lt;/li&gt;
&lt;li&gt;En violet, la plage horaire sélectionnée (ici 7 jours en relatif, on peut aussi définir un intervalle fixe avec des dates/heures).&lt;/li&gt;
&lt;li&gt;En rouge, la grande force de l’outil =&amp;gt; vous pouvez écrire à la main des requêtes pour filtrer en live vos données.&lt;/li&gt;
&lt;li&gt;En orange, les filtres en cours d’utilisation. Ici, j’ai cliqué sur la remote IP 80.74.x.x ce qui a eu pour effet d’immédiatement filtrer et restreindre à cette seule IP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La barre de recherche s’utilise de la façon suivante : on entre les infos qu’on souhaite voir (ou ne pas voir avec « -« ) et hop, ça filtre !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk4.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois qu’on est content de son filtre, on peut le sauvegarder grâce au menu &lt;strong&gt;Save&lt;/strong&gt; en haut à droite. Il suffit de lui donner un nom explicite, puis de confirmer en cliquant sur le bouton &lt;strong&gt;Save&lt;/strong&gt; Bleu.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk5.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="visualize"&gt;Visualize
&lt;/h2&gt;&lt;p&gt;Le but du jeu avant de passer à cet étape est donc de créer un ensemble de requêtes plus ou moins complexes permettant de récupérer les données qui nous sont pertinentes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk6.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;L’onglet Visualize sert donc à créer des graphiques à partir de ses sources de données pertinentes (aka filtrées). Dans mon cas, je vais donc directement m’appuyer sur la recherche que je viens de sauvegarder pour ne récuperer que les données dont le type est égale à « nginx_access ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A partir de là, le 2ème gros travail commencer. Ce n’est pas si simple de trouver les champs pertinents pour visualiser nos données de manières efficaces.&lt;/p&gt;
&lt;p&gt;Comme j’ai un peu bossé pour vous dans l’article précédent, j’ai déjà ajouté dans la configuration logstash un champ qui n’est pas présent par défaut : à savoir &lt;strong&gt;geoip.ip&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk2.5.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Avec ce champ, je vais pouvoir me baser sur l’adresse IP pour déterminer plusieurs informations pour chacune des requêtes arrivant sur mon frontal nginx.&lt;/p&gt;
&lt;p&gt;Je tire donc partie de ce champ pour réaliser un comptage de toutes les adresses IP distinctes pour l’axe des ordonnées.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk8.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour l’axe des abscisse, dans la majorité des cas, on se contentera du temps via le timestamp.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk9.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Cliquez sur le petit logo « Play » en haut pour visualiser le résultat :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk9.5.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Même principe que dans « Discover », on sauvegarde la visualisation en cliquant sur le menu Save en haut à droite, puis en validant avec le bouton Save bleu.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk10.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="dautre-exemples-de-visualisations"&gt;D’autre exemples de visualisations
&lt;/h2&gt;&lt;p&gt;En sélectionnant un graphique de type « Pie Chart », avec comme Aggregation « Count » et en séparant les tranches via le terme response.keyword, on peut faire un camembert des codes retours HTML.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk11.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;En utilisant le module &lt;strong&gt;geoip&lt;/strong&gt;, dont j’ai parlé plus haut, on peut créer une carte des visiteurs d’un site web :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk11.2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Vous n’êtes donc maintenant (presque) limités que par votre imagination. Je dis « presque » parce qu’il n’est, à ma connaissance, pas facile voire impossible de réaliser des opérations mathématiques sur un graphique donné.&lt;/p&gt;
&lt;p&gt;Un exemple : si je souhaite afficher la RAM consommée par un container Docker en Mo et non pas en octets (ce qui est illisible), a priori je ne peux pas le faire (à moins d’utiliser une obscure fonction permettant de dupliquer un index en lui appliquant une formule mathématique, bref, c’est compliqué).&lt;/p&gt;
&lt;p&gt;Pour remédier à ça, elastic.co a sorti un outil appelé Timelion, intégré dans Kibana, mais ce n’est pas le sujet d’aujourd’hui ;-).&lt;/p&gt;
&lt;h2 id="dashboard"&gt;Dashboard
&lt;/h2&gt;&lt;p&gt;Le plus simple maintenant ! On peut créer des Dashboard dans l’onglet Dashboard, simplement en sélectionnant les graphiques précédemment créés puis en les réagençant avec des drags and drops. E-Z !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk_dashboard.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Voilà quelques uns des dashboards que j’ai créés pour les besoins de cet article pour vous donner une idée, mais on peut bien entendu faire bien plus complexe !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk15.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk16.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Have fun !&lt;/p&gt;</description></item><item><title>ElasticStack : Déployer Kibana, Elasticsearch, Logstash &amp; Beats avec Ansible</title><link>https://blog.zwindler.fr/2017/10/03/elasticstack-kibana-elasticsearch-logstash-beats/</link><pubDate>Tue, 03 Oct 2017 11:30:03 +0000</pubDate><guid>https://blog.zwindler.fr/2017/10/03/elasticstack-kibana-elasticsearch-logstash-beats/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/10/elastic_3.webp" alt="Featured image of post ElasticStack : Déployer Kibana, Elasticsearch, Logstash &amp; Beats avec Ansible" /&gt;&lt;h2 id="elasticstack"&gt;ElasticStack
&lt;/h2&gt;&lt;p&gt;Il y a quelques temps, je me suis mis à tester ElasticStack et j’avais préparé des playbooks Ansible et un tutoriel pour vous en parler. &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=m4vr0x" &gt;m4vr0x&lt;/a&gt; (qui a déjà écrit quelques articles sur le blog) était super intéressé et je lui ai dit « t’inquiètes, j’écris un article &lt;em&gt;bientôt&lt;/em&gt; sur le sujet ».&lt;/p&gt;
&lt;p&gt;La bonne blague : c’était en juillet (ce qui n’est pas si loin quand je regarde mes plus vieux brouillons :-p ).&lt;/p&gt;
&lt;h2 id="présentation-de-la-solution"&gt;Présentation de la solution
&lt;/h2&gt;&lt;p&gt;Trêve de plaisanterie ! Plus connu sous son &lt;em&gt;ancien acronyme&lt;/em&gt; (ELK), ElasticStack est une suite logicielle développée par &lt;a class="link" href="https://www.elastic.co/" target="_blank" rel="noopener"
&gt;elastic.co&lt;/a&gt;. Le cœur de l’application est basée sur les logiciels :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Elasticsearch&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logstash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kibana&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Historiquement ces 3 produits étaient développés de manière indépendante (même si leur utilisation conjointe était conseillée). Courant 2016, &lt;a class="link" href="https://www.elastic.co/fr/" target="_blank" rel="noopener"
&gt;elastic.co&lt;/a&gt; a décidé de refondre ces solutions et harmoniser les développements et les versions (tous les produits sont passés en version 5) pour proposer un ensemble complet cohérent.&lt;/p&gt;
&lt;p&gt;Un bon article pour parler de ce renommage peut être consulté sur le site &lt;a class="link" href="https://www.monitoring-fr.org/2016/04/ne-dites-plus-elk-mais-the-elastic-stack/" target="_blank" rel="noopener"
&gt;monitoring-fr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La nouvelle architecture « classique » de la suite ElasticStack est la suivante :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/09/elk-infrastructure.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="elasticsearch"&gt;Elasticsearch
&lt;/h3&gt;&lt;p&gt;Elasticsearch est un moteur de recherche et d’analyse RESTful distribué. C’est le cœur de la solution ElasticStack. Dans ce logiciel que sera stocké toutes les données qui seront collectés sur l’infrastructure. Les points forts de la solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la résilience et l’architecture hautement disponible&lt;/li&gt;
&lt;li&gt;la performance des requêtes grâce à l’indexation, particulièrement adapté à la recherche rapide de données de type métriques ou journaux&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Paradoxalement, c’est la couche avec laquelle on interagit le moins au début, puisqu’on passe surtout du temps à configurer en amont la collecte des logs au niveau &lt;strong&gt;Beats&lt;/strong&gt; et &lt;strong&gt;Logstash&lt;/strong&gt;, puis en aval avec la visualisation dans &lt;strong&gt;Kibana&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="beats"&gt;Beats
&lt;/h3&gt;&lt;p&gt;La (relative) nouveauté. Introduit depuis le renommage et la version 5 de la suite logicielle, &lt;strong&gt;Beats&lt;/strong&gt; regroupe un ensemble de modules logiciels de type « agents » à déposer sur les serveurs à surveiller.&lt;br&gt;
Ce sont ces agents, adaptés pour chaque contexte, qui récoltent les données brutes et les transmettent à la brique suivante. Actuellement, il existe les agents suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Metricbeat&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packetbeat&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logbeat&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Winbeat&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On peut directement collecter les données dans &lt;strong&gt;Elasticsearch&lt;/strong&gt;, la couche &lt;strong&gt;Logstash&lt;/strong&gt; étant optionnelle, mais on perd de nombreuses fonctionnalités et il est préférable de garder &lt;strong&gt;Logstash&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="logstash"&gt;Logstash
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Logstash&lt;/strong&gt; est le module de collecte « historique ». C’est lui qui était chargé de récolter logs et métriques pour les transmettre à &lt;strong&gt;Elasticsearch&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Aujourd’hui, &lt;strong&gt;Logstash&lt;/strong&gt; étant plus gourmand en ressources que les agents &lt;strong&gt;Beats&lt;/strong&gt;, il peut être préférable de ne plus l’utiliser pour la collecte en elle même.&lt;/p&gt;
&lt;p&gt;Cependant, à l’inverse, les agents &lt;strong&gt;Beats&lt;/strong&gt; n’ont pas la capacité, &lt;em&gt;contrairement à &lt;strong&gt;Logstash&lt;/strong&gt;&lt;/em&gt;, de traiter les données récoltées. Il est donc intéressant de conserver &lt;strong&gt;Logstash&lt;/strong&gt; en coupure entre les agents &lt;strong&gt;Beats&lt;/strong&gt; et &lt;strong&gt;ElasticSearch&lt;/strong&gt; pour réaliser des traitements sur les données collectées.&lt;/p&gt;
&lt;p&gt;Un bon exemple est la collecte des logs. Par défaut, les données collectées par &lt;strong&gt;Filebeat&lt;/strong&gt; contiennent les informations suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un timestamp correspondant au moment de la collecte (attention, pas identique au moment où le log a été écrit!!!)&lt;/li&gt;
&lt;li&gt;le serveur source&lt;/li&gt;
&lt;li&gt;le fichier de log source&lt;/li&gt;
&lt;li&gt;la version de filebeat (super :/)&lt;/li&gt;
&lt;li&gt;la ligne complète collectée dans le log&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cependant, il est complexe d’exploiter les données ainsi collectées puisque les messages des logs contiennent souvent des informations multiples sur une même ligne. Par exemple dans &lt;strong&gt;/var/log/messages&lt;/strong&gt;, on a les informations suivantes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Date Heure Hostname Processus[PIDXXX]: le message
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Avec &lt;strong&gt;Logstash&lt;/strong&gt;, il est possible de « tronçonner » via une regexp cette ligne en plusieurs champs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Date et heure de l’événement journalisé (réelle cette fois, pas l’heure de collecte)&lt;/li&gt;
&lt;li&gt;Nom d’hôte&lt;/li&gt;
&lt;li&gt;Nom du processus concerné&lt;/li&gt;
&lt;li&gt;PID&lt;/li&gt;
&lt;li&gt;Le message réel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A partir de ces informations et associées aux informations récoltées par &lt;strong&gt;Beats&lt;/strong&gt;, on peut donc gérer de manière beaucoup plus simple nos recherches et les consolider dans des graphiques avec &lt;strong&gt;Kibana&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="kibana"&gt;Kibana
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Kibana&lt;/strong&gt; est une interface web qui permet d’explorer/de visualiser des informations provenant d’&lt;strong&gt;Elasticsearch&lt;/strong&gt; et de les afficher sous formes de graphiques. On peut ensuite consolider les graphiques en tableaux de bords (dashboards).&lt;/p&gt;
&lt;p&gt;Quelques exemples de dashboards qu’on peut créer :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/09/elk15.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Consommation des containers Docker sur une machine&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/09/elk16.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dashboard d’analyse des logs d’un serveur nginx&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un gros point positif de la solution est la possibilité de filtrer en temps réel sur une sous catégorie des données, soit via une barre de recherche, soit en cliquant directement sur les graphiques, en mode « &lt;em&gt;drill down&lt;/em&gt;« .&lt;/p&gt;
&lt;p&gt;Par exemple, si je veux obtenir plus de détails sur les code retours 404, il me suffit de cliquer sur le code 404 dans le camembert, et &lt;strong&gt;Kibana&lt;/strong&gt; filtrera les données de TOUS les graphiques du dashboard pour ne m’afficher que les données correspondantes :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/09/elk17.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="déploiement-delasticstack-via-docker"&gt;Déploiement d’ElasticStack via Docker
&lt;/h2&gt;&lt;p&gt;Vous y avez cru ? Je ne vais pas vous donner les étapes pour installer ElasticStack via l’usage des containers Docker officiels.&lt;/p&gt;
&lt;p&gt;Pourquoi ? Ce n’est pas parce que je n’utilise pas Docker. J’ai déjà massivement adopté cette techno. aussi bien dans le contexte pro que perso.&lt;br&gt;
Mais tout simplement parce que c’est assez bien documenté sur le site et que c’est vraiment simple. Si l’article a vraiment beaucoup d’engouement et que c’est demandé gentiment, je ferai un effort ;-) .&lt;/p&gt;
&lt;h2 id="installation-delasticstack-sur-un-serveur-via-ansible"&gt;Installation d’ElasticStack sur un serveur via Ansible
&lt;/h2&gt;&lt;p&gt;C’est un peu plus compliqué si vous ne voulez PAS déployer ElasticStack via Docker. La documentation indique d’autres méthodes, dont l’installation classique via des RPMs.&lt;/p&gt;
&lt;p&gt;Au moment où j’avais écris les premières lignes du tutoriel, j’avais remarqué qu’il y avait aussi une méthode automatisée via Ansible et comme j’adore Ansible j’ai voulu l’utiliser.&lt;/p&gt;
&lt;p&gt;Sauf qu’elle n’existait que pour Elasticsearch et en plus pour la version 2.3.X (version d’avant le grand renommage de 2016 dont je parle plus haut) !&lt;/p&gt;
&lt;p&gt;Je me suis donc attelé à la tâche de développer mes propres playbooks pour automatiser tout ça. Et comme je suis sympa, je vous les met à disposition.&lt;/p&gt;
&lt;h2 id="installer-la-base-elk"&gt;Installer la base, ELK
&lt;/h2&gt;&lt;p&gt;Le code suivant va vous permettre de déployer via Ansible les 3 logiciels ElasticSearch, Kibana et Logstash sur une seule et même machine. Mais comme les rôles ont été découpés en 3 playbooks, il est tout à fait envisageable d’installer ces rôles sur des machines différentes (ou juste une partie).&lt;/p&gt;
&lt;p&gt;Les seuls prérequis sont d’avoir une machine CentOS 7 (ou RHEL ou équivalent) qui dispose d’Ansible et de git d’installé.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir -p /etc/ansible/roles &amp;amp;&amp;amp; cd /etc/ansible/roles
git clone https://github.com/zwindler/ansible-deploy-elasticsearch
git clone https://github.com/zwindler/ansible-deploy-kibana
git clone https://github.com/zwindler/ansible-deploy-logstash
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, vous n’avez plus qu’à créer un playbook qui va tirer parti de ces rôles :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /etc/ansible
cat deploy_kibana_elasticsearch_logstash.yml
---
- name: Install elastic stack
hosts: localhost
roles:
- { role: ansible-deploy-kibana, tags: &amp;#39;kibana&amp;#39; }
- { role: ansible-deploy-elasticsearch, tags: &amp;#39;elasticsearch&amp;#39; }
- { role: ansible-deploy-logstash, tags: &amp;#39;logstash&amp;#39; }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et à lancer l’installation d’ELK sur l’hôte, affectueusement nommé « mon_serveur_elk » dans cet exemple, de la façon suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -l mon_serveur_elk deploy_kibana_elasticsearch_logstash.yml
ansible-playbook deploy_kibana_elasticsearch_logstash.yml
PLAY [Install elastic stack] ********************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
ok: [mon_serveur_elk]
TASK [ansible-deploy-kibana : Add elasticsearch repository] ****************************************************************************************
changed: [mon_serveur_elk]
[...]
PLAY RECAP **************************************************************************************************************************************************
mon_serveur_elk : ok=4 changed=21 unreachable=0 failed=0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, on peut commencer à tester les composants uns par uns et vérifier que tout fonctionne.&lt;/p&gt;
&lt;h2 id="tester-une-config-logstash"&gt;Tester une config Logstash
&lt;/h2&gt;&lt;p&gt;On peut vérifier que Logstash fonctionne comme il le doit grâce à la fonction « config.test_and_exit ». Juste pour les besoins du test, je vais donc créer un fichier logstash qui va lire le dmesg présent sur la machine. Ça n’a pas forcément d’intérêt mais comme ça on verra s’il n’y a pas de lézards.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /etc/logstash/conf.d
cat &amp;gt; test.conf &amp;lt;&amp;lt; EOF
input {
file {
path =&amp;gt; &amp;#34;/var/log/dmesg&amp;#34;
start_position =&amp;gt; &amp;#34;beginning&amp;#34;
}
}
output {
elasticsearch {
hosts =&amp;gt; [ &amp;#34;localhost:9200&amp;#34; ]
}
}
EOF
/usr/share/logstash/bin/logstash -f test.conf --config.test_and_exit
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
Configuration OK
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut ignorer les warning ci dessus dans un premier temps. Tout fonctionne ! Si on le souhaite, on peut démarrer Logstash à la main et avec cette configuration avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/usr/share/logstash/bin/logstash -f test.conf --config.reload.automatic
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour aller plus loin avec Logstash, je vous conseille de &lt;a class="link" href="https://www.elastic.co/guide/en/logstash/current/first-event.html" target="_blank" rel="noopener"
&gt;lire la documentation&lt;/a&gt; qui est assez progressive dans la difficulté. Les configurations de Logstash ne sont pas toujours évidentes et il peut y avoir pas mal de débuging les premières fois.&lt;/p&gt;
&lt;h2 id="requêter-elasticsearch"&gt;Requêter Elasticsearch
&lt;/h2&gt;&lt;p&gt;Il est tout à fait possible de requêter à la main ElasticSearch, directement via l’API. Un moyen simple de s’en convaincre est de réaliser un simple « curl » sur la base mais vous pouvez bien entendu faire beaucoup plus complexe avec des outils prévu pour explorer les APIs.&lt;/p&gt;
&lt;p&gt;Par exemple, on peut afficher les informations de la base comme ceci :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl -XGET &amp;#39;localhost:9200/&amp;#39;
{
&amp;#34;name&amp;#34; : &amp;#34;anXc9nn&amp;#34;,
&amp;#34;cluster_name&amp;#34; : &amp;#34;elasticsearch&amp;#34;,
&amp;#34;cluster_uuid&amp;#34; : &amp;#34;5P9XdOMJRZOPIy38NegdnQ&amp;#34;,
&amp;#34;version&amp;#34; : {
&amp;#34;number&amp;#34; : &amp;#34;5.5.0&amp;#34;,
&amp;#34;build_hash&amp;#34; : &amp;#34;260387d&amp;#34;,
&amp;#34;build_date&amp;#34; : &amp;#34;2017-06-30T23:16:05.735Z&amp;#34;,
&amp;#34;build_snapshot&amp;#34; : false,
&amp;#34;lucene_version&amp;#34; : &amp;#34;6.6.0&amp;#34;
},
&amp;#34;tagline&amp;#34; : &amp;#34;You Know, for Search&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Autres commandes sympas, vous pouvez afficher l’état de santé de vos nœuds Elasticsearch. Ici je n’en ai qu’un et c’est donc considéré comme dangereux (car pas de redondance), d’où l’état « yellow » et pas « green » :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl -XGET &amp;#39;localhost:9200/_cat/health?v&amp;amp;pretty&amp;#39;
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1506795865 20:24:25 elasticsearch yellow 1 1 516 516 0 0 516 0 - 50.0%
curl -XGET &amp;#39;localhost:9200/_cat/nodes?v&amp;amp;pretty&amp;#39;
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
x.x.x.x 43 89 1 0.09 0.16 0.30 mdi * anXc9nn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous pouvez afficher la liste des fichiers correspondant à vos données avec cette commande :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl &amp;#39;localhost:9200/_cat/indices?v&amp;#39;
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open filebeat-2017.06.19 w7tmj4L3ToqEdiHYmvHS8Q 5 1 981 0 270kb 270kb
yellow open .kibana YFYjR5hFSGualaX-ahL_9g 1 1 2 0 23.5kb 23.5kb
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Par défaut (et pour des questions de performance), on a pour habitude de segmenter les données dans Elasticsearch par jours. Au fil des jours de nouveaux fichiers seront créés et viendront remplir votre filesystem. Il ne faudra donc pas oublier de jeter un œil de temps et en temps et purger tout ça !&lt;/p&gt;
&lt;h3 id="et-kibana-"&gt;Et Kibana ?
&lt;/h3&gt;&lt;p&gt;Normalement, Kibana est accessible à l’adresse &lt;code&gt;http://@IP_de_mon_serveur_elk:5601/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/kibana_log.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-maintenant-on-collecte-quoi-"&gt;Et maintenant, on collecte quoi ?
&lt;/h2&gt;&lt;p&gt;C’est bien gentil tout ça, mais pour l’instant on a rien du tout&amp;hellip; Au delà de la simple connexion à Kibana, vous arriverez sur un écran de configuration qui cherchera, sans succès, des données dans elasticsearch.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/elk1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unable to fetch mapping&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Peine perdue, ces données n’existent pas encore puisqu’on ne collecte rien pour l’instant !&lt;/p&gt;
&lt;p&gt;Vous trouverez probablement de nombreux tuto sur Internet expliquant comment collecter des données provenant de fichiers depuis Logstash. Cependant, comme je l’ai indiqué en début d’article, la méthode conseillée est maintenant d’utiliser plutôt les agents Beats, qui envoient les données à Logstash lorsqu’un traitement est nécessaire.&lt;/p&gt;
&lt;p&gt;Et là encore, je vous ai préparé des playbooks tout fait pour installer et configurer à la fois les modules Beats sur les serveurs supervisés ET le logstash côté serveur ELK. Plus rien à faire donc, juste à attendre le 2ème article !&lt;/p&gt;
&lt;p&gt;Haaan, quel suspense ! A la semaine prochaine ;-)&lt;/p&gt;
&lt;p&gt;[Edit]Les deux articles suivants sont là :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2017/10/10/elasticstack-collecter-et-exploiter-des-logs-nginx/" &gt;ElasticStack : Collecter et exploiter des métriques provenant de nginx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2017/10/17/elasticstack-afficher-les-donnees-dans-kibana/" &gt;ElasticStack : Visualisez vos données dans Kibana&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[/Edit]&lt;/p&gt;
&lt;h2 id="ressources-complémentaires"&gt;Ressources complémentaires
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-ubuntu-16-04" target="_blank" rel="noopener"
&gt;Installer ELK sous Ubuntu 16.04 (Digital Ocean, encore eux)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.elastic.co/guide/en/x-pack/current/setting-up-authentication.html" target="_blank" rel="noopener"
&gt;Sécurisation d’ElasticStack officielle avec les X-Pack&lt;/a&gt; : attention c’est payants !&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20190319133148/https://mapr.com/blog/how-secure-elasticsearch-and-kibana/" target="_blank" rel="noopener"
&gt;Comment sécuriser une plateforme Elasticsearch et Kibana (EN)&lt;/a&gt; (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>