Une bonne façon d'optimiser l'utilisation d'un cluster Elasticsearch et de s'assurer que les requêtes de recherche sont le plus efficace possibles. En effet, des requêtes de recherche rapide utilisent les ressources du cluster pour un temps plus court ce qui réduit la pression sur le cluster Elasticsearch et offre une meilleure expérience aux utilisateurs.
Pour détecter les requêtes les plus lentes, Elasticsearch fournit une fonctionnalité appelée Slow logs. Cette fonctionnalité permet d'écrire dans les fichiers de logs les requêtes de recherche ou d'indexation dont le temps d'execution est supérieur à un seuil défini par l'administrateur du cluster Elasticsearch.
Récemment, un module Elasticsearch a été ajouté à Filebeat. Toujours en beta mais largement utilisable, ce module permet d'indexer facilement différents logs d'Elasticsearch, dont les slow logs, dans un cluster Elasticsearch.
Dans cet article, on veut capturer les slow logs d'un cluster Elasticsearch et les indexer dans un cluster de monitoring. Pour cela, j'utilise le module Filebeat pour indexer les slow logs dans le cluster de monitoring.
Pour le cluster de monitoring j'ai créé un cluster sur Elastic Cloud.
Activation des slow logs
Pour le cluster métier, j'ai déployé un cluster Elasticsearch de 3 noeuds sur une machine locale. La version d'Elasticsearch utilisée est la 6.5.1.
La configuration et l'activation des slow logs peut se faire dynamiquement et par index. Dans l'exemple suivant, je définis les seuils de tolérance pour les requêtes de recherche pour l'index sonested
et je choisis de logger toutes les requêtes qui dépassent le niveau trace
.
PUT sonested/_settings
{
"index.search.slowlog.threshold.query.warn": "5s",
"index.search.slowlog.threshold.query.info": "1s",
"index.search.slowlog.threshold.query.debug": "250ms",
"index.search.slowlog.threshold.query.trace": "100ms",
"index.search.slowlog.threshold.fetch.warn": "800ms",
"index.search.slowlog.threshold.fetch.info": "400ms",
"index.search.slowlog.threshold.fetch.debug": "100ms",
"index.search.slowlog.threshold.fetch.trace": "20ms",
"index.search.slowlog.level": "trace"
}
Même chose pour la partie indexation:
PUT sonested/_settings
{
"index.indexing.slowlog.threshold.index.warn": "5s",
"index.indexing.slowlog.threshold.index.info": "1s",
"index.indexing.slowlog.threshold.index.debug": "500ms",
"index.indexing.slowlog.threshold.index.trace": "100ms",
"index.indexing.slowlog.level": "trace",
"index.indexing.slowlog.source": "1000"
}
Configuration de Filebeat
Les 3 noeuds de mon cluster Elasticsearch s’exécutant sur ma machine locale, je n’ai besoin de déployer Filebeat que sur ma machine locale. Dans le cas d’un cluster Elasticsearch déployé sur plusieurs serveurs, Filebeat devra être déployés sur chacun des serveurs.
Tout d'abord, j'activate le module elasticsearch
livré avec Filebeat.
./filebeat module enable elasticsearch
Ensuite, je configure mon installation de Fileabeat, pour cela je modifie le fichier de configuration filebeat.yml
. Pour votre installation, adapter le var.paths
ainsi que l'emplacement d'Elasticsearch (dans mon cas j'envoie les données sur un Elastic Cloud).
###################### Filebeat Configuration #########################
filebeat.modules:
- module: elasticsearch
slowlog:
enabled: true
var.paths: ["/var/log/elasticsearch*_index_search_slowlog.log"]
#============================= Elastic Cloud ==================================
# These settings simplify using filebeat with the Elastic Cloud (https://cloud.elastic.co/).
cloud.id: "test:xxx"
cloud.auth: "elastic:xxx"
Ensuite on charge les configurations dans le cluster Elasticsearch, en executant la commande de setup
:
./filebeat setup
Si aucune erreur, on peut démarrer Filebeat:
./filebeat -e -c filebeat.yml -d "publish"
Peu après le démarrage de Filebeat, un nouvel index journalier préfixé filebeat-
devrait être créé sur le cluster de monitoring. Cet index contient les slow logs.
Comme on a chargé les configuration avec Filebeat, l’index pattern dans Kibana a été créé et pointe sur notre index journalier filebeat-
.
On peut voir le format d’un document contenant un slow log dans l’onglet Discover:
Le document contient de nombreuses informations intéressantes comme la requête elle-même (slowlog.source_query), le temps d'exécution (slowlog.took), le shard interrogé (shard.id), etc…
A partir de là, il est très facile de surveiller l'evolution des slow logs du cluster metier Elasticsearch en construisant un dashboard.
Note: Par défaut, la configuration log4j d’Elasticsearch tronque la requête de recherche a 10000 caractères, cela dans le but d'économiser de l’espace disque. Pour enlever cette limite, modifier le fichier de configuration log4j2.properties sur le cluster métier Elasticsearch:
appender.index_search_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%m%n
Note: Il existe un bug en cours de correction sur Filebeat qui empêche l'exécution du module elasticsearch sur Windows ou Mac. Si vous êtes sur un de ces systèmes d’operation, le bug peut être corrigé en modifiant le fichier <Filebeat_Path>/module/elasticsearch/manifest.yml
module_version: 1.0
var:
- name: paths
default:
- /var/log/elasticsearch/*.log
os.darwin:
- /usr/local/elasticsearch/*.log
os.windows:
- c:/ProgramData/Elastic/Elasticsearch/logs/*.log
ingest_pipeline: ingest/pipeline.json
prospector: config/log.yml