@ZenikaLille / @EmmanuelDemey

Beats

  • Agents permettant de récolter de l'information 
    • FileBeat
    • MetricBeat
    • PacketBeat
    • ...
  • Clients écrits en Go
  • L'information sera envoyée à un Logstash, ElasticSearch, ...
  • Configuration dans le fichier filebeat.yml

FileBeat

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/*.log


output.elasticsearch:
  hosts: ["192.168.1.42:9200"]
  • Possibilité de définir plusieurs prospectors
  • Traitement du document avant envoie
  • Plusieurs Output disponibles
    • ElasticSearch, Kafka, Console, Logstash, Redis, File

FileBeat

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/*.log

- input_type: log
  paths:
    - "/var/log/apache2/*"
  fields:
    apache: true

output.elasticsearch:
  hosts: ["192.168.1.42:9200"]

Filebeat

./filebeat -c config.yml

Logstash

  • ETL permettant de : 
    • Récupérer de la données (input)
    • Traiter la données (filter)
    • Envoyer la données (output)
  • Plusieurs connecteurs disponibles : ElasticSearch, Redis, Kafka, Beat, JDBC, ...
  • Rentre en concurrence avec la fonctionnalité IngestNode d'ElasticSearch

Logstash - input

input {
    file {
        path => "/var/*.log"
    }

    elasticsearch {
        hosts => "localhost"
        query => '{ "query": { ... }'
    }
}
  • Définition de l'origine des données
  • Possibilité d'avoir plusieurs input dans la même instance
  • Plusieurs input disponibles : Beat, ElasticSearch , Http, File, Redis, Logstash, ...

Logstash - filter

filter {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{DATA:syslog_program}..." }
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
    mutate {
        remove_field => ["syslog_timestamp", "message"]
    }
}
  • Pipeline de transformation du message lu
  • Possibilité de découper la données : grok
  • Suppression / Ajout / Modification des propriétés du message
  • Possibilité d'utiliser des conditions if

Logstash - output

output {
    stdout {
        
    }

    elasticsearch {
        hosts => ["localhost"]
    }
}
  • Destination des données traitées
  • Possibilité d'avoir plusieurs output dans la même instance
  • Plusieurs output disponibles : Beat, ElasticSearch , Http, File, Redis, Logstash, mail ...

Logstash

./bin/logstash -f config.conf

ElasticSearch

  • Solution pour créer un moteur de recherche
  • Se base sur le produit Lucene, avec en plus : 
    • Clustering
    • Agrégation
    • API REST
    • ...
  • Utilisable via une API REST 
    • Configuration du cluster
    • Indexation des documents
    • Recherches
  • Verbes : GET, POST, PUT, DELETE

  • Port : 9200 par défaut
  • Index, Type : multiples premier,second, _all, logstash-*
  • Action : _search, _mapping, _settings, _analyze, _source...
  • Body : document, requête, configuration
  • Optionnel : port, index, type, id, action, paramètres
POST http://host:port/index/type/id/_action?param=42
{ "clef": "valeur" }

ElasticSearch

ElasticSearch - Indexation

PUT /zenika-index/nightclazz/1
{
    "name": "Stack Elastic",
    "speaker": "Emmanuel DEMEY"
}

GET /zenika-index/nightclazz/1

DELETE /zenika-index/nightclazz/1
  • Un Document à un id, un type et est stocké dans un index
  • Utilisation des méthodes HTTP pour manipuler un document
    • POST / PUT pour le créer et modifier
    • GET pour récupérer
    • DELETE pour le supprimer

ElasticSearch - Recherche

POST /zenika-index/nighclazz/_search
{ "query":{
    "query_string":{
      "query":"batch"
    }
  }
}
  • Plusieurs types de recherches sont disponibles
    • Attention certaines d'entres elles sont réalisées sur des données qui ne sont pas analyzées
{ "hits": {
    "hits": [
      {
        "_index": "zenika-index", 
        "_type": "elasticsearch", 
        "_id": "1",
        "_score": 0.076713204,
        "_source": {"titre": "Spring Batch in Action"}
      }
    ], ...
  } ... }

Les Entrailles d'ElasticSearch

ElasticSearch - Mapping

PUT /zenika-index/_mapping/nightclazz
{ 
    "properties": {
        "name": {
          "type": "text",
          "fields": {
            "original":    {"type": "keyword"}
          }
        },
        "attendees":{ "type":"double" },
        "speaker": {
          "type":"text"
        }
}
  • Etape primordiale pour avoir un cluster ES performant
  • Nécessite une réindexation des données
  • Définir pour chaque propriété : 
    • le type
    • l'analyser à utiliser
    • désactivation de certaines fonctionnalités si pas nécessaire

ElasticSearch - Analyzers

  • S'applique uniquement aux champs de type string

    Tant va la cruche à l'eau qu'à la fin elle se brise

    → tant,va,cruch,eau,fin,bris

  • Découpage en mots (tokens)
  • Accents, casse, caractère spéciaux, html stripping
  • Mots de liaison (stopwords), synonymes, conjugaison / pluriel (stemming)
  • En général spécifique à une langue
  • Utilisé lors de l'indexation et de la recherche
  • Configuré à froid au niveau de l'index
  • Multi-fields : Un champ peut être analysé plusieurs fois, avec des analyseurs différents

ElasticSearch - Query

POST /zenika-index/nightclazz/_search
{
  "query": { "match": {"titre": "action"}},
  "sort": [{"titre": "asc"},"_score"],
  "from": 0, "size": 100,
  "aggs": {"stats_prix": {"stats": {"field": "prix"}}},
  "highlight": {"fields": {"titre": {}}}
}

ElasticSearch - Avec Analyze

POST /zenika-index/nightclazz/_search
{ "query": {
      "match_all": {}}}


POST /zenika-index/nightclazz/_search
{ "query": {
      "match": {
        "titre": "spring" }}}

POST /zenika-index/nightclazz/_search
{ "query": {
      "query_string": {
        "query": "spring AND batch" }}}

ElasticSearch - Sans Analyze

POST /zenika-index/nightclazz/_search
{ "query": {
      "term": {
        "editeur.code": "manning" }}}

POST /zenika-index/nightclazz/_search
{ "query": {
  "range": {
    "prix": {
      "gt": 10,
      "lte": 30 }}}}

ElasticSearch - bool

POST /zenika-index/nightclazz/_search
{ 
    "query": {
      "bool": {
        "must": [
          { "match": { "titre": "spring" }},
          { "match": { "auteurs": "cogoluegnes" }}
        ],
        "should": [
          { "match": { "editeur": "manning" }}
        ]
       }
    }
}

ElasticSearch - Agrégation

  • Quels usages ?
    • Affiner une liste de résultats
      • Afficher des options de filtrage
      • Grouper les résultats par type / onglet
    • Analyser les résultats
      • Présenter les résultats sous forme de diagrammes
  • S'applique sur les documents retournés par la query
    • Hors pagination, projection...
  • Autrefois appelées facettes

ElasticSearch - Agrégation

POST /zenika-index/nightclazz/_search
{ 
    "query": { 
        "match": {"titre": "action"}
    },
    "aggs": {
        "titre_terms": {
          "terms": {
            "field": "titre",
            "size": 5 }},

        "prix_histo": {
          "histogram": {
            "field": "prix",
            "interval": 2 }},
    
        "prix_avg": {
          "avg": {
            "field": "prix" }}}}
>>>Response: POST /zenika-index/nightclazz/_search
{ ...
  "aggregations":{
    "titre_terms": {
      "buckets": [
        { "key": "action", "doc_count": 6 },
        { "key": "spring", "doc_count": 2 },
        { "key": "batch",  "doc_count": 1 },...]},
    "prix_histo": {
      "buckets": [
        { "key": 40, "doc_count": 2 },
        { "key": 42, "doc_count": 1 },
        { "key": 44, "doc_count": 0 }, ...]},
    "prix_avg": {
      "value": 44.74 }}}

ElasticSearch - Agrégation

  • Une agrégation de type bucketing
    • terms, histogram, date_histogram, range, filter...
    • peut contenir des sous-agrégations de type bucketing ou métriques
    • classifie les documents en groupes/sous-groupes appelés buckets (par prix, par terme, par jour...)
    • compte le nombre de document par bucket
  • Une agrégation de type metric
    • min, max, stats...
    • fait des statistiques sur les champs numériques, date...

ElasticSearch

./bin/elasticsearch

Kibana

  • Interface Web permettant des créer des dashboards
    • Résultat de recherches
    • Camembert
    • Stack Chart
    • Line Chart
    • Tag Cloud
    • Map
    • ...

Kibana

./bin/kibana

Watcher

  • Fonctionnalité disponible dans le plugin x-pack
     
  • Être alerter dès qu'une condition est respecté
     
  • Règle définie via un document indexé dans ElasticSearch
     
  • Nécessité d'installer le plugin x-pack

Watcher

PUT _xpack/watcher/watch/log_errors
{
  "trigger" : { 
    "schedule" : {
      "interval" : "5m"
    }
  },
  "input" : { 
    "search" : {
      "request" : {
        "indices" : "log-events",
        "body" : {
          "size" : 0,
          "query" : { "match" : { "status" : "error" } }
        }
      }
    }
  },
  "condition" : { 
    "compare" : { "ctx.payload.hits.total" : { "gt" : 5 }}
  },
  "actions" : { 
    "my_webhook" : {
      "webhook" : {
        "method" : "POST",
        "host" : "mylisteninghost",
        "port" : 9200,
        "path" : "/monitoring",
        "body" : "Encountered {{ctx.payload.hits.total}} errors"
      }
    }
  }
}

NightClazz Elastic

By Emmanuel Demey

NightClazz Elastic

  • 2,211