【发布时间】:2018-11-15 19:32:31
【问题描述】:
我们有一个包含服务器指标的高度嵌套的 json 文档,该文档包含 > 1000 个字段,其中一些字段与我们完全无关,因此我想在 Elastic 中索引文档之前删除它们。 但是,我无法找到正确的过滤器来使用,因为我要删除的字段在文档中的多个不同对象中具有通用名称。
源文档看起来像这样(为简洁起见,缩小了大小)
[
{
"server": {
"is_master": true,
"name": "MYServer",
"id": 2111
},
"metrics": {
"Server": {
"time": {
"boundary": {},
"type": "TEXT",
"display_name": "Time",
"value": "2018-11-01 14:57:52"
}
},
"Mem_OldGen": {
"used": {
"boundary": {},
"display_name": "Used(mb)",
"value": 687
},
"committed": {
"boundary": {},
"display_name": "Committed(mb)",
"value": 7116
}
"cpu_count": {
"boundary": {},
"display_name": "Cores",
"value": 4
}
}
}
}
]
数据使用 http_poller 输入插件加载到 logstash 中,需要在发送到 Elastic 进行索引之前进行处理。 我正在尝试删除与我们跟踪分析无关的字段,这些字段包括不同指标中每个 json 对象的“display_name”和“boundary”字段。
我曾尝试使用 mutate 过滤器删除字段,但由于它们存在于许多不同的对象中,因此需要将许多编码路径添加到 logstash 配置中。 我还查看了 ruby 过滤器,它看起来很有希望,因为它可以查看事件,但我无法让它抓取整个 json 文档,或者更重要的是实际上删除了字段。
这是我正在尝试的测试
filter {
split{
field => "message"
}
ruby {
code => '
event.get("[metrics][Mem_OldGen][used]").to_hash.keys.each { |k|
logger.info("field is:", k)
if k.include?("display_name")
event.remove(k)
end
if k.include?("boundary")
event.remove(k)
end
}
'
}
}
它首先在消息级别拆分输入以为每个服务器创建一个事件,然后尝试从特定指标中删除字段。
非常感谢您的任何帮助。
【问题讨论】:
标签: json ruby logstash elastic-stack