@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
- Affiner une liste de résultats
- 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