Guide d'Analyse des Logs avec ELK
Guide d'Analyse des Logs avec ELK
Hello les champions, ça vous tente de superviser vos logs de manières différentes ?
Je suppose que la réponse est oui 🤩! Dans ce guide, nous allons découvrir pourquoi
l'analyse de log connaît-il un tel intérêt et nous allons jeter un regard complet
sur les différentes technologies composant la pile ? Le but est de comprendre
quel rôle ils jouent dans vos analyses de données. Enfin dans les futurs chapitres de
ce cours nous verrons plus en détail comment les installer, les configurer et les utiliser
et comment éviter au mieux certains pièges courants en cours de route.
Public visé
Cette série d'articles est conçue pour les débutants ayant besoin de comprendre
l'utilisation de la suite ELK à partir de zéro. Ce tutoriel vous donnera une
compréhension suffisante de la technologie, qui vous permettra plus tard d’atteindre
des niveaux d’expertise beaucoup plus élevés.
Prérequis
L'analyse de logs
Les logs sont l'une des informations les plus précieuses en matière de gestion et de
surveillance des systèmes informatiques. Comme ils enregistrent toutes les actions qui
ont eu lieu sur une machine, ils fournissent des informations dont vous avez besoin
pour repérer les problèmes susceptibles d'avoir un impact sur les performances,
la conformité et la sécurité des éléments de votre infrastructure. C'est pourquoi la
gestion des logs devrait faire partie de toute infrastructure de surveillance.
L'analyse de logs est le processus consistant à donner du sens aux messages de logs
générés par votre système dans le but d'utiliser ces données pour améliorer ou
résoudre des problèmes de performances au sein d'une application ou d'une
infrastructure. Dans une vue d'ensemble, les entreprises analysent les logs pour
atténuer les risques de manière proactive et réactive, se conformer aux politiques de
sécurité, aux audits et aux réglementations, et permet également de mieux
comprendre le comportement de vos utilisateurs utilisant vos applications.
Lorsque vous tirez parti de l'analyse des logs, vous pouvez détecter les problèmes
avant ou lorsqu'ils surviennent et éviter le gaspillage de temps, les retards inutiles et
les coûts supplémentaires qui vont avec. Ainsi, les équipes peuvent intervenir et
résoudre les problèmes plus rapidement, leurs permettant ainsi de se concentrer
davantage sur l'amélioration des fonctionnalités existantes et sur l'ajout de nouvelles
fonctionnalités aux produits et services qu'ils créent au lieu de passer du temps à
dépanner manuellement. Cela, à son tour, augmente la valeur des logiciels qu'ils
construisent et conduit à des versions plus fréquentes (DevOps) et augmente la valeur
globale pour l'entreprise.
L'analyse des logs est un processus complexe qui doit suivre les bonnes pratiques
suivantes :
ELK
C'est quoi ELK ?
La stack ELK est un acronyme utilisé pour décrire une pile qui comprend trois projets
open sources populaires : Elasticsearch, Logstash et Kibana. Elle est la
principale solution open source de gestion des logs pour les entreprises qui
souhaitent bénéficier des avantages d'une solution de journalisation centralisée.
En effet, les outils : Elasticsearch, Logstash et Kibana, lorsqu'ils sont utilisés ensemble
(car oui on peut les utiliser séparément ou avec d'autres technologies), forment une
pile de bout en bout offrant une analyse de données dont des logs en temps réel afin
de fournir des informations exploitables à partir de presque tout type de source de
données structurée et non structurée. Vous comprendrez plus tard que chacun de ces
produits joue un rôle différent dans vos analyses. Ils peuvent être utilisés pour des
projets simples ou complexe car ils prennent en charge des opérations simples et
avancées.
Il est important de dissocier le rôle de ces 3 outils afin de mieux comprendre le rôle et
la communication de l'ensemble de ces composants :
Information
Récemment, un nouvel outil a été rajouté à la Stack Elastic nommé Beats il est très
utile si vous utilisez plusieurs machines car ça reste un agent léger et réservé au
transfert de données, il se charge de transférer les données vers Logstash et
Elasticsearch. Nous l'utiliserons dans un futur chapitre.
Comme il l'est mentionné ci-dessus, prit ensemble, les différents composants de la pile
ELK fournissent une solution simple mais puissante pour la gestion et l'analyse des
logs.
Logstash sera utilisé pour récupérer, filter et normaliser des informations liées à vos
logs issues de différents sources. Une fois cela fait, Logstash envoie ces informations
dans un système de stockage ici Elasticsearch qui quant à lui se chargera d'indéxer,
stocker et effectuer une recherche et une analyse en temps réel de vos données.
Enfin, Kibana récupère ces données afin de fournir un système de visualisation et
d'exploration en plus de Logstash et Elasticsearch afin que vous puissiez facilement
comprendre vos données sous forme de tableaux et de graphiques.
Information
Cependant, pour gérer des pipelines plus complexes conçus pour gérer de grandes
quantités de données en production, des composants supplémentaires sont
susceptibles d'être ajoutés à votre architecture de journalisation comme par ex : Kafka,
RabbitMQ, Redis.
Études de cas
NetFlix s'appuie fortement sur la pile ELK. L'entreprise utilise la pile ELK pour
surveiller et analyser les logs de sécurité des opérations du service client. Il leur
permet d'indexer, de stocker et de rechercher des documents à partir de plus
de quinze clusters qui comprennent près de 800 nœuds.
LinkedIn utilise la pile ELK pour surveiller leurs performances et leur sécurité.
L'équipe informatique a intégré ELK à Kafka pour comprendre leur charge en
temps réel. Leur opération ELK comprend plus de 100 clusters dans six
datacenters différents.
Medium est une célèbre plateforme de publication de blogs. Ils utilisent la pile
ELK pour déboguer leurs problèmes de production. De plus, en utilisant cette
pile, la société peut prendre en charge 25 millions de lecteurs uniques ainsi que
des milliers de publications publiées chaque semaine.
Conclusion
Retrouvons-nous dans le prochain chapitre afin d'installer et configurer notre
environnement ELK.
Installation et configuration de
la stack ELK
Dans ce chapitre, nous allons procéder à l'installation et la
configuration des différents composants de la suite ELK.
Introduction
La stack ELK peut être installée à l'aide d'une variété de méthodes et sur un large
éventail de systèmes d'exploitation et d'environnements différents. Vous
pouvez installer ELK localement, sur le cloud, à l'aide de Docker et de systèmes de
gestion de configuration comme Ansible, Puppet et Chef. La pile peut être également
installée à l'aide de votre gestionnaire de paquets ou manuellement depuis les binaires
officiels. Voici le lien pour la page officielle des multiples méthodes d'installation d'ELK.
Information
Pour ceux travaillant sur une machine Windows, veuillez créer une machine virtuelle
afin de poursuivre du mieux ce cours.
À savoir
Lors de l'installation d'ELK, vous devez utiliser la même version sur l'ensemble de la
pile. Par exemple, si vous utilisez Elasticsearch 7.8.0 alors Kibana doit être aussi sous
sa version 7.8.0 et même pour pour Logstash en version 7.8.0.
Si vous mettez à niveau une installation existante, consultez la page officielle de Mise
à niveau de la pile ELK.
Ordre d'installation
Pour installer les produits ELK il est recommandé de respecter l'ordre suivant afin de
garantir que les composants dont chaque produit dépend sont résolus :
1. Elasticsearch
2. Kibana
3. Logstash
Installation
Elasticsearch
Installation
Tout d'abord, vous devez ajouter la clé de signature d'Elastic pour que le package
téléchargé puisse être vérifié (ignorez cette étape si vous avez déjà installé des
packages d'Elastic):
Si vous êtes sur une machine de la famille de Debian, vous devez installer le
paquet apt-transport-https :
sudo apt-get install apt-transport-httpsCopier
[elasticsearch]
baseurl=[Link]
gpgcheck=1
gpgkey=[Link]
enabled=0
autorefresh=1
type=rpm-mdCopier
Il ne vous reste plus qu'à mettre à jour vos référentiels et installer Elasticsearch:
# Avant (1go)
-Xms1g
-Xmx1g
-Xms512mo
-Xmx512moCopier
Lancement et test
Si jamais vous rencontrez des problèmes d'initialisation, veuillez vérifier les logs du
service elasticsearch à l'aide de la commande suivante :
sudo journalctl -f -u elasticsearchCopier
Pour confirmer que tout fonctionne comme prévu, pointez votre commande curl ou
votre navigateur sur l'adresse [Link] et vous devriez voir quelque chose
comme la sortie suivante :
curl localhost:9200Copier
Résultat :
"name" : "hatim-linux",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "U1zH_yFqTUmdMRckR1gHLQ",
"version" : {
"number" : "7.8.0",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65",
"build_date" : "2020-06-14T[Link].234439Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
kibana
Installation
Puisque nous avons déjà défini le dépôt dans le système, tout ce que nous avons à
faire pour installer kibana est d'exécuter la commande suivante:
configuration
[Link]: ["[Link]
Lancement et test
Si jamais vous rencontrez des problèmes d'initialisation, veuillez vérifier les logs du
service kibana comme suit :
Pour tester Kibana, ouvrez dans votre navigateur l'url [Link] afin de voir
la page d'accueil Kibana :
Logstash
Installation
# ou java 8
java -versionCopier
Résultat :
...
Comme pour kibana, puisque nous avons déjà défini le dépôt dans le système, tout ce
que nous avons à faire pour installer Logstash est d'exécuter:
Configuration
Lancement et test
Si jamais vous rencontrez des problèmes d'initialisation, vérifiez les logs du service
Logstash comme suit :
Pour tester votre installation Logstash, vous devez configurer un pipeline de données.
Nous aborderons cette partie dans le prochain chapitre.
Utilisation de la stack ELK sur
les logs Apache
Dans ce chapitre, nous allons apprendre à utiliser la stack ELK
en analysant en temps réel les logs d'accès Apache.
Introduction
Après avoir installé la suite ELK dans l'article précédent. Nous allons dans cet article
pratiquer et s'initier à l'utilisation des différents composants de la stack
ELK en analysant en temps réel les logs d'accès Apache.
Prérequis
Pour bien suivre cet article, vous devez au préalable installer et démarrer le package
d'Apache sur votre machine ELK. Pour cela, lancez les commandes suivantes :
Enfin, très important, n'oubliez pas de rajouter l'utilisateur logstash au groupe adm :
Information
Le groupe d'utilisateurs adm est utilisé pour permettre à ses membres de lire le
contenu des fichiers de logs.
Logstash
La première étape à effectuer est le traitement des logs sous forme d'un ou plusieurs
pipelines avec l'outil Logstash.
Pour utiliser Logstash, il faut créer des fichiers de configuration qui contiendront trois
sections principales que nous allons par passer en revue ci-dessous. À savoir que
chacune de ces sections est responsable de différentes fonctions et utilisant différents
plugins Logstash.
input {}
filter {}
output {}Copier
Entrées Logstash
Les points de départ de toute configuration Logstash sont vos entrées. Les entrées
sont des plugins Logstash responsables de la récupération des données de différentes
sources de données. Vous trouverez l'intégralité des plugins d'entrée ici. Pour notre
exemple, nous avons besoin de récupérer les données depuis un fichier donc nous
utiliserons le plugin d'entrée file , comme suit :
input {
...Copier
input {
...Copier
En regardant la documentation du plugin d'entrée file , vous remarquerez que vous
pouvez utiliser différents paramètres pour cette entrée. Comme par exemple, le
paramètre start_position qui permet de choisir où Logstash doit commencer sa
lecture initiale des fichiers, soit au début ou à la fin. La valeur par défaut est end qui
traite les fichiers comme des flux direct en temps réel (comme la commande tail -f)
et comme son nom l'indique, la lecture débutera à partir de la fin du fichier, mais si
vous souhaitez lire un fichier depuis le début, forcez alors la valeur à beginning :
input {
file {
...Copier
Par défaut, logstash écrit la dernière position de lecture dans un fichier log qui réside
généralement dans $HOME/.sincedb ou dans le
dossier /var/lib/logstash/plugins/inputs/file/. Afin de forcer la relecture complète d'un
fichier à chaque exécution de logstash, il faut changer le chemin du fichier de logs de
position en valorisant sincedb_path à /dev/null. Ou sinon vous pouvez supprimer
uniquement la ligne correspondante de votre fichier .sincedb et redémarrez le service
logstash.
Filtres Logstash
Les filtres sont des modules qui vont traiter les données récupérées depuis l'input en
s'aidant lui aussi de différents plugins de filtrage. Pour notre exemple, nous utiliserons
le plugin grok qui vous permet d'analyser facilement des données de logs non
structurées en quelque chose de plus exploitable en utilisant des expressions
régulières. Cet outil est parfait pour tout format de logs généralement écrit pour les
humains comme les logs applicatifs (ex: mysql, apache, nginx, etc ...).
%{SYNTAX:SEMANTIC}
SYNTAX : nom du pattern qui correspond à un filtre prédéfini, comme par exemple le
pattern NUMBER qui prend en compte des nombres tel quel 3 ou 3.55 ou le
pattern IP qui correspond à une IP comme [Link].
SEMANTIC est l'identifiant de la valeur récupérée par votre SYNTAX.
filter {
grok {
}Copier
client: [Link]
method: GET
request: /[Link]
bytes: 15824
duration: 0.043
Pour notre besoin, nous allons plutôt découvrir et utiliser des patterns APACHE grok
pré-configurés. Vous pouvez utiliser soit le pattern COMMONAPACHELOG qui récupère des
informations de base (IP source, code HTTP, etc ...) ou le
pattern COMBINEDAPACHELOG qui récupère des informations supplémentaires comme
le user-agent.
Information
Pour les plus curieux d'entre vous qui souhaitent connaître le pattern complet
de COMMONAPACHELOG et COMBINEDAPACHELOG , regardez la ligne sous le commentaire
"# Log formats" sur les sources de l'APACHE pattern.
Pour tester vos patterns, vous pouvez soit utiliser un plugin de sortie que nous verrons
dans la section suivante, ou bien utilisez un débogueur grok en ligne,
comme grokdebug. Pour utiliser l'exactitude d'exécution de votre pattern sur votre
débogueur, vous n'avez qu'à copier quelques lignes de vos logs apaches :
# famille Debian
tail /var/log/apache2/[Link]
# famille Redhat
tail /var/log/[Link]
Résultat :
input {
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
date {
mutate {
convert => {
}Copier
J'ai fait exprès de rajouter deux nouveaux filtre date et mutate, car ils nous serviront
plus tard pour nos visualisations sur Kibana :
Par défaut, logstash basera son horodatage sur l'heure à laquelle l'entrée du fichier de
log a été lue et non sur l'horodatage fourni par le fichier de logs Apache. D'où
l'utilisation du filtre de date qui basera son horodatage sur les dates des champs filtrés
par grok, soit l'horodatage réel fourni par le fichier de log Apache.
J'utilise également le filtre mutate avec l'action convert afin de convertir la réponse
HTTP et la taille de la requête qui sont par défaut en type string vers le type entier, car
en effet, Kibana gère ses visualisations différemment selon le type de données que
vous lui envoyez.
Sorties Logstash
Les points d'arrivée de toute configuration Logstash sont vos sorties, lui-même
utilise différents plugins de sortie qui envoient les données traitées par la phase de
filtrage à une destination particulière (ex: elasticsearch). Par ailleurs, les sorties sont la
dernière étape du pipeline Logstash.
Pour cet article, je vais vous dévoiler comment récupérer les événements sur la
sortie standard avec le plugin de sortie stdout avant de les envoyer plus tard à
elasticsearch. Le plugin stdout propose différents formats de sortie, dans notre
exemple nous utiliserons le format rubydebug, comme ceci :
input {
filter {
grok {
date {
mutate {
convert => {
output {
}Copier
Debug
Dans cette partie je souhaite vous montrer comment vous pouvez debug votre pipeline
Logstash afin d'utiliser du mieux ce plugin, pour cela il faut commencer par stopper le
service logstash :
Ensuite, nous allons vérifier la syntaxe de notre code Logstash avec le binaire
logstash situé dans /usr/share/logstash/bin/logstash en utilisant l'option -t ou
l'option --config.test_and_exit :
Attention
Selon le type d'installation que vous avez choisi, le binaire logstash peut se trouver
dans un autre dossier.
Résultat :
...
Configuration OK
Information
Une fois la syntaxe validée, relancez la commande sans l'option -t mais avec
l'option --debug:
Visitez ensuite depuis votre navigateur la page d'accueil [Link] et revenez sur
la sortie standard de votre logstash pour observer le résultat suivant :
ElasticSearch
input {
filter {
grok {
date {
mutate {
convert => {
output {
elasticsearch {
hosts => "localhost:9200"
}Copier
Après démarrage de votre service, logstash va lancer votre pipeline. Ensuite vous
pouvez vérifier si l'index s'est correctement créé, pour cela appelez l'API REST fournie
par elasticsearch, comme suit :
curl "localhost:9200/_cat/indices?v"Copier
Résultat :
Kibana
Index Patterns
Dans notre cas le préfix de nos indexs apache est "apache-", donc le pattern index à
créer dans kibana sera apache-* :
Cliquez ensuite sur "Next Step". Ensuite il nous demande par quel moyen il doit gérer
le filtre temporel (timestamp). Ce filtre est utile pour filtrer et affiner nos données par
plage horaire. Nous avions prévu le coup sur notre configuration logstash en créant un
champ @timestamp, et c'est celui là qu'on sélectionnera :
Enfin, cliquez sur le bouton "Create index pattern" et vous verrez apparaître tous vos
champs :
>
Vous avez également la possibilité de filtrer vos logs par champ depuis la barre de
recherche du Discover :
Exemple : "response : 404" pour n'afficher que les requêtes en erreur 404.
Dashboard
L'étape suivante est de créer un tableau de bord afin de visualiser une collection
de visualisations en temps réel. Pour commencer, ouvrez le menu, accédez à
Dashboard , puis cliquez sur "Create dashboard" :
>
Pour ajouter des éléments à votre dashboard vous devez créer des visualisations
Kibana que vous pouvez déplacer et redimensionner dans votre dashboard. Vous
pouvez ajouter des visualisations à partir de plusieurs indexs patterns et la même
visualisation peut apparaître dans plusieurs tableaux de bord.
Dans notre exemple nous allons commencer par créer une visualisation qui permet
d'afficher le nombre total d'utilisateurs unique. Pour ce faire, créez une visualisation en
cliquant sur "Create new" et dans la fenêtre de "New visualisation" nous allons choisir
le type de visualisation "Metric" :
Pour information, voici la liste des types de visualisations Kibana les plus
fréquemment utilisées :
Information
Rajoutons un autre graphique qui permet d'afficher la taille moyenne des requêtes
temporellement. Pour ce type de besoin nous aurons besoin d'une visualisation de
type "area". Pour l'axe Y nous allons utiliser une agrégation de type "Average" sur le
champ byte :
Pour l'axe X ça sera un peu différent car nous utiliserons les Bucket aggregations qui
trient les documents en compartiments selon le contenu du document. Voici les
valeurs les plus communes :
Chapitre précédent
Comprendre et utiliser Filebeat
dans la stack ELK
Dans ce chapitre, nous allons apprendre à utiliser Filebeat
dans la suite ELK en analysant les logs Apache.
ntroduction
Tout comme Logstash, Filebeat peut être utilisé pour envoyer des logs à partir d'une
source de données basée sur des fichiers vers une destination de sortie prise en
charge. Mais la comparaison s'arrête là. Car dans la plupart des cas, nous utiliserons
les deux en tandem lors de la création de notre pipeline de journalisation avec la pile
ELK, puisque les deux ont une fonction différente.
La limite de Logstash
Logstash a été développé à l'origine par Jordan Sissel pour gérer le streaming d'une
grande quantité de données de logs provenant de plusieurs sources, et après que
Sissel a rejoint l'équipe Elastic, Logstash est passé d'un outil autonome à une partie
intégrante de la pile ELK (Elasticsearch, Logstash, Kibana).
La naissance de Beats
Pour collecter des logs sur des machines distantes, Filebeat est recommandé car il
nécessite moins de ressources qu'une instance de Logstash. Cependant, vous
utiliseriez Logstash si vous souhaitez manipuler vos logs pour ajouter ou supprimer
des champs ou enrichir vos données à l'aide de filtres d'entrée/sortie pour les envoyer
ensuite à Elasticsearch. Quant à Filebeat, c'est un choix parfait pour récupérer une
donnée déjà traitée et la transmettre directement à Elasticsearch.
Il existe plusieurs façons d'installer Filebeat. Dans notre cas nous allons installer
Filebeat depuis le gestionnaire de paquets par défaut de notre distribution. Pour ce
faire, vous devrez d'abord mettre à niveau votre système et vos paquets:
Pour les machines appartenant à la famille debian, vous devrez peut-être installer le
paquet apt-transport-https avant de continuer:
[elastic-7.x]
baseurl=[Link]
gpgcheck=1
gpgkey=[Link]
enabled=1
autorefresh=1
type=rpm-mdCopier
Il ne vous reste plus qu'à mettre à jour vos référentiels et installer Filebeat:
Si jamais vous rencontrez des problèmes d'initialisation, veuillez vérifier les logs du
service Filebeat à l'aide de la commande suivante :
[Link]:
hosts: ["localhost:9200"]
...
[Link]:
host: "localhost:5601"
...
# Optionnelle
[Link]:
path: ${[Link]}/modules.d/*.yml
[Link]: true
[Link]: 15sCopier
Les modules Filebeat vous permettent de commencer rapidement à traiter les formats
de logs courants. Ils contiennent des configurations par défaut, des définitions de
pipeline pour Elasticsearch et des tableaux de bord préfabriqués Kibana pour vous
aider à mettre en œuvre et à déployer une solution de surveillance des logs
rapidement. La liste des modules est disponible ici.
Pour cet article, nous allons utiliser le module apache2 afin d'analyser les logs
d'accès et d'erreurs créés par un serveur Apache . Lorsque vous exécutez le
module, il effectue quelques tâches automatiquement pour vous :
Définit les chemins des fichiers logs par défaut (vous pouvez remplacer les
valeurs par défaut)
S'assure que chaque événement de logs multiligne est envoyé en tant
qu'événement unique
Analyse et traite les lignes de log Apache automatiquement, et façonne les
données dans une structure adaptée à la visualisation dans Kibana
Déploie des tableaux de bord automatique dans Kibana pour visualiser les
données de vos logs
Résultat :
● [Link] - Elasticsearch
● [Link] - Kibana
Pour remplacer les chemins par défaut pour l'accès au serveur HTTP Apache et
les logs d'erreurs dans Logstash. Rendez-vous dans le fichier de configuration du
module apache /etc/filebeat/modules.d/[Link]:
- module: apache
access:
enabled: true
[Link]: ["/nouveau-path/log/apache/[Link]*"]
error:
enabled: true
[Link]: ["/nouveau-path/log/apache/[Link]*"]Copier
Résultat :
Enabled:
apache
Disabled:
activemq
...
Ensuite lancez la sous-commande setup pour charger les tableaux de bord dans
Kibana (la commande peut prendre un peu de temps pour se terminer):
Résultat :
Overwriting ILM policy is disabled. Set `[Link]: true`
for enabling.
Loaded dashboards
See more:
[Link]
L'étape suivante est de visualiser notre tableau de bord afin de visualiser la collection
de visualisations en temps réel issue par notre module Apache Filebeat. Pour ce faire,
sur le menu à gauche cliquez sur Dashboard:
Recherchez et cliquez sur les Dashboards Apache:
Vous obtenez ainsi le dashboard suivant:
Dans notre beau dashboard, nous observons:
Une carte monde qui géolocalise la provenance des requêtes selon les
adresses IP sources
Un graphe du taux de code de réponse HTTP dans le temps
Des graphiques circulaire avec des statistiques sur les principales URL par
code de réponse HTTP
Un autre sur la répartition des navigateurs
Un graphe sur les logs d'erreurs au fil du temps
Puis en dessous comme pour le tableau de bord des logs système, on a les
trames des logs que l’on peut dérouler pour avoir plus d’informations, triables
par date, par machine, user-agent, ip ou n’importe quels champs.
Si vous souhaitez utiliser Logstash pour effectuer un traitement supplémentaire sur les
données collectées par Filebeat, vous devez configurer Filebeat pour utiliser
Logstash.
Avant de créer le pipeline Logstash, vous configurerez Filebeat pour envoyer des
lignes de logs à Logstash. Pour cela, modifiez le fichier /etc/filebeat/[Link]:
- type: log
enabled: true
paths:
- /var/log/*.log
# On ne souhaite plus envoyer directement nos données à elasticsearch
(à commenter comme ci-dessous)
#[Link]:
#hosts: ["localhost:9200"]
[Link]:
hosts: ["localhost:5044"]Copier
input {
beats {
}
filter {
grok {
date {
mutate {
convert => {
output {
En plugin d'entrée nous utilisons Beats qui écoute par défaut sur le port 5044. Pour le
plugin de filtre et de sortie nous utilisons ceux déjà expliqués dans le chapitre
précédent.
Vérifions déjà si notre configuration Logstash est correcte. Pour cela il faut commencer
par stopper le service Logstash:
Résultat :
...
Configuration OK
Une fois la syntaxe validée, relançons la commande sans l'option -t mais avec
l'option --debug:
[0] "beats_input_codec_plain_applied"
],
....
...
},
"event" => {
},
"ecs" => {
},
"fileset" => {
},
"service" => {
},
"input" => {
},
Copier
Le résultat nous dévoile que nous récupérons les bonnes données. Maintenant,
modifions notre fichier [Link] pour communiquer désormais avec elasticsearch:
input {
beats {
}
}
filter {
grok {
date {
mutate {
convert => {
}
output {
elasticsearch {
}Copier
curl "localhost:9200/_cat/indices?v"Copier
Résultat :
Dans notre cas le préfix de nos indexs apache est "apache-", donc le pattern index à
créer dans kibana sera apache-*:
Cliquons ensuite sur "Next Step". Ensuite il nous demande par quel moyen il doit gérer
le filtre temporel (timestamp) afin d'affiner nos données par plage horaire. Nous
sélectionnerons le champ @timestamp :
Enfin, cliquons sur le bouton "Create index pattern" et nous verrons apparaître tous
nos champs:
>
Pour découvrir nos logs, il suffit d'aller sur le menu à gauche et de cliquer sur
"Discover":
Ensuite, faisons quelques visites depuis notre navigateur sur la page d'accueil
d'Apache [Link] et revenons sur la page de Discover en choisissant le bon
pattern index apache-* :
Conclusion
Une consommation de ressources a fait de Logstash un maillon faible de la pile ELK.
Pourtant, malgré ces défauts, Logstash reste un composant crucial de la pile, et ce
principalement pour manipuler les données avant de les envoyer à Elasticsearch.
Elastic a fait de grands pas en essayant d'atténuer ces douleurs en introduisant Beats,
ce qui a permis aux utilisateurs de créer et de configurer plusieurs pipelines de
journalisation résilientes et finalement de faire la journalisation avec ELK beaucoup
plus fiable.
Introduction
Nous avons vu que la pile ELK, traditionnellement composée d'Elasticsearch,
Logstash et Kibana, comprend désormais également un quatrième élément nommé
Beats qui comprend une variété d'expéditeurs de données différents.
Dans le chapitre précédent sur Filebeat , nous avons décrit comment utiliser Filebeat
pour envoyer des fichiers logs dans la pile. Dans ce chapitre, nous allons apprendre à
utiliser Metricbeat qui fait partie de la famille d'expéditeurs Beats les plus populaires.
Metricbeat a évolué à partir de Topbeat et, comme les autres Beats, il est basé sur le
framework Go nommé Libbeat. C'est est un agent léger qui peut être installé sur les
serveurs cibles pour collecter périodiquement des métriques à partir de vos serveurs
cibles. Il peut s'agir de métriques de système d'exploitation telles que le processeur ou
la mémoire ou des données liées aux services exécutés sur le serveur. C'est un
expéditeur léger qui peut être installé sur les serveurs cibles pour collecter et
expédier périodiquement diverses métriques de système et de service vers une
destination de sortie spécifiée.
C'est donc un agent qui est installé pour mesurer les performances de vos
serveurs, ainsi que celles les différents services externes qui s'exécutent sur eux. Par
exemple, vous pouvez utiliser Metricbeat pour surveiller à la fois la consommation du
processeur/mémoire de votre serveur et à la fois les métriques de performances de
vos conteneurs.
Tout comme pour Filebeat, il peut être configuré pour envoyer directement la sortie à
Elasticsearch ou à Logstash si vous souhaitez transformer les données au préalable.
Installation et configuration de
Metricbeat
Installation de Metricbeat
Comme pour Filebeat, il existe plusieurs façons d'installer Metricbeat. Dans notre cas
nous allons comme pour Filebeat, soit installer Metricbeat depuis le gestionnaire
de paquets par défaut de notre distribution. Pour ce faire, vous devrez d'abord mettre
à niveau votre système et vos paquets:
Pour les machines appartenant à la famille debian, vous devrez peut-être installer le
paquet apt-transport-https avant de continuer:
L'étape suivante consiste à ajouter le dépôt Elastic sur votre système (étape non
obligatoire, si vous avez suivie le chapitre précédent) :
Sous la famille redhat, créez un fichier et nommez le par exemple [Link] dans le
répertoire /etc/[Link].d/, contenant:
[elastic-7.x]
baseurl=[Link]
gpgcheck=1
gpgkey=[Link]
enabled=1
autorefresh=1
type=rpm-mdCopier
Il ne vous reste plus qu'à mettre à jour vos référentiels et d'installer Metricbeat:
Si jamais vous rencontrez des problèmes d'initialisation, veuillez vérifier les logs du
service Metricbeat à l'aide de la commande suivante :
Configuration de Metricbeat
[Link]:
hosts: ["localhost:9200"]
...
[Link]:
host: "localhost:5601"
...
# Optionnelle
[Link]:
path: ${[Link]}/modules.d/*.yml
[Link]: true
[Link]: 15sCopier
Dans cet exemple, nous allons configurer Metricbeat pour utiliser le module
system afin de surveiller et collecter les métriques systèmes du serveur, telles que
l'utilisation du processeur et de la mémoire, le réseau, le disque etc.
Avant de suivre ces étapes, vérifiez qu'Elasticsearch et Kibana sont en cours
d'exécution et qu'Elasticsearch est prêt à recevoir des données de MetricBeat:
Résultat :
● [Link] - Elasticsearch
- module: system
period: 10s
metricsets:
- cpu
- load
- memory
- network
- process
#- process_summary
#- socket_summary
#- entropy
#- core
#- diskio
#- socket
#- service
#- users
process.include_top_n:
...Copier
Dans mon cas je récupère périodiquement toutes les 10 secondes des métriques de
mon serveur sur le cpu, mémoire, réseaux, disques et processus en cours d'exécution
ainsi que le top 10 (au lieu de 5 par défaut) des processus qui consomment le plus de
cpu et de mémoire.
Résultat :
Enabled:
system
Disabled:
activemq
aerospike
apache
...
Ensuite lancez la sous-commande setup pour charger les tableaux de bord dans
Kibana (la commande peut prendre un peu de temps pour se terminer):
Résultat :
Loaded dashboards
Dans la partie précédente, nous avons expliqué comment utiliser Metricbeat pour
envoyer des métriques systèmes. Il est maintenant temps de collecter et expédier des
métriques pour un service ciblé. Dans cet exemple, je vais surveiller les métriques à
partir des conteneurs Docker exécutés sur un système hôte. Pour ce faire nous
utiliserons le afin d'avoir des données prédéfinies pour collecter et envoyer des
métriques et des statistiques de service de conteneur Docker à Logstash ou
Elasticsearch.
Pour récupérer les métriques des conteneurs Docker, nous allons utiliser le module
docker Metricbeat qui est livré avec un certain nombre d'ensemble de métriques par
défaut dont nous avons besoin, tels que les informations sur les conteneurs ainsi que
leur consommation du cpu, mémoire, disque, network etc...
Tout d'abord, je vais supposer que vous disposez déjà d'un environnement Docker
fonctionnel sur votre système, si ce n'est pas le cas merci de suivre mon article sur
l'installation de docker. Vous aurez besoin d'au moins un conteneur en cours
d'exécution dans Docker dans le but d'envoyer des données utiles à Elasticsearch et
Kibana. Pour cet article, nous allons exécuter deux conteneurs, qui sont:
et
docker psCopier
Résultat :
- module: docker
metricsets:
- container
- cpu
- diskio
- event
- healthcheck
- info
- memory
- network
- image
period: 10s
hosts: ["unix:///var/run/[Link]"]Copier
Il s'agit d'une configuration minimale suffisante pour lancer Metricbeat. Nous avons
spécifié 9 ensembles de métriques, y compris l'ensemble de métriques image qui est
non inclus par défaut.
De plus, le module Docker a besoin d'accéder au démon Docker. Par défaut, Docker
écoute sur le socket Unix unix:///var/run/[Link]. Nous pouvons utiliser ce socket
pour communiquer avec le démon depuis un conteneur. Grâce à ce point de
terminaison. Docker expose son API qui peut être utilisée pour obtenir un flux de tous
les événements et statistiques générés par Docker.
Le prochain champ de configuration important que nous devons mentionner
est period où j'ai laissé la valeur par défaut. Ce champ définit la fréquence à laquelle
Metricbeat accède à l'API Docker.
Attention
Maintenant, tout est prêt pour exécuter Metricbeat. Un dernier conseil est d'avoir votre
instance Metricbeat aussi proche que possible de Docker (de préférence sur le même
hôte) pour minimiser la latence du réseau.
Résultat :
Loaded dashboards
Introduction
Nous sommes maintenant confrontés à des entreprises avec des réseaux de plus en
plus complexes qui doivent être protégés. De nos jours, il est absolument nécessaire
de surveiller votre réseau, chaque organisation doit collecter toutes les informations
sur ses réseaux. Si vous ne surveillez pas votre réseau, comment pourrez-vous
détecter ce qui est un comportement normal ou une attaque ? Il existe des attaques
malveillantes évidentes, mais une détection plus précoce est cruciale dans tout
incident de cybersécurité. L'un des moyens les meilleurs et les plus pratiques de
détecter une activité anormale est la surveillance du réseau. Dans cet article, nous
allons voir comment est-il possible de surveiller votre réseau avec l'outil Packetbeat,
puis d'agréger toutes les informations dans la pile ELK.
Dans le chapitre précédent sur Metricbeat , nous avons décrit comment utiliser
Metricbeat pour envoyer des métriques systèmes dans la pile. Dans ce chapitre, nous
allons apprendre à utiliser Packetbeat qui fait partie de la famille d'expéditeurs Beats
les plus populaires.
Packetbeat est un outil de surveillance réseau développé par Elastic qui utilise la
bibliothèque libpcap, c'est un expéditeur et un analyseur de données open source pour
les paquets réseaux intégrés à la pile ELK (Elasticsearch, Logstash et Kibana) et
membre de la famille des expéditeurs Beats (Filebeat, Libbeat, Winlogbeat, etc...). Il
fournit des métriques de surveillance réseau en temps réel sur du protocole HTTP,
TLS, DNS et de nombreux autres protocoles réseaux.
Ainsi grâce à cet outil de surveillance de paquets de données avec la stack ELK, il
peut vous aider à détecter des niveaux inhabituels de trafic réseau et des
caractéristiques de paquets inhabituelles, à identifier les sources et les destinations
des paquets, à rechercher des chaînes de données spécifiques dans les paquets et à
créer un tableau de bord convivial avec des statistiques pertinentes prêtes à l'emploi.
Ainsi cela peut contribuer à améliorer vos temps de réponse aux attaques
malveillantes.
Dans cet article, nous allons démontrer la plupart des avantages mentionnés ci-
dessus. Plus précisément, nous allons apprendre à utiliser Packetbeat pour
surveiller les transactions HTTP d'une application Web et d'analyser les données
en utilisant la stack ELK.
Installation et configuration de
Packetbeat
Préparation de l'application web
Ensuite, je vais supposer que vous disposez déjà d'un environnement Docker
fonctionnel sur votre système, si ce n'est pas le cas merci de suivre mon article sur
l'installation de docker.
Une fois cette étape réalisée, placez-vous alors à la racine du projet et buildez ensuite
votre image avec la commande suivante :
docker-compose up -dCopier
On s'assure ensuite que nos conteneurs s'exécutent correctement sur les bons ports:
docker psCopier
Résultat :
Ici nous avons un conteneur contenant un serveur web nommé "myapp_c" écoutant
sur le port 80 et un autre conteneur mysql écoutant sur le port 3306.
Si tout c'est bien passé, alors visitez la page suivante [Link] et vous
obtiendrez le résultat suivant :
Installation de Packetbeat
Pour les machines appartenant à la famille debian, vous devrez peut-être installer le
paquet apt-transport-https avant de continuer:
L'étape suivante consiste à ajouter le dépôt Elastic sur votre système (étape non
obligatoire, si vous avez suivie le chapitre précédent) :
Sous la famille redhat, créez un fichier et nommez le par exemple [Link] dans le
répertoire /etc/[Link].d/, contenant:
[elastic-7.x]
gpgcheck=1
gpgkey=[Link]
enabled=1
autorefresh=1
type=rpm-mdCopier
Il ne vous reste plus qu'à mettre à jour vos référentiels et d'installer Packetbeat:
Si jamais vous rencontrez des problèmes d'initialisation, veuillez vérifier les logs du
service Packetbeat à l'aide de la commande suivante :
Configuration de Packetbeat
...
[Link]:
hosts: ["localhost:9200"]
...
[Link]:
host: "localhost:5601"
...
[Link]:
- type: icmp
enabled: false
- type: dns
ports: [53]
- type: http
ports: [80]
- type: mysql
ports: [3306]Copier
Résultat :
● [Link] - Elasticsearch
● [Link] - Kibana
Ensuite lancez la sous-commande setup pour charger les tableaux de bord dans
Kibana (la commande peut prendre un peu de temps pour se terminer):
Résultat :
Loaded dashboards
Une fois les données chargées, tout pour Metricbeat pour découvrir vos logs, rendez-
vous dans [Link] et sur le menu à gauche cliquez sur Discover:
Choisissez ensuite le pattern index packetbeat-* pour visualiser les logs de
Packetbeat:
L'étape suivante est de visualiser notre tableau de bord afin de visualiser la collection
de visualisations en temps réel issue par notre expéditeur Packetbeat. Pour ce faire,
sur le menu à gauche cliquez sur Dashboard:
Recherchez et cliquez sur les Dashboards de Packetbeat:
Vous obtenez ainsi plusieurs dashboards. Le premier type nommé "HTTP
Transactions" ressemble à l'image ci-dessous et vous donne le taux de code de
réponse et requête HTTP:
Dans le second nommé "Network Flows", vous avez des informations sur le flux de
réseau avec le nombre de connexions dans le temps et les hôtes créant/recevant du
trafic incluant également leur consommation réseaux:
Dans le troisième nommé "DNS Overview", vous avez un résumé sur les requêtes
DNS avec le temps de réponse moyen, le type de question de votre serveur DNS,
histogramme du temps de réponse DNS, etc... :
Dans le quatrième nommé "Databases: MySQL", vous avez le nombre du type de
requête SQL utilisé (SELECT, INSERT, etc ...), le débit de votre serveur MySQL,
etc... :
Vous avez également d'autres tableaux de bord prêt à l'emploi que vous pouvez
visualiser par vous-même.
Conclusion
Maintenant que les métriques réseaux de votre application sont centralisées grâce à
Packetbeat, et que vous êtes en mesure de les visualiser avec Kibana, vous devriez
pouvoir voir ce que font vos serveurs en un coup d'œil.
Introduction
Elasticsearch (parfois surnommé "ES") est le cœur central de la plate-forme d'analyse
de logs la plus populaire à l'heure actuelle à savoir la pile ELK (Elasticsearch,
Logstash et Kibana). Dans ce chapitre dédié à Elasticsearch, je vais vous fournir à
vous nouveaux utilisateurs les connaissances et les outils nécessaires pour
commencer à utiliser Elasticsearch.
Qu'est-ce qu'Elasticsearch ?
En effet, au fil des ans, Elasticsearch a été utilisé pour un nombre croissant de cas
d'utilisation, allant de la simple recherche sur un site Web jusqu'à la collecte et
l'analyse de données, d'analyses décisionnelles etc ...
Il a été initialement publié en 2010, c'est un outil d'analyse de données moderne basé
sur le projet Apache Lucene. Entièrement open source et construit avec Java, il fait
partie de la famille des bases de données NoSQL. Cela signifie qu'il stocke les
données de manière non structurées et que vous ne pouvez pas utiliser des requêtes
purement SQL pour les interroger.
L'intérêt de ce type de base de données et notamment celui d'Elasticsearch et qu'il
vous permet de stocker, rechercher et analyser d'énormes volumes de données
rapidement et en temps quasi réel et de vous retourner des réponses en quelques
millisecondes.
Ainsi, Elasticsearch est capable d'obtenir des réponses de recherche rapides car au
lieu de rechercher le texte directement, il recherche un index. Il utilise une structure
basée sur des Documents (nous verrons un plus loin ci-dessous la définition d'un
Document) au lieu de tables et de schémas et est livré avec des API REST étendues
pour stocker et rechercher les données. À la base, vous pouvez considérer
Elasticsearch comme un serveur capable de traiter des requêtes JSON et de vous
restituer les données sous le format JSON.
Dans le cadre de l'analyse des données, Elasticsearch est utilisé avec les autres
composants de la pile ELK (Logstash et Kibana) et joue le rôle d'indexation et de
stockage des données.
Information
Les Clusters
Nous retrouverons tout d'abord le cluster, qui est un ensemble d'un ou plusieurs
nœuds Elasticsearch (serveurs). Il peut comprendre autant de nœuds que vous le
souhaitez, ce qui le rend extrêmement évolutif.
La collection de nœuds contient toutes les données du cluster, et le cluster fournit une
capacité d'indexation et de recherche sur tous les nœuds. En pratique, cela signifie
que lorsque vous effectuez des recherches, vous n'avez pas à vous soucier d'un
nœud en particulier sur lequel la donnée sera stockée.
Un node représente un serveur unique qui stocke des données consultables et fait
partie d'un cluster. Les nœuds participent aux capacités d'indexation et de recherche
d'un cluster, ce qui signifie que lorsque des opérations sont effectuées sur le cluster,
les nœuds collaborent pour répondre aux demandes.
Tous les nœuds sont capables par défaut d'être à la fois des Master nodes, Data
nodes, Client nodes, Tribe nodes, Ingestion nodes ou Machine Learning Nodes (c'est
le cas pour un cluster à un seul nœud). Cependant Il est recommandé de distinguer
chaque nœud par un seul type, d'autant plus que les clusters grossissent.
Les fields sont la plus petite unité de données individuelle dans Elasticsearch. Chaque
field a un type de données défini et contient une seule donnée. Ces types de données
incluent les types de données les plus communs (strings, numbers, dates, booleans),
des types de données plus complexes (object and nested), des types de données
géographiques (get_point et geo_shape) et les types de données spécialisés
(token_count, join, rank_features, dense_vector, etc ..).
Il existe vraiment différentes variétés types de fields et de façons de les gérer, que
vous pouvez retrouver sur cette page.
Les Documents
Les Documents sont des objets JSON qui sont stockés dans un index Elasticsearch et
sont considérés comme l'unité de base de stockage. Dans le monde des bases de
données relationnelles, les Documents peuvent être comparés à une ligne dans une
table.
Les données dans les Documents sont définies avec des fields composés de clés et
de valeurs. Une clé est le nom du field et une valeur peut être un élément de plusieurs
types différents, comme une chaîne de caractères, un nombre, un booléen, un autre
objet ou un tableau de valeurs.
Les Documents contiennent également des champs réservés qui constituent les
métadonnées du Document tels que :
Les Documents sont donc l'unité d'information de base qui peut être indexée dans
Elasticsearch et ils sont exprimés sous le format JSON. Chaque Document possède
donc un identifiant unique et des données composées de fields, qui décrit le type
d'entité dont il s'agit. Par exemple, un Document peut représenter un article
d'encyclopédie, exemple ci-dessous :
"_id" : "1",
"_source" : {
"created_at" : "2021-06-07T[Link].000Z",
"author" : "Hatim"
}Copier
Les Index
Les index, sont la plus grande unité de données dans Elasticsearch qui contiennent un
ou plusieurs Documents et peuvent être comparés à une base de données dans le
monde des bases de données relationnelles.
Poursuivant notre exemple sur les articles d'encyclopédie, vous pourriez avoir un index
nommé "articles" contenant toutes les données liées à vos articles représentés sous
forme de Documents qui contiennent des fields de type string sur le titre, le contenu et
l'auteur, et un autre index nommé "utilisateurs" avec toutes les données liées à vos
utilisateurs avec des Documents qui contiennent des fields de type string sur leur
email, nom d'utilisateur et mot de passe.
Vous pouvez avoir autant d'index définis dans Elasticsearch que vous le souhaitez.
Ceux-ci contiendront à leur tour des Documents propres à chaque index.
Dans un index se trouvent des types de Documents. Un type représente une catégorie
de Documents similaires. Un type se compose d'un nom et d'un Mapping, et où le
Mapping n'a pas besoin d'être explicitement défini. Vous pouvez penser à un type
équivalant à une table dans une base de données relationnelle telle que MySQL. Un
index peut avoir un ou plusieurs types, et chacun peut avoir son propre Mapping.
Attention
Différents types de documents étaient autorisés dans un seul index dans la version 6
d'Elasticsearch, mais cette fonctionnalité a été supprimée car cela a conduit à des
problèmes divers.
Un seul type de Document est autorisé par index dans la version 7. La fonctionnalité
devrait être complètement supprimée dans la version 8 d'Elasticsearch. Voici
l'explication des développeurs dans leur blog.
Les Mappings
Un type de Document a un Mapping similaire au schéma d'une table dans une base
de données relationnelle. Il décrit les champs qu'un Document d'un type donné peut
avoir avec leurs types de données, tels qu'une chaîne de caractères, entier, date, etc...
Ils ont également des informations sur la façon dont les fields doivent être indexés et
comment ils doivent être stockés par Lucene.
Ceci est utile si un index contient plus de données que le matériel d'un nœud ne peut
en stocker. Un exemple pourrait être qu'un index contienne 1 téraoctet de données,
mais que le nœud ait un disque dur de seulement 500 gigaoctets. Une shard peut
ensuite être créée et stockée sur un autre nœud disposant de suffisamment d'espace
pour cela.
Un shard est un index entièrement fonctionnel et indépendant et peut être stocké sur
n'importe quel nœud au sein d'un cluster. Le nombre de shards peut être spécifié lors
de la création d'un index, mais il est par défaut de 5.
Les shards permettent aussi une mise à l'échelle horizontale par volume de contenu,
c'est-à-dire par espace d'index. De plus, le sharding permet de distribuer et de
paralléliser les opérations entre les shards, ce qui augmente les performances d'un
cluster Elasticsearch.
Alors que les shards améliorent l'évolutivité du volume de contenu pour les index, les
Replicas garantissent une haute disponibilité. Une réplique est une copie d'un shard,
qui peut prendre le relais en cas de défaillance d'un shard ou d'un nœud.
Un Replica ne réside jamais sur le même nœud que la shard d'origine, ce qui signifie
que si le nœud donné échoue, le Replica sera disponible sur un autre nœud. Les
répliques permettent également de mettre à l'échelle le volume de recherche, car les
répliques peuvent gérer les requêtes de recherche.
Par défaut, Elasticsearch ajoute cinq shards principaux et une réplique pour chaque
index, ce qui signifie que, sauf configuration contraire, qu'il y aura une réplique pour
chaque shard principale, soit cinq au total.
D'autres concepts
Ce sont les principaux concepts que vous devez comprendre lorsque vous
commencez à utiliser Elasticsearch, mais il existe également d'autres composants et
termes sur Elasticsearch. Je ne peux pas tous les couvrir, je vous recommande donc
de vous référer à la page des terminologies Elasticsearch pour plus d'informations.
Utilisation d'Elasticsearch
Installation et configuration
Vous trouverez mon tutoriel sur l'installation d'Elasticsearch dans mon article.
À des fins de développement et de test, les paramètres par défaut suffiront, mais il est
recommandé de faire des recherches sur les paramètres que vous devez définir
manuellement avant de passer en production. Par défaut le fichier de configuration
d'Elasticsearch est le suivant: /etc/elasticsearch/[Link].
curl [Link]
Résultat :
"name" : "G7189-ThinkPad-T14-Gen-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "0Aik7GWhRLO06xKaseK7iw",
"version" : {
"number" : "7.13.3",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "5d21bea28db1e89ecc1f66311ebdec9dc3aa7d64",
"build_date" : "2021-07-02T[Link].804015202Z",
"build_snapshot" : false,
"lucene_version" : "8.8.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}Copier
Et exécutez une requête de type GET sur l'API Elasticsearch afin de récupérer des
informations sur le node :
Si jamais vous rencontrez des problèmes d'initialisation, vérifier vos logs
pour déboguer le processus d'exécution d'Elasticsearch :
Elasticsearch se comporte comme une API REST, vous pouvez donc utiliser méthode
de type POST ou PUT pour y ajouter des données. Vous utiliserez la méthode PUT,
lorsque vous connaissez déjà l'id de l'élément de données que vous souhaitez
spécifier, ou la méthode POST si vous souhaitez qu'Elasticsearch génère pour vous
un id automatiquement pour l'élément de données.
Dans notre exemple, nous allons établir un système d'articles d'encyclopédie. Nous
allons donc créer un index qu'on nommera "articles" qui contiendra un Document avec
des fields de type string sur le nom de l’auteur, le titre, la catégorie et le contenu de
l'article ainsi que la date de publication qui sera de type date. Nous obtiendrons ainsi la
requête suivante:
"created_at": "2021-06-07T[Link].000Z",
"category": "elasticsearch",
"author": "Hatim"
'Copier
Résultat :
{
"_index" : "articles",
"_type" : "_doc",
"_id" : "0YZ7uXoBzgM1NBNTNXt1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}Copier
Comme vu sur le résultat, l'id est généré automatiquement pour nous. Pour le faire
depuis la méthode PUT il suffit juste d'ajouter l'id à votre entrée:
"created_at": "2021-05-07T[Link].000Z",
"category": "elasticsearch",
"author": "Hatim"
'Copier
Résultat :
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}Copier
Information
{ "create": { } }
{ "create": { } }
'Copier
Résultat :
"took" : 10,
"errors" : false,
"items" : [
{
"create" : {
"_index" : "articles",
"_type" : "_doc",
"_id" : "zoZ5uXoBzgM1NBNTantg",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1,
"status" : 201
},
"create" : {
"_index" : "articles",
"_type" : "_doc",
"_id" : "z4Z5uXoBzgM1NBNTantg",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1,
"status" : 201
}Copier
Pour voir la liste complète de vos index Elasticsearch, utilisez la requête suivante :
curl -X GET 'localhost:9200/_cat/indices?pretty'Copier
Résultat :
Une fois que vous avez indexé vos données dans Elasticsearch, vous pouvez
commencer à les récupérer et à les analyser. Encore une fois, via l'API REST
Elasticsearch, nous utilisons la méthode GET.
Pour afficher tous les Documents d'un index dans Elasticsearch nous utiliserons la
requête GET avec comme point de terminaison le mot _search :
Résultat :
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"created_at" : "2021-05-07T[Link].000Z",
"category" : "elasticsearch",
"author" : "Hatim"
},
"_index" : "articles",
"_type" : "_doc",
"_id" : "zoZ5uXoBzgM1NBNTantg",
"_score" : 1.0,
"_source" : {
"created_at" : "2021-08-07T[Link].000Z",
"category" : "ELK",
"author" : "Hatim"
},
"_index" : "articles",
"_type" : "_doc",
"_id" : "z4Z5uXoBzgM1NBNTantg",
"_score" : 1.0,
"_source" : {
"created_at" : "2021-03-07T[Link].000Z",
},
"_index" : "articles",
"_type" : "_doc",
"_id" : "0YZ7uXoBzgM1NBNTNXt1",
"_score" : 1.0,
"_source" : {
"created_at" : "2021-06-07T[Link].000Z",
"category" : "elasticsearch",
"author" : "Hatim"
}
}Copier
Résultat :
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"created_at" : "2021-05-07T[Link].000Z",
"category" : "elasticsearch",
"author" : "Hatim"
}Copier
Résultat :
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"author" : "Hatim",
}Copier
Résultat :
"author" : "Hatim",
}Copier
Nous utiliserons également GET pour effectuer des recherches en appelant cette fois-
ci le paramètre _search comme point de terminaison. Pour le moment récupérant tous
nos Documents avec le filtre match_all, comme suit :
"query": {
"match_all": { }
}
'Copier
Résultat :
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
"_index" : "articles",
"_type" : "_doc",
"_id" : "y4ZSuXoBzgM1NBNTFHtr",
"_score" : 1.0,
"_source" : {
"category" : "ELK",
"author" : "Hatim"
},
"_index" : "articles",
"_type" : "_doc",
"_id" : "zIZSuXoBzgM1NBNTFHtr",
"_score" : 1.0,
"_source" : {
"category" : "ELK",
},
etc ...
}Copier
"query": {
"match_all": { }
}
'Copier
Résultat :
"hits" : {
"hits" : [
"_source" : {
"created_at" : "2021-05-07T[Link].000Z",
"category" : "elasticsearch",
"author" : "Hatim"
},
"_source" : {
"created_at" : "2021-08-07T[Link].000Z",
"title" : "mon article sur la stack ELK",
"category" : "ELK",
"author" : "Hatim"
},
etc ...
}Copier
Par défaut, la section hits de la réponse inclut jusqu'aux 10 premiers Documents qui
correspondent à la recherche. Pour augmenter le nombre de Documents de votre
recherche utilisez le paramètre size suivi du nombre de résultats que vous souhaitez
afficher :
"query": {
"match_all": { }
}
'Copier
Vous avez également la possibilité de trier vos résultats grâce au filtre sort. Dans notre
cas nous souhaitons afficher les articles les plus récents en triant nos résultats par
ordre décroissant depuis notre field created_at :
"query": {
"match_all": { }
},
'Copier
Résultat :
"hits" : {
"hits" : [
"_source" : {
"created_at" : "2021-08-07T[Link].000Z",
"category" : "ELK",
"author" : "Hatim"
},
"_source" : {
"created_at" : "2021-06-07T[Link].000Z",
"category" : "elasticsearch",
"author" : "Hatim"
},
"_source" : {
"created_at" : "2021-05-07T[Link].000Z",
"category" : "elasticsearch",
"author" : "Hatim"
},
"_source" : {
"created_at" : "2021-03-07T[Link].000Z",
"category" : "ELK",
}Copier
Pour récupérer les Documents contenant une valeur spécifique dans un field vous
utilisez le filtre match suivi du field et de la valeur à rechercher:
url -X GET "localhost:9200/articles/_doc/_search?
pretty&filter_path=[Link]._source" -H 'Content-Type:
application/json' -d'
"query": {
'Copier
Résultat :
"hits" : {
"hits" : [
"_source" : {
"created_at" : "2021-08-07T[Link].000Z",
"category" : "ELK",
"author" : "Hatim"
}
},
"_source" : {
"created_at" : "2021-03-07T[Link].000Z",
"category" : "ELK",
}Copier
Pour faire une recherche sur des fields spécifiques, vous utiliserez le filtre fields,
comme suit:
"query": {
"multi_match" : {
"query": "ELK",
'Copier
Résultat :
"hits" : {
"hits" : [
"_source" : {
"created_at" : "2021-08-07T[Link].000Z",
"category" : "ELK",
"author" : "Hatim"
}
},
"_source" : {
"created_at" : "2021-03-07T[Link].000Z",
"category" : "ELK",
}Copier
Nous avons également un autre type de requêtes qu'on surnomme "Range query". Ils
permettent d'effectuer une recherche sur une plage de données. Dans notre cas nous
souhaitons récupérer les articles créés à partir du 07/07/2021. Pour ce faire, nous
utiliserons le filtre range avec l'option gte:
"query": {
"range": {
"created_at": {
"gte": "2021-07-07"
},
"fields": [
"created_at"
],
"sort": [
"created_at": "desc"
'Copier
Résultat :
"hits" : {
"hits" : [
"_source" : {
"created_at" : "2021-08-07T[Link].000Z",
"category" : "ELK",
"author" : "Hatim"
}Copier
les autres options disponibles pour ce type de filtres sont les suivantes:
gt : supérieur à.
gte : supérieur ou égal à.
lt : moins de.
lte : inférieur ou égal à.
Nous avons également un autre type de requêtes qu'on surnomme "Bool query". Il
permettent de combiner plusieurs recherches sous forme de clause/conditions
(correspond au if dans un langage de programmation standard) dans une seule et
même requête.
Discutons d'abord de la structure générale de la requête Bool :
POST _search
"query": {
"bool": {
"must": [...],
"filter": [...],
"must_not": [...],
"should": [.. .]
Dans cet exemple nous souhaitons récupérer tous les articles créés par l'auteur
"Hatim" et qui ne sont pas de catégorie "elasticsearch" et créés à partir du 03/07/2021.
Nous aurons ainsi la requête suivante :
curl -X GET "localhost:9200/articles/_doc/_search?
pretty&filter_path=[Link]._source" -H 'Content-Type:
application/json' -d'
"query": {
"bool": {
"must": [
"match": {
"author": "Hatim"
},
"range": {
"created_at": {
"gte" : "2021-03-07"
],
"must_not": [
{
"match": {
"category": "elasticsearch"
'Copier
Résultat :
"hits" : {
"hits" : [
"_source" : {
"created_at" : "2021-08-07T[Link].000Z",
"author" : "Hatim"
},
"_source" : {
"created_at" : "2021-03-07T[Link].000Z",
"category" : "ELK",
}Copier
Pour ajouter un field à un Document déjà existant, utilisez la méthode POST avec le
paramètre _update. Dans notre exemple, nous allons ajouter un field nommé
"is_private" afin de mettre un de nos articles créé précédemment en privé:
"doc": {
"is_private": true
' Copier
Résultat :
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_version" : 6,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 8,
"_primary_term" : 1
}Copier
Résultat :
"created_at" : "2021-05-07T[Link].000Z",
"category" : "elasticsearch",
"author" : "Hatim",
"is_private" : true
}Copier
C'est bien le cas ! D'ailleurs vous pouvez utiliser la même requête pour modifier la
valeur d'un field. Dans cet exemple, nous allons passer notre article en mode public:
curl -X POST "localhost:9200/articles/_update/1?pretty" -H 'Content-
Type: application/json' -d'
"doc": {
"is_private": false
' Copier
Résultat :
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_version" : 7,
"result" : "noop",
"_shards" : {
"total" : 0,
"successful" : 0,
"failed" : 0
},
"_seq_no" : 9,
"_primary_term" : 1
}Copier
Résultat :
"created_at" : "2021-05-07T[Link].000Z",
"category" : "elasticsearch",
"author" : "Hatim",
"is_private" : false
}Copier
Pour supprimer un Document d'Elasticsearch, c'est aussi simple que de rentrer des
données dans Elasticsearch. La méthode HTTP à utiliser cette fois est sans surprise la
méthode DELETE avec l'id du Document à supprimer:
Résultat :
{
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_version" : 8,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 10,
"_primary_term" : 1
}Copier
Si on tente de refaire une recherche sur notre Document nous obtiendrons une erreur
"404 HTTP Not Found":
Copier
Erreur :
{
"error" : {
"root_cause" : [
"type" : "resource_not_found_exception",
],
"type" : "resource_not_found_exception",
},
"status" : 404
Pour supprimer un index, il suffit tout simplement d'utiliser une nouvelle fois la requête
DELETE avec comme point de terminaison le nom de l'index à supprimer:
Résultat :
"acknowledged" : true
}Copier
Vérifions si notre index a bien été supprimé en vérifiant la liste des index:
curl -X GET 'localhost:9200/_cat/indices?pretty'Copier
Résultat :
Dans cet article, nous avons tenté de répondre à cette question à travers la
compréhension de son fonctionnement et de son utilisation et nous n'avons qu'effleuré
la surface pour apprendre tout ce qu'il y a à ce sujet. Mais sur la base de ce que nous
avons couvert, nous pouvons résumer brièvement qu'Elasticsearch est à la base un
moteur de recherche, dont l'architecture et les composants sous-jacents le rendent
rapide et évolutif, au cœur d'un écosystème d'outils complémentaires qui ensemble
peuvent être utilisés pour de nombreux cas d'utilisation, notamment la recherche,
l'analyse, le traitement et le stockage des données.