5

L'obiettivo è di creare un indice Elasticsearch con solo i documenti più recenti in gruppi di documenti correlati per tenere traccia dello stato corrente di alcuni contatori e stati di monitoraggio.Inserire i risultati di aggregazione in un indice

Ho realizzato un semplice elasticsearch interrogazione aggregazione:

{ 
    "size": 0, 
    "aggs": { 
    "group_by_monitor": { 
     "terms": { 
     "field": "monitor_name" 
     }, 
     "aggs": { 
     "get_latest": { 
      "top_hits": { 
      "size": 1, 
      "sort": [ 
       { 
       "timestamp": { 
        "order": "desc" 
       } 
       } 
      ] 
      } 
     } 
     } 
    } 
    } 
} 

gruppi documenti connessi in segmenti e selezionare il documento più recente per ciascun segmento.

Ecco le diverse idee che avevo per ottenere il lavoro fatto:

  1. utilizzare direttamente la query di aggregazione per spingere i risultati nell'indice, ma non sembra possibile: Is it possible to put the results of an ElasticSearch aggregation back into the index?
  2. utilizzare il LogstashElasticsearch input plugin per eseguire la query di aggregazione e Elasticsearch output plugin da inserire nell'indice, ma sembra che il plug-in di input guardi solo il campo hits e non sia in grado di gestire i risultati di aggregazione: Aggregation Query possible input ES plugin!
  3. utilizzare lo Logstashhttp_poller plugin per ottenere un documento JSON, ma non sembra consentire di specificare un corpo per la richiesta HTTP!
  4. utilizzare il Logstashexec plugin per eseguire i comandi cURL per ottenere il JSON ma questo sembra piuttosto ingombrante e la mia ultima risorsa.
  5. utilizzare lo NEST API per creare un'applicazione di base che eseguirà il polling, estrarre i risultati, pulirli e iniettare i documenti risultanti nell'indice di destinazione, ma vorrei evitare di aggiungere un nuovo strumento da mantenere.

Esiste un modo ragionevolmente complesso per realizzare questo?

+2

[Watcher] (https://www.elastic.co/guide/en/watcher/current/index.html)? –

+0

@AndreiStefan Grazie, ma AFAIK Watcher non è d'aiuto per questo caso d'uso. Inoltre non ce l'abbiamo (ancora?) Installato sulla nostra infrastruttura. Per avvisarci usiamo ** ElastAlert ** che fa perfettamente il lavoro. – Pragmateek

+1

Non sto suggerendo Watcher per allertare, ma per essere in grado di [interrogare gli indici] (https://www.elastic.co/guide/en/watcher/current/changing-inputs.html#loading-search-results) a intervalli regolari, esegui alcune [trasformazione di base] (https://www.elastic.co/guide/en/watcher/current/using-transforms.html) sui dati risultanti e riesci a [indicizzare nuovamente in Elasticsearch ] (https://www.elastic.co/guide/en/watcher/current/actions.html#actions-index). –

risposta

2

Modificare il file logstash.conf come seguire

input { 
    elasticsearch { 
    hosts => "localhost" 
    index => "source_index_name" 
    type =>"index_type" 
    query => '{Query}' 
    size => 500 
    scroll => "5m" 
    docinfo => true 
    } 
} 

output { 
    elasticsearch { 
    index => "target_index_name" 
    document_id => "%{[@metadata][_id]}" 
    } 
} 
+0

Funziona ora grazie a una correzione di Logstash? Perché al momento della domanda Logstash non gestiva le aggregazioni – Pragmateek

+0

yup il suo funzionamento L'ho provato ieri solo su ELK (5.1.1) –

+0

OK, mi fido di te, ottieni il mio +1. :) – Pragmateek