Замедление индексирования документов в связи с ошибками в Logstash

Добрый день! Имею связку filebeat -> kafka <- logstash -> elasticsearch

Появилась проблема связанная с изменением типа поля, что вызывало такую запись в логе Logstash и отбрасывание документа:

"status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse field [header.HTTP_CM_DEVICE_TIME] of type [date] in document with id 'AWSk_3IBRp2XS7BSwTDG'. Preview of field's value: '2020-06-29T1:34:45.661+03:00'"

Проблема эта известная, и она на нашей стороне. разработчики поменяли тип поля, теперь документ не индексируется и отбрасывается целиком. Чтобы этого не происходило, рекомендуется поставить для поля тип которого нельзя контролировать:

"ignore_malformed": true

Но вопрос в другом. Есть и нормальные документы с нормальным значением - которые не отбрасываются, а индексируются.

То есть проблемное поле есть только у примерно 50% документов.

Но ввиду того что прилетает много документов с указанной выше ошибкой - индексация нормальных и несбойных документов замедлилась на час и даже больше.

Очень интересно было бы узнать почему происходит такое замедление индексирования ввиду отбрасываемых по причине сбойного поля документов?

И второй вопрос: как это побороть? Стоит ли делать несколько машин с Logstash и ставить их всех в одинаковый group_id, подключая все к одному и тому же топику kafka и с output в один и тот же индекс elasticsearch? Есть ли в таком случае вероятность дупликации данных?

почему происходит такое замедление индексирования ввиду отбрасываемых по причине сбойного поля документов?

Неправильный формат обрабатывается с помощью механизма exception (исключений). И в java он был разработан.... для исключительных ситуаций. На создание exception требуется больше времении, чем на индексацию небольшого документа - поэтому и замедление.

И второй вопрос: как это побороть?

Добавить в logstash проверку на неправильное поле и удалить это поле перед посылкой записи в elasticsearch.

Игорь, спасибо за ответ!

Добавить в logstash проверку на неправильное поле и удалить это поле перед посылкой записи в elasticsearch.

дело в том что каждое поле не получится контролировать - разрабы могут добавлять их рандомно в любое время, менять их типы :slight_smile:

Поставить dynamic в strict, контролировать mapping и не пущать!

1 Like

Спасибо за ответы, Игорь! Прошу прощения за свою навязчивость - но уже если этого не избежать и всегда происходит внезапно (маппинг уже пишется постфактум, да и под многие поля вообще не пишется) - поможет ли три логстеша на трех разных нодах с одним group_id (будут забирать из одного топика кафки) которые будут писать в один индекс - ускорить индексирование нормальных документов, если рядом идет много отбрасываемых?

Вы всегда можете это избежать, поставив dynamic в false. Тогда внезапные новые поля просто не будут индексироваться.

Не знаю, надо смотреть на нагрузку. Я не уверен, что проблема в логстеше (или только в логстеше), и, даже если Вам удасться его правильно настроить, я не знаю, разрешите-ли вы эту проблему или просто переместите ее на elasticsearch. От ошибок нагрузка нарастает и там и там. Elasticsearch тратит время на формирование сообщения и logstash на его обработку. Кстати, вы dead_letter_queue на logstash случайно не включили?

DLQ мне кажется совершенно бесполезным механизмом и я всегда его избегаю :slight_smile:

Стоит включить?

Нет. Но если бы он был влючен, стоило-бы выключить.