Здравствуйте!
Заметил такую странную вещь.
Логи ко мне прилетают, увы, в куче не очень совместимых форматов, например
1 вариант: param1|param2|field3:param3|field4:param4
2 вариант: param1|param2|4.3|param4|field5:param5|field6:param6
3 вариант: param1|param2|field7:param7|field8:param8
Сделал так :
//обрабатываю первые два поля, остаток складывается в поле fields
if [fields] =~ /^4|/{
//обрабатываются поля до param4, с разделителем |
}
//через kv обрабатываются остальные поля key:value
Так вот, на больших объемах (порядка 7-8 тысяч событий в секунду) периодически условие перестает работать - сообщения из первого или третьего варианта почему-то проваливаются в условие, в результате чего получается каша вида:
field1 = param1
field2 = param2
field3 = field3:param3
field4 = field4:param4
На что справедливо ругается elasticsearch - маппинг не сходится.
Ок, я взял кусок этой логики из конфига, скопировал ее в тестовый, вход с stdin, выход с stdout. Запустил, отправил эту строку - условие отработало правильно. Так же ошибка не появляется, если запускать логстэш с параметром -w 1
То есть, когда воркер один, условие срабатывает правильно.
Поля без имени с разделителем я разбираю своим простеньким плагином, если это важно:
https://pastebin.com/CXDHr7wZ
Аналогичные странности замечал, когда для своего плагина и kv задавал target и потом пытался смержить полученные поля - периодически они оказывались пустыми, хотя прогон через тест с stdin stdout проходил нормально.
- если запускаю с параметром debug, то выдается:
[FATAL] 2017-10-19 21:57:33.628 [LogStash::Runner] runner - An unexpected error occurred! {:error=>#<NoMethodError: undefined method to_hash' for []:Array>, :backtrace=>["(eval):18:in
filter_func'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:398:in filter_batch'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:379:in
worker_loop'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:342:in `start_workers'"]}
Версия логстэша 5.6.3, OS Centos 7.4.1708
В какую сторону копать?
Спасибо!