j'ai suivie ton conseille j'ai ajouté une nouvelle variable "ComputerID" que j'ai mis sur "document_ID", mais j'ai toujours les doublon, la deuxieme entre est récupéré correctement a s'avoir elle met "ComputerID" sur "_id" mais la premier entre est crée avec un "_id" generic
concernant le statement je ne crois pas que je peux utiliser la dernière valeur vu que ma table contient un inventaire des machine, ce qui fait que mes entre son les même mais les valeur change dans quelque champs.
je te met ci-dessous mon fichier SQL
from SELECT DISTINCT
"SEM_CLIENT"."COMPUTER_NAME" "ComputerName"
, "SEM_COMPUTER"."COMPUTER_ID" "ComputerID"
, "SEM_AGENT"."AGENT_VERSION" "SEPVersion"
, "SEM_COMPUTER"."OPERATION_SYSTEM" "OperationSystem"
, "PATTERN"."VERSION" "AVRevision"
, dateadd(s,convert(bigint,"SEM_AGENT"."CREATION_TIME")/1000,'01-01-1970 00:00:00') CREATION_DTTM
, dateadd(s,convert(bigint,"SEM_AGENT"."LAST_UPDATE_TIME")/1000,'01-01-1970 00:00:00') "LastUpdateTime"
, dateadd(s, convert(bigint,LAST_SCAN_TIME)/1000, '01-01-1970 00:00:00')"LastScanTime"
, "SEM_CLIENT"."USER_NAME" "UserName"
, "IP_ADDR1_TEXT" "IPAddress"
, "IDENTITY_MAP"."NAME" "GroupName"
, "SEM_AGENT"."DELETED" "MarkedForDeletion"
FROM (((("SEM_AGENT" "SEM_AGENT" INNER JOIN "SEM_CLIENT" "SEM_CLIENT"
ON (("SEM_AGENT"."COMPUTER_ID"="SEM_CLIENT"."COMPUTER_ID")
AND ("SEM_AGENT"."DOMAIN_ID"="SEM_CLIENT"."DOMAIN_ID"))
AND ("SEM_AGENT"."GROUP_ID"="SEM_CLIENT"."GROUP_ID")) INNER JOIN "SEM_COMPUTER" "SEM_COMPUTER"
ON (("SEM_AGENT"."COMPUTER_ID"="SEM_COMPUTER"."COMPUTER_ID")
AND ("SEM_AGENT"."DOMAIN_ID"="SEM_COMPUTER"."DOMAIN_ID"))
AND ("SEM_AGENT"."DELETED"="SEM_COMPUTER"."DELETED")) INNER JOIN "PATTERN" "PATTERN"
ON "SEM_AGENT"."PATTERN_IDX"="PATTERN"."PATTERN_IDX") INNER JOIN "IDENTITY_MAP" "IDENTITY_MAP"
ON "SEM_CLIENT"."GROUP_ID"="IDENTITY_MAP"."ID") INNER JOIN "V_SEM_COMPUTER" "V_SEM_COMPUTER"
ON "SEM_COMPUTER"."COMPUTER_ID"="V_SEM_COMPUTER"."COMPUTER_ID"
AND "SEM_AGENT"."DELETED"=0
document_id devrait contenir la valeur de la variable passée... Peut-Être l'idée serait de mettre top 10 dans le SQL des deux input, et envoyer sur la console pour voir que la variable utilisée contient bien la valeur voulue... Aussi tester juste un des inputs pour commencer:
output {
stdout {
codec => rubydebug
}
}
Si LastUpdateTime ne peut pas être utiliser, alors il est normal que l'input lit plusieurs fois les memes enregistrements de la table donc logstash envoi les memes valeurs. Il faut donc debugger plus en details
De facon a ce que les enregistrements soient écrit, action "create" ne permettra pas une update - ce qui serait mieux pour les performances d'elasticsearch.
Tandis que index (valeur default pour option action) va mettre a jour les données
Attention si le volume des mises a jour est important ca aura un effet nocif sur la performance elasticsearch et il faudrait penser a essayer limiter le volume des updates.
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.