5

Das Ziel ist Erstellen Sie einen Elasticsearch-Index mit nur den neuesten Dokumenten in Gruppen verwandter Dokumente, um den aktuellen Status einiger Überwachungszähler und Status zu verfolgen.Fügen Sie die Aggregationsergebnisse in einen Index ein

Ich habe eine einfache Elasticsearch Aggregationsanfrage gefertigt: Zugehörige Dokumente in Eimer

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

Es Gruppen und wählen Sie das neueste Dokument für jeden Eimer.

Hier sind die verschiedenen Ideen, die ich den Job zu erledigen musste:

  1. direkt die Aggregation Abfrage verwenden, um die Ergebnisse in den Index zu schieben, aber es scheint nicht möglich: Is it possible to put the results of an ElasticSearch aggregation back into the index?
  2. die verwenden LogstashElasticsearch input plugin zum Ausführen der Aggregation Abfrage und der Elasticsearch output plugin in den Index zu schieben, aber scheint wie das Eingabe-Plugin nur auf das hits Feld schaut und ist nicht in der Lage, Aggregation Ergebnisse zu behandeln: Aggregation Query possible input ES plugin!
  3. Verwenden Sie die Logstashhttp_poller plugin, um ein JSON-Dokument zu erhalten, aber es scheint nicht zu ermöglichen, einen Rumpf für die HTTP-Anfrage anzugeben!
  4. Verwenden Sie die Logstashexec plugin, um cURL Befehle auszuführen, um den JSON zu bekommen, aber das scheint ziemlich umständlich und mein letzter Ausweg.
  5. Verwenden Sie die NEST API, um eine Basisanwendung zu erstellen, die Abfragen durchführt, Ergebnisse extrahiert, sie bereinigt und die resultierenden Dokumente in den Zielindex einfügt, aber ich möchte vermeiden, ein neues zu pfändendes Werkzeug hinzuzufügen.

Gibt es eine ziemlich komplexe Möglichkeit, dies zu erreichen?

+2

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

+0

@AndreiStefan Danke aber AFAIK Watcher wird für diesen Anwendungsfall nicht helfen. Außerdem haben wir es (noch?) Nicht auf unserer Infrastruktur installiert. Für die Alarmierung verwenden wir ** ElastAlert **, das auch perfekt funktioniert. – Pragmateek

+1

Ich schlage Watcher nicht vor, zu alarmieren, aber in der Lage zu sein [die Indizes abzufragen] (https://www.elastic.co/guide/en/watcher/current/changing-inputs.html#loading-search-results) Führen Sie in regelmäßigen Abständen einige [grundlegende Transformation] (https://www.elastic.co/guide/en/watcher/current/using-transforms.html) zu den resultierenden Daten durch und können Sie [in Elasticsearch zurückverknüpfen ] (https://www.elastic.co/guide/en/watcher/current/actions.html#actions-index). –

Antwort

2

Bearbeiten Sie die Datei als logstash.conf folgen

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

Funktioniert es jetzt dank Logstash? Weil Logstash zur Zeit der Frage keine Aggregationen verarbeitet hat – Pragmateek

+0

yup es funktioniert Ich habe es gestern nur auf ELK versucht (5.1.1) –

+0

OK, ich vertraue dir, du bekommst meine +1. :) – Pragmateek

Verwandte Themen