<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Metricbeat on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/metricbeat/</link><description>Recent content in Metricbeat on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 10 Oct 2017 11:30:49 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/metricbeat/index.xml" rel="self" type="application/rss+xml"/><item><title>ElasticStack : Collecter et exploiter des métriques provenant de nginx</title><link>https://blog.zwindler.fr/2017/10/10/elasticstack-collecter-et-exploiter-des-logs-nginx/</link><pubDate>Tue, 10 Oct 2017 11:30:49 +0000</pubDate><guid>https://blog.zwindler.fr/2017/10/10/elasticstack-collecter-et-exploiter-des-logs-nginx/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/10/elastic_3.webp" alt="Featured image of post ElasticStack : Collecter et exploiter des métriques provenant de nginx" /&gt;&lt;h2 id="comment-collecter--les-agents-beats-à-la-rescousse"&gt;Comment collecter ? Les agents Beats à la rescousse
&lt;/h2&gt;&lt;p&gt;Dans l’article précédent, je vous ai donné la marche à suivre pour &lt;a class="link" href="https://blog.zwindler.fr/2017/10/03/elasticstack-kibana-elasticsearch-logstash-beats/" &gt;déployer ELK très simplement sur un même serveur&lt;/a&gt;. Je vous avais aussi expliqué la nouvelle architecture d’ElasticStack et notamment l’ajout des agents Beats, moins gourmands et plus spécialisés que Logstash.&lt;/p&gt;
&lt;p&gt;Dans cet article je vais donc continuer où nous nous étions arrêté et faire un focus sur les agents &lt;strong&gt;Beats&lt;/strong&gt; pour les intégrer à notre plateforme ELK existante.&lt;/p&gt;
&lt;h2 id="qui-sont-ils--quels-sont-leurs-réseaux-"&gt;Qui sont-ils ? Quels sont leurs réseaux ?
&lt;/h2&gt;&lt;p&gt;Et oui parce qu’il y en a plusieurs. Si vous avez lu précédent, vous savez qu’il existe pour la collecte de données, en plus de Logstash, des modules plus légers dont la fonction n’est &lt;strong&gt;que&lt;/strong&gt; de récupérer les informations sur les noeuds que vous voulez surveiller (et rien de plus).&lt;/p&gt;
&lt;p&gt;On a donc :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Filebeat&lt;/strong&gt;, pour les fichiers de logs (texte)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metricbeat&lt;/strong&gt;, qui collecte tout un tas de métriques, notamment système, mais aussi provenant de Docker&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packetbeat&lt;/strong&gt;, qui remonte des informations réseaux. Attention je parle d’informations très poussées sur les échanges réseaux, à la transaction près ! On peut faire de superbes graphiques et des analyses très poussées de flux réseaux intermachines&amp;hellip; mais au prix d’un développement des dashboard assez complexe !&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Winlogbeat&lt;/strong&gt;, la même chose que Filebeat, mais sous Windows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heartbeat&lt;/strong&gt;, pour l’uptime (à quoi ça sert un module rien que pour ça et qui plus est pour l’afficher dans ELK&amp;hellip; mystère?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous trouverez plus d’informations sur &lt;a class="link" href="https://www.elastic.co/fr/products/beats" target="_blank" rel="noopener"
&gt;le site officiel&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="collecte-de-données-dans-des-fichiers-plats-avec-filebeat"&gt;Collecte de données dans des fichiers plats avec Filebeat
&lt;/h2&gt;&lt;p&gt;Pour faire un exemple simple, on va commencer par utiliser Filebeat, le module dédié à la collecte de logs (&lt;a class="link" href="https://www.elastic.co/guide/en/beats/filebeat/5.6/filebeat-installation.html" target="_blank" rel="noopener"
&gt;documentation&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Filebeat (et les autres modules Beats) utilise des fichiers YAML pour savoir quoi faire. Là encore, je vous met à disposition mon playbook Ansible permettant d’installer simplement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[A NOTER] Toute la configuration qui va suivre va être générée par le playbook ansible. Vous n’avez « rien » à faire mais je vous explique quand même ce que je fais histoire que vous puissiez reproduire vous même dans d’autre contexte. Le fameux poisson à pêcher proverbial, en somme.&lt;/strong&gt;&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-filebeat-nginx
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;cd /etc/ansible
cat deploy_filebeat_for_nginx.yml
---
- name: Install filebeat for nginx
hosts: @ip_ou_hostname_du_serveur_nginx
vars:
- elk_server: @ip_de_votre_serveur_elk
roles:
- { role: ansible-deploy-filebeat-nginx }
ansible-playbook deploy_filebeat_for_nginx.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le principe du playbook est de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;déployer sur un serveur avec nginx un collecteur filebeat&lt;/li&gt;
&lt;li&gt;qui va remonter les informations au logstash qu’on a installé sur notre serveur ELK&lt;/li&gt;
&lt;li&gt;qui sera lui même configuré pour traiter les données nginx&lt;/li&gt;
&lt;li&gt;et les réinjecter dans elasticsearch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tout ça en un ligne de commande. Elle est pas belle la vie ?&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="logstash-en-coupure"&gt;Logstash en coupure&amp;hellip;
&lt;/h2&gt;&lt;p&gt;Mais pourquoi s&amp;rsquo;embêter et passer par &lt;strong&gt;Logstash&lt;/strong&gt; quand &lt;strong&gt;Filebeat&lt;/strong&gt; envoie les logs et pas directement alimenter &lt;strong&gt;Elastisearch&lt;/strong&gt; (sur la même machine) ?&lt;br&gt;
C’est effectivement possible mais je préfère ne pas le faire pour plusieurs raisons.&lt;/p&gt;
&lt;p&gt;D’abord, l&amp;rsquo;empreinte mémoire est bien moins importante. Là où Logstash consomme par défaut entre 512 et 1024 Mo, Filebeat ne consomme que quelques dizaines de Mo, 100 grand maximum. Un réel gain sur une infrastructure, quelle soit petite ou grande (chez moi, chaque Go compte !).&lt;/p&gt;
&lt;p&gt;Ensuite, pour des raisons de sécurité, je n’ai autorisé que les connexions provenant de localhost sur Elasticsearch. Ainsi, seul Logstash (situé sur la même machine pourra y accéder), ce qui simplifie les autorisations au niveau du firewall et les flux de connexion. Les mauvaises langues diront « oui mais là tout le monde se connecte à Logstash, qui est sur la même machine, c’est pareil ».&lt;/p&gt;
&lt;p&gt;Certes. Mais rien ne vous oblige à tout héberger sur la même machine et vous pouvez sécuriser vous même un peu mieux la plateforme. Toujours est-il que seul mon unique logstash peut alimenter la base et c’est quand même mieux, conceptuellement parlant.&lt;/p&gt;
&lt;p&gt;Et enfin, Logstash dispose de plusieurs fonctionnalités pour trier et traiter les logs AVANT de les envoyer dans Elasticsearch, option que vous n’aurez pas si vous envoyez directement vos logs (ou toute autre information) directement depuis Beat vers Elasticsearch.&lt;/p&gt;
&lt;h2 id="configuration-de-filebeat"&gt;Configuration de Filebeat
&lt;/h2&gt;&lt;p&gt;Côté Beats, le template de configuration au format YAML est assez simple :&lt;br&gt;
Ici, on donne 2 fichiers à manger, qu’on type tous les deux comme des « log » (purement informatif), puis un hôte et un port pour le Logstash de destination.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/filebeat/filebeat.yml
filebeat.prospectors:
- type: log
paths:
- /var/log/nginx/access.log
document_type: nginx-access
- type: log
paths:
- /var/log/nginx/error.log
document_type: nginx-error
output.logstash:
hosts: mon_serveur_elk:5044
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-côté-nginx"&gt;Configuration côté nginx
&lt;/h2&gt;&lt;p&gt;Je ne vais pas insister longuement là dessus, mais j’utilise une modification de l’output du logs pour disposer d’une information supplémentaire pas indiquée par défaut : l’hôte dont provient la requête.&lt;/p&gt;
&lt;p&gt;En effet lorsque vous avez un serveur nginx, il ne vous indique pas dans le log l’URL exacte d’où vient la requête. Si comme moi, vous avez plusieurs « Virtual Hosts », pointant vers plusieurs serveurs, c’est très pratique pour débuguer en cas de mauvaises redirections.&lt;/p&gt;
&lt;p&gt;Rien ne vous oblige à utiliser « mon » log_format, mais il faudra bien entendu modifier ce qui va suivre dans ce cas là&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/nginx/conf.d/default_main_log_format.conf
#add host in default logging format
log_format main &amp;#39;$remote_addr - $remote_user [$time_local] &amp;#34;$host&amp;#34; &amp;#39;
&amp;#39;&amp;#34;$request&amp;#34; $status $body_bytes_sent &amp;#39;
&amp;#39;&amp;#34;$http_referer&amp;#34; &amp;#34;$http_user_agent&amp;#34;&amp;#39;;
# &amp;#39;$request_time&amp;#39;;
access_log /var/log/nginx/access.log main;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-de-logstash"&gt;Configuration de logstash
&lt;/h2&gt;&lt;p&gt;Nécessairement, puisque je passe par Logstash, je suis obligé de configurer Logstash (logique). C’est un mal pour un bien puisque ça me permet de traiter les lignes des fichiers de logs avant qu’ils soient intégrés dans Elasticsearch, comme je l’ai déjà dit.&lt;/p&gt;
&lt;p&gt;Du coup le fichier de configuration côté Logstash est forcément plus complexe.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;input {
beats {
port =&amp;gt; &amp;#34;5044&amp;#34;
}
}
filter {
#/var/log/nginx/access.log
if [type] == &amp;#34;nginx-access&amp;#34; {
grok {
match =&amp;gt; {
&amp;#34;message&amp;#34; =&amp;gt; &amp;#39;%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] &amp;#34;%{DATA:target_host}&amp;#34; &amp;#34;%{WORD:request_action} %{DATA:request} HTTP/%{NUMBER:http_version}&amp;#34; %{NUMBER:response} %{NUMBER:bytes} &amp;#34;%{DATA:referrer}&amp;#34; &amp;#34;%{DATA:agent}&amp;#34;&amp;#39;
}
}
date {
match =&amp;gt; [ &amp;#34;time&amp;#34;, &amp;#34;dd/MMM/YYYY:HH:mm:ss Z&amp;#34; ]
locale =&amp;gt; en
}
geoip {
source =&amp;gt; &amp;#34;remote_ip&amp;#34;
target =&amp;gt; &amp;#34;geoip&amp;#34;
}
useragent {
source =&amp;gt; &amp;#34;agent&amp;#34;
target =&amp;gt; &amp;#34;user_agent&amp;#34;
}
}
#/var/log/nginx/error.log
if [type] == &amp;#34;nginx-error&amp;#34; {
grok {
match =&amp;gt; {
&amp;#34;message&amp;#34; =&amp;gt; &amp;#39;(?&amp;lt;time&amp;gt;%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}.%{NUMBER}: %{DATA:errormessage}, client: %{IP:remote_ip}, server: %{IPORHOST:server}, request: &amp;#34;%{WORD:request_action} %{DATA:request} HTTP/%{NUMBER:http_version}&amp;#34;, host: &amp;#34;%{DATA:target_host}&amp;#34;&amp;#39;
}
}
geoip {
source =&amp;gt; &amp;#34;remote_ip&amp;#34;
target =&amp;gt; &amp;#34;geoip&amp;#34;
}
}
}
output {
elasticsearch {
hosts =&amp;gt; [ &amp;#34;mon_serveur_elk:9200&amp;#34; ]
index =&amp;gt; &amp;#34;logstash-%{+YYYY.MM.dd}&amp;#34;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Là on comprend qu’on va un peu plus en baver. Mais je vais y aller par étapes.&lt;/p&gt;
&lt;h2 id="le-plus-facile"&gt;Le plus facile
&lt;/h2&gt;&lt;p&gt;On va commencer par le plus facile : les balises &lt;em&gt;input&lt;/em&gt; et &lt;em&gt;output&lt;/em&gt;. En théorie, elles sont même auto-siffisantes. Si on ne met que ça, Logstash fera simplement office de passe plat.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;input {
beats {
port =&amp;gt; &amp;#34;5044&amp;#34;
}
}
[...]
output {
elasticsearch {
hosts =&amp;gt; [ &amp;#34;mon_serveur_elk:9200&amp;#34; ]
index =&amp;gt; &amp;#34;logstash-%{+YYYY.MM.dd}&amp;#34;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour faire clair, ici, on indique à Logstash de se mettre en écoute sur le 5044 pour des contenus provenant de beats, puis d’envoyer le résultat au serveur ELK dans l’index Logstash daté du jour. Trivial.&lt;/p&gt;
&lt;h2 id="filter"&gt;filter
&lt;/h2&gt;&lt;p&gt;Et là on arrive dans le vif du sujet. Si j’ouvre un log &lt;strong&gt;/var/log/nginx/access&lt;/strong&gt;, voici ce que je pourrais y trouver :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1.1.1.1 - - [02/Oct/2017:03:44:27 +0200] &amp;#34;blog.zwindler.fr&amp;#34; &amp;#34;GET /2015/02/11/irl-redhat-virtualise-et-haute-dispo-rhcs-vmdk-partage-vs-vsphere-replication/ HTTP/1.1&amp;#34; 200 18219 &amp;#34;-&amp;#34; &amp;#34;Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mon but ici, clairement, c’est de trouver comment débiter mon log en morceaux.&lt;/p&gt;
&lt;p&gt;Petite note moins anglophiles d’entre vous, log en anglais, ça veut dire journal mais aussi rondin (de bois). D’où le petit jeu de mot/analogie avec Logstash (un abris bois) où l’on stocke les rondins après les avoir tronçonnés. Ça explique aussi l’ancien logo :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/logstash-logo.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Comment ça on s’en fiche ? Moi ça me fait sourire ;-)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="accesslog"&gt;access.log
&lt;/h2&gt;&lt;p&gt;Si vous avez bien suivi plus haut, nous avons récolté et différencié 2 logs via l’attribut « document_type » : &lt;strong&gt;access.log&lt;/strong&gt; et &lt;strong&gt;error.log&lt;/strong&gt;. Je ne vais en décrire qu’un car le principe est similaire.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;filter {
#/var/log/nginx/access.log
if [type] == &amp;#34;nginx-access&amp;#34; {
grok {
match =&amp;gt; {
&amp;#34;message&amp;#34; =&amp;gt; &amp;#39;%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] &amp;#34;%{DATA:target_host}&amp;#34; &amp;#34;%{WORD:request_action} %{DATA:request} HTTP/%{NUMBER:http_version}&amp;#34; %{NUMBER:response} %{NUMBER:bytes} &amp;#34;%{DATA:referrer}&amp;#34; &amp;#34;%{DATA:agent}&amp;#34;&amp;#39;
}
}
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ici, une fois ma balise ouverte, je commence par ajouter une clause « if » qui va me permet de filtrer le log en fonction du document_type du log dont il s’agit.&lt;/p&gt;
&lt;p&gt;Ensuite, je lui indique que je souhaite utiliser « grok », un module pour parser mes données brutes. Grok utilise ensuite la fonction match sur l’attribut « message » (ma ligne de log, rappelez vous) sur lequel je vais appliquer une sorte d’expression régulière qui va devoir matcher votre ligne de log à tous les coups !&lt;/p&gt;
&lt;p&gt;Et quand on a dit ça, on a tout dit. Préparez vous à des tonnes de fun !&lt;/p&gt;
&lt;p&gt;Alors bien entendu, si vous êtes chanceux, vous trouverez toujours une bonne âme qui partagera avec l’Internet le bon pattern qui correspond au bon output de votre log pour votre application. Mais sachez que des fois, il n’y a d’autres choix que de tester à la main&amp;hellip; et c’est long !&lt;/p&gt;
&lt;p&gt;La méthode bourrin pour vérifier que votre pattern est la suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;modifier la configuration dans logstash&lt;/li&gt;
&lt;li&gt;redémarrer logstash&lt;/li&gt;
&lt;li&gt;attendre un peu pour que des logs soient générés et vérifier dans kibana que ça fonctionne correctement&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;grokparsefailure ==&amp;gt; dommage vous pouvez recommencer&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Heureusement au fil de mes recherches, je suis tombé sur un outil qui vous aide à tester sans devoir dérouler ce fastidieux processus&amp;hellip; Vous pouvez &lt;a class="link" href="http://grokconstructor.appspot.com/do/match?example=3" target="_blank" rel="noopener"
&gt;simuler sur cette page web vos pattern grok sur des bouts de logs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ça change la vie !&lt;/p&gt;
&lt;h2 id="le-mot-de-la-fin"&gt;Le mot de la fin
&lt;/h2&gt;&lt;p&gt;Voilà, vous avez maintenant des logs qui remontent dans nginx et qui contiennent pléthore d’informations sur les requêtes entrantes et les utilisateurs. De quoi s’amuser pendant des heures pour créer des graphiques puis des dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/09/elk16.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Je ferai rapidement un prochain article sur la partie utilisation de Kibana car pour l’instant vous ne pouvez pas faire grand chose avec ça ;-).&lt;/p&gt;
&lt;p&gt;J’ai également développé d’autres playbook pour déployer les autres modules Beats, je ferai également un article là dessus.&lt;/p&gt;
&lt;p&gt;En attendant : have fun !&lt;/p&gt;
&lt;h2 id="pour-aller-plus-loin"&gt;Pour aller plus loin
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.digitalocean.com/community/tutorials/how-to-use-kibana-dashboards-and-visualizations" target="_blank" rel="noopener"
&gt;www.digitalocean.com/community/tutorials/how-to-use-kibana-dashboards-and-visualizations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/elastic/examples/tree/d2ed15be22d3c06a8b48056b64cd50734ee41c4b/ElasticStack_NGINX" target="_blank" rel="noopener"
&gt;github.com/elastic/examples/tree/master/ElasticStack_NGINX (lien mort, j&amp;rsquo;ai récupéré une vieille version du code)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://logz.io/blog/nginx-access-log-monitoring-dashboard/" target="_blank" rel="noopener"
&gt;logz.io/blog/nginx-access-log-monitoring-dashboard/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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>