【问题标题】:Logstash json field removalLogstash json 字段移除
【发布时间】: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


    【解决方案1】:

    如果我明白了,您只想保留 value 键。 因此,考虑响应哈希:

    response = {
            "server": {
                "is_master": true,
                "name": "MYServer",
                "id": 2111
            },
            "metrics": {
    ...
    

    你可以这样做:

    response[:metrics].transform_values { |hh| hh.transform_values { |h| h.delete_if { |k,v| k != :value } } }
    
    #=> {:server=>{:is_master=>true, :name=>"MYServer", :id=>2111}, :metrics=>{:Server=>{:time=>{:value=>"2018-11-01 14:57:52"}}, :Mem_OldGen=>{:used=>{:value=>687}, :committed=>{:value=>7116}, :cpu_count=>{:value=>4}}}}
    

    【讨论】:

    • 这看起来很有希望,但考虑到事件 API 的约束,我看不出它是如何在 logstash 管道中执行的
    猜你喜欢
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多