Logstash не удаляет вложенные поля из json

Привет. Возникла вопрос по работе logstash.
Хочу сохранить в ES ответ nginx. Ответ представляет из себя json.
Натравливаю на него json плагин и получаю структуру полей в ES.

json {
      source => "response_body"
      target => "response_fields"
      remove_field => [ "response_body" ]
    }

Из этой структуры хочется удалить некоторые ненужные вложенные поля, и тут возникает проблема. Они не хотят удаляться, ни через плагин json, ни через mutate.

json {
      source => "response_body"
      target => "response_fields"
      remove_field => [ "response_body","[response_fields][contents][agg_content_gid]" ]
    }

Что может быть не так?

А у вас этот объект json в каком поле находиться? Он не в message? Пытался воспроизвести вашу ситуацию. Не получается - у меня все работает, как ожидается

test.txt:

{"foo":"bar", "contents": {"agg_content_gid": "killme", "agg": "keep_me"}}

config/test.conf:

input {
  stdin {
    id => "my_plugin_id"
  }
}

filter {
  json {
    source => "message"
    target => "response_fields"
    remove_field => [ "message","[response_fields][contents][agg_content_gid]" ]
  }
}

output {
  stdout {
    codec => json
  }
}

Запускаю:

bin/logstash -f config/test.conf < test.txt

Результат:

{"response_fields":{"contents":{"agg":"keep_me"},"foo":"bar"},"@version":"1","host":"bee","@timestamp":"2021-06-07T18:18:32.646Z"}

response_body появляется в результате парсинга гроком. И существует как отдельное поле.

Все работает. Попробуйте сами

test.txt:

here:{"foo":"bar", "contents": {"agg_content_gid": "killme", "agg": "keep_me"}}

config:

input {
  stdin {
    id => "my_plugin_id"
  }
}

filter {
  grok {
   match => { "message" => "here:(?<response_body>.*)"}
   remove_field => "message"
  }
  json {
    source => "response_body"
    target => "response_fields"
    remove_field => [ "response_body","[response_fields][contents][agg_content_gid]" ]
  }
}

output {
  stdout {
    codec => json
  }
}

результат:

{"response_fields":{"contents":{"agg":"keep_me"},"foo":"bar"},"host":"bee","@timestamp":"2021-06-07T18:45:21.642Z","@version":"1"}

Увы, но нет. response_fields пишется в неизменном виде.

Не может же быть проблемы в том, что это поле многократно повторяется в структуре json-а?

test.txt:

here:{"foo":"bar", "contents": [{"agg_content_gid": "killme", "agg": "keep_me"}, {"agg_content_gid": "killmesoftly", "agg": "keep_me_please"}]}

test.conf:

input {
  stdin {
    id => "my_plugin_id"
  }
}

filter {
  grok {
   match => { "message" => "here:(?<response_body>.*)"}
   remove_field => "message"
  }
  json {
    source => "response_body"
    target => "response_fields"
    remove_field => [ "response_body" ]
  }
  ruby {
    code => '
        fields = event.get("response_fields")
        contents = fields["contents"]
        if contents
            newContents = []
            contents.each { |c|
                c.delete("agg_content_gid")
                newContents << c
            }
            fields["contents"] = newContents
            event.set("response_fields", fields)
        end
    '
  }
}

output {
  stdout {
    codec => json
  }
}

Спасибо, проверю. А все-таки почему json не отрабатывает?

Потому что путь задан не правильно. Правильный путь был бы

[ "response_body", "[response_fields][contents][0][agg_content_gid]" , "[response_fields][contents][1][agg_content_gid]", .... и т.д. ]

Ругается на "no implicit conversion of string to integer" но направление я понял. Спасибо.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.