我正在使用Metricbeat将与网络相关的数据发送到logstash实例。然后,logstash实例会将这些数据放入ElasticSearch。我们已经设置了Kibana仪表板以可视化此数据。但是,我注意到有时Metricbeat多次发送相同的数据。
进行一些在线搜索后,我发现Metricbeat可以重新发送数据。如果Metricbeat第一次尝试无法成功发送数据,则可能发生这种情况。
一种避免重复数据的方法是使用“指纹”过滤器,如以下链接中所述: https://www.elastic.co/blog/logstash-lessons-handling-duplicates
因此,我设置了一个指纹过滤器。过滤器使用“ MURMUR3”算法为每个事件的文档查找唯一编号。但是,我注意到的是,有时通过Metricbeat重新发送事件数据时,数据中字段的顺序会稍有变化。因此,文档的指纹会更改,即使使用过滤器,logstash也会在ES中两次插入相同的数据。
以前有人遇到过这个问题吗?有关如何解决此问题的任何建议将受到高度赞赏。
这是我的logstash配置中的代码段:
fingerprint {
concatenate_all_fields => true
concatenate_sources => true
method => "MURMUR3"
key => "metricbeat de-duplication"
base64encode => true
target => "[@metadata][fingerprint]"
}
然后我将[@metadata] [指纹]插入我的Kafka输出中,如下所示:
mutate {
add_field => {
"_id" => "%{[@metadata][fingerprint]}"
}
}
output {
kafka {
codec => json
bootstrap_servers => "${KAFKA_BOOTSTRAP_SERVERS}"
topic_id => "${KAFKA_TOPIC_ID}"
acks => "1"
}
}
以下是重复事件文档的示例片段: 1.文件1:
{
....
"_id": "2512356320",
"_source": {
"@timestamp": "2018-08-15T16:47:54.585Z",
"system": {
"network": {
"name": "enp13s0f0",
"in": {
"dropped": 0,
"errors": 0,
"bytes": 0,
"packets": 0
},
"out": {
"dropped": 0,
"errors": 0,
"packets": 0, <!-- different -->
"bytes": 0 <!-- different -->
}
}
},
....
}
Document 2:
{
...
"_id": "321459497",
"_source": {
"@timestamp": "2018-08-15T16:47:54.585Z",
"system": {
"network": {
"name": "enp13s0f0",
"in": {
"dropped": 0,
"errors": 0,
"bytes": 0,
"packets": 0
},
"out": {
"dropped": 0,
"bytes": 0, <!-- different -->
"errors": 0,
"packets": 0
}
}
},
...
}
从上面的代码片段可以看出,在这些情况下,MURMUR3过滤器为“ _id”字段产生了不同的值。这些文件的唯一区别在不匹配行的末尾使用“突出显示。我通过对整个文件进行比较来确认这一点。
谢谢, 尼克希尔。