Logstash JSON удаление поля - PullRequest
       8

Logstash JSON удаление поля

0 голосов
/ 15 ноября 2018

У нас есть сильно вложенный 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
                }
            }
         }
      }
]

Данные загружаются в logstash с помощью входного плагина http_poller и должны быть обработаны перед отправкой в ​​Elastic для индексации.Я пытаюсь удалить поля, которые нам не нужны для отслеживания в аналитических целях, к ним относятся поля «display_name» и «border» из каждого объекта json в различных метриках.

Я пытался использоватьФильтр 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
            }
        '
  }

}

Сначала он разбивает входные данные на уровне сообщений, чтобы создать одно событие на сервер, а затем пытается удалить поля из определенной метрики.

Любая помощьВы будете очень признательны.

1 Ответ

0 голосов
/ 16 ноября 2018

Если я понял, вы хотите оставить только ключ значения.Итак, учитывая хэш ответа:

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}}}}
...