2016-12-10 1 views
0

J'ai une configuration logstash qui utilise ce qui suit dans le bloc de sortie pour tenter d'atténuer les doublons.Logstash doc_as_upsert index croisé dans Elasticsearch pour éliminer les doublons

output { 
     if [type] == "usage" { 
       elasticsearch { 
         hosts => ["elastic4:9204"] 
         index => "usage-%{+YYYY-MM-dd-HH}" 
         document_id => "%{[@metadata][fingerprint]}" 
         action => "update" 
         doc_as_upsert => true 
       } 

     } 
} 

L'empreinte est calculée à partir d'un hachage SHA1 de deux champs uniques. Cela fonctionne lorsque logstash voit le même document dans le même index, mais comme la commande qui génère les données d'entrée n'a pas une vitesse fiable à laquelle différents documents apparaissent, logstash insère parfois des documents dupliqués dans une date différente. indice. Par exemple, la commande que logstash exécute pour obtenir l'entrée renvoie généralement les deux dernières heures de données. Cependant, étant donné que je ne peux pas dire définitivement quand un document apparaîtra/disparaîtra, j'accepte la commande toutes les quinze minutes.

Ceci est correct lorsque les doublons se produisent dans la même heure. Cependant, lorsque l'horodatage de l'heure ou du jour survole et que le document apparaît toujours, elastic/logstash pense qu'il s'agit d'un nouveau document.

Existe-t-il un moyen de faire croître l'index? Ce seraient tous le même type de doc, ils s'appliqueraient simplement à tous les index qui correspondent à "usage- *"

Répondre

1

Un nouvel index est un tout nouvel espace de clé et il n'y a aucun moyen de dire à ES de ne pas indexer deux documents avec le même ID dans deux indices différents. Cependant, vous pouvez empêcher cela en ajoutant un elasticsearch filter à votre pipeline qui rechercherait le document dans tous les index et s'il en trouve un, il pourrait laisser tomber l'événement.

Quelque chose comme cela ferait (noter que usages serait un alias couvrant tous les usage-* indices):

filter { 
    elasticsearch { 
     hosts => ["elastic4:9204"] 
     index => "usages" 
     query => "_id:%{[@metadata][fingerprint]}" 
     fields => {"_id" => "other_id"} 
    } 
    # if the document was found, drop this one 
    if [other_id] { 
     drop {} 
    } 
} 
+0

je remarquai que la charge sur le cluster a augmenté d'un peu après avoir mis cela en place. Mais jusqu'à présent, il semble fonctionner! – anthozep

+0

Oui, car pour chaque événement qui passe par Logstash, une requête est effectuée sur votre ES pour vérifier si l'événement existe déjà ou non. – Val

+0

Dans une tentative de réduire l'espace de recherche, j'ai ajouté un filtre de rubis pour obtenir la date d'hier. Je ne m'inquiète que des dupes qui pourraient apparaître lorsque le nom de l'index reviendra au lendemain. Cependant, il semble que dans le filtre elasticsearch, il ne développe pas les champs: 'elasticsearch { hosts => [" fmyelastic04.fm.intel.com:9204 "] index => 'surveillance-cama-usage- "% {[@ metadata] [hier]}" ' query => "_id:% {[métadonnées] [empreinte digitale]}" fields => {"_id" => "id_found"} } ' – anthozep