Watcher : vos index Elasticsearch vont vous réveiller!

test

Elasticsearch devient de plus en plus répandu notamment dans le développement d'applications  souhaitant proposer des moteurs de recherches performants avec une intelligence.

Elasticsearch propose des plugins, des gratuits d'autres soumis à des licences, certains permettent d'étendre l'API de base, d'autres d'adminitrer les index Elasticsearch et d'autres peuvent être vus comme des fonctionnalités à part entière comme Watcher qui permet de faire de l'alerting sur les index.

Installation

Il vous faut un Elasticsearch de déployer sur votre poste, si ce n'est pas le cas vous pouvez télécharger Elasticsearh sur le site d'Elastic, la société éditrice, ensuite c'est une archive à décompresser.

Il faut également que vous ayez un JDK en version 7 minimum avec la variable d'environnement JAVA_HOME définie sur votre JDK.

Ouvrir une fenêtre de commande dans le répertoire "bin" de votre installation Elasticsearch.

Pour installer Watcher vous allez avoir besoin d'installer 2 plugins, Watcher et Licence, car Watcher est soumis à une licence d'utilisation.

plugin install license
plugin install watcher

Afin de mieux voir l'évolution de nos index Elasticsearch on va installer un troisième plugin, Head,  qui offre une IHM de consultation des index

plugin install mobz/elasticsearch-head

Si vous souhaitez plus d'informations sur l'installation du plugin Watcher vous pouvez vous reporter sur la documentation d'installation.

Personnellement pour envoyer des requêtes vers Elasticsearch j'aime bien utiliser l'extension Chrome "Sense", mais vous pouvez tout à fait envoyer vos requêtes via curl.

C'est parti

Maintenant on démarre Elasticsearch, c'est très simple toujours dans le répertoire "bin" de votre installation Elasticsearch.

elasticsearh

Et dans un navigateur web il vous suffit de saisir l'adresse "http://localhost:9200/_plugin/head/", si vous n'avez aucun index dans votre cluster Elasticsearch vous devriez avoir un résultat similaire :

2016-11-09 17_42_30-elasticsearch-head

Première étape la création d'un index logs sur lequel on va vouloir faire nos alertes.

PUT logs
{
    "mappings": {
        "events" : {
            "_timestamp" : { "enabled" : true}
        }
    }
}

Ensuite on peut lui donner un peu de contenu, voici deux exemples de requêtes que vous pouvez répéter

//ajout de logs en 200
POST /logs/event
{
    "request" : "GET index.html",
    "status_code" : 200
}

//ajout d'une erreur 404 dans les logs
POST logs/event
{
    "timestamp" : "2016-11-18T13:05:07",
    "request" : "GET index.html",
    "status_code" : 404,
    "message" : "Error: File not found"
}

REMARQUE : attention à la valeur que vous mettrez dans "timestamp" elle servira aux conditions de déclenchement des alertes, vous serrez obligé de la mettre à jour quand vous voudrez tester le watcher, attention à la time zone également.

On peut faire une petite requête pour rechercher les erreurs dans nos logs

POST logs/_search
{
    "query": {
        "match": {
           "message": "error"
        }
    }
    , "sort": [
       {
          "timestamp": {
             "order": "desc"
          }
       }
    ]

Mon premier watcher

Si vous avez déjà eu à faire des requêtes sur Elasticsearch vous serez en terrain connu avec Watcher qui reprend le même principe mais avec des éléments qui lui sont propres dont les plus importants sont :

  • inputs : permet de déclarer d'où proviennent les données analysées par l'alerte, elles peuvent provenir :
    • d'une requête sur un index Elasticsearch, type "search"
    • d'une source statique , type "simple"
    • d'une réponse http, type "http"
    • d'un mix des trois précédents en définissant plusieurs inputs, type "chain"
  • triggers : planifie le déclenchement de l'alerte, à intervalle régulier, à différent  moment de la journée ou de la semaine, sous forme de cron...
  • conditions : conditions qui déterminent si l'alerte doit être exécutée ou pas
  • actions : si une alerte est déclenchée, les actions permettent de configurer comment l'alerte va être diffusée, les actions possibles sont :
    • email
    • requête http
    • écriture dans un fichier de logs
    • notification Hipchap
    • notification Slack
    • écriture dans un index Elasticsearch
    • événement dans PagerDuty

Voilà un exemple de watcher :

//creation d'un watcher avec action d'écriture dans les logs els
PUT _watcher/watch/log_error_watch
{
  "trigger" : { "schedule" : { "interval" : "10s" } },
  "input" : {
    "search" : {
      "request" : {
        "indices" : [ "logs" ],
        "body" : {
          "query" : {
            "match" : { "message": "error" }
          }
        }
      }
    }
  },
  "condition" : {
    "compare" : { "ctx.payload.hits.total" : { "gt" : 0 }}
  },
  "actions" : {
    "log_error" : {
      "logging" : {
        "text" : "Found {{ctx.payload.hits.total}} errors in the logs"
      }
    }
  }
}

On a bien nos quatre éléments, Trigger, Input, Condition et Action pour lesquels on a décrit :

  1. Trigger : ce déclenche toutes les 10 secondes
  2. Input : recherche dans l'index "logs" tous les documents contenant "error" dans le champ "message"
  3. Condition : il faut qu'il y ait au minium 1 document pour déclencher une action
  4. Actions : on écrit dans les logs le nombre de d'erreurs trouvées

Maintenant si vous regardez votre index via l'url http://localhost:9200/_plugin/head/ vous verrez que vous avez 3 nouveaux indexes

2016-11-18 13_36_18-elasticsearch-head

  • .watches qui est l'index dans lequel sont stockés vos watchers avec ses statuts d'exécution
  • .watch_history-*, qui stocke quotidiennement l'historique des résultats d'exécution des watchers, un nouvel index est créé quotidiennement
  • .trigerred_watches, pour le moment je n'ai pas trop vu à quoi il peut bien servir :p

Maintenant si vous regardez dans les logs d'Elasticsearch, si vous avez ajouté des messages d'erreurs dans votre index de "logs", vous avez un message comme ceci

Found 1 errors in the logs

qui trace toutes les 10 secondes.

Quelques tips

Ce qui est super sympa c'est que l'on peut très facilement mettre à jour un watcher.

PUT _watcher/watch/log_error_watch
{
  "trigger" : { "schedule" : { "interval" : "60s" } }
}
mettre à jour le temps de rafraîchissement d'un watcher

Pour le supprimer c'est très simple

DELETE _watcher/watch/log_error_watch

Vous avez également à disposition quelques fonctions utiles comme :

PUT _watcher/watch/log_error_watch/_deactivate
La désactivation d'un watcher
PUT _watcher/_stop
//arrêter le service watcher

Rassurez vous les commandes inverses existent aussi 😉

POST .watch_history*/_search
{
  "query" : {
    "match" : { "result.condition.met" : true }
  }
}
les alertes ayant déclenché une action

Un dernier watcher pour la route

Avant de se quitter je voulais vous montrer un exemple de wacther qui déclenche un envoi d'email avec une condition de déclenchement en fonction de la période à laquelle la log a été levé (d'où ma remarque un peu plus haut où je vous signifiais de bien mettre à jour le champ "timestamp" dans les documents que vous envoyez sur votre index "logs").

Afin d'activer l'envoi de mails, il faut modifier la configuration d'Elasticsearch, dans le fichier "elasticsearch.yml" pour lui fournir la configuration suivante, à adapter bien sûr :

watcher.actions.email.service.account:
  work:
    profile: wam
    email_defaults:
      from: test@mailcom
    smtp:
      auth: false
      starttls.enable: false
      host: 10.0.0.0
      port: 25

Et notre dernier watcher

PUT _watcher/watch/log_error_watch
{
  "trigger" : { "schedule" : { "interval" : "30s" } },
  "input" : {
    "search" : {
      "request" : {
        "indices" : [ "logs" ],
        "body" : {
           "query": {
              "bool": {
                 "must": [
                    {
                       "match": {
                          "message": "error"
                       }
                    }
                    ,{
                       "range": {
                          "timestamp": {
                             "gte": "now-1m",
                             "lte": "now"
                          }
                       }
                    }
                 ]
              }
           }
        }
      }
    }
  },
  "condition" : {
   "compare" : { "ctx.payload.hits.total" : { "gt" : 0 }}
  },
  "actions" : {
    "send_email" : {
      "email" : {
        "to" : "DBoujot.prestataire@voyages-sncf.com",
        "subject" : "Aie une erreur",
        "body" : "Va voir les logs de ton appli il y a quelque chose qui ne va pas! \n Il y {{ctx.payload.hits.total}} erreurs. "
      }
    }
  }
}

Et je vous laisse faire le test pour voir ce qui se passe dans votre boîte mails.

Conclusion

Watcher est un super plugin pour Elasticsearch très facile et rapide à prendre en main pour créer de l'alerting sur vos index Elasticsearch. Comme pour le reste des produits Elastic la documentation est complète et de bonne qualité, dommage qu'il ne soit pas gratuit 😉

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.