Dec 17th, 2018: [FR][Elastic Stack] Indexer facilement les slow logs d'Elasticsearch avec Filebeat

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