# Перемешиваются события между воркерами?

**URL:** <https://discuss.elastic.co/t/topic/104609>\
**Category:** Вопросы на русском языке\
**Created:** [October 19, 2017, 6:59pm UTC](https://discuss.elastic.co/t/topic/104609 "2017-10-19T18:59:13Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![11116](https://avatars.discourse-cdn.com/v4/letter/1/6bbea6/32.png) [@11116](https://discuss.elastic.co/u/11116)\
**Post date:** [October 19, 2017, 6:59pm UTC](https://discuss.elastic.co/t/topic/104609/1 "2017-10-19T18:59:13Z")

</div>

Здравствуйте!  
Заметил такую странную вещь.  
Логи ко мне прилетают, увы, в куче не очень совместимых форматов, например  
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](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

В какую сторону копать?  
Спасибо!

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 19, 2017, 8:48pm UTC](https://discuss.elastic.co/t/topic/104609/2 "2017-10-19T20:48:49Z")

</div>

Похоже на баг в logstash. В данный момент [тут](https://discuss.elastic.co/t/nomethoderror-undefined-method-to-hash-with-csv-input-in-logstash-5-6-2/103545) обссуждается. Где копать, пока не знаем.

---

<div class="post-metadata">

**Author:** ![11116](https://avatars.discourse-cdn.com/v4/letter/1/6bbea6/32.png) [@11116](https://discuss.elastic.co/u/11116)\
**Post date:** [October 23, 2017, 12:47pm UTC](https://discuss.elastic.co/t/topic/104609/3 "2017-10-23T12:47:52Z")

</div>

Вот еще пример:

[2017-10-23T15:42:35,067][WARN][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=\>400, :action=\>["index", {:\_id=\>nil, :\_index=\>"logstash-2017.10.23-12", :\_type=\>"logstash", :\_routing=\>nil}, 2017-10-23T12:39:14.526Z 10.1.18.6 1508762354.523|31.173.240.159|4.3|A593FC83-7880-EB41-4130-0E78E07DF7CA||BCA26ABF-A641-13D8-F64A-77495DE79FD7|2|5||F|||101945472|||||M|8046||ADVXL:0|ADVPT:180|ADCLS:0], :response=\>{"index"=\>{"\_index"=\>"logstash-2017.10.23-12", "\_type"=\>"logstash", "\_id"=\>"AV9JQYKjLlYouzjYEQju", "status"=\>400, "error"=\>{"type"=\>"mapper\_parsing\_exception", "reason"=\>"failed to parse [N]", "caused\_by"=\>{"type"=\>"number\_format\_exception", "reason"=\>"For input string: "BRWSR:Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1""}}}}}

То есть, он в параметр N положил что-то вообще из другого сообщения, в этой строке UserAgent отсутствует:worried:

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 23, 2017, 8:02pm UTC](https://discuss.elastic.co/t/topic/104609/4 "2017-10-23T20:02:44Z")

</div>

Поговорил со спецами по logstash. Похоже, что ошибка в debug и перемешивание событий между собой не связаны. Проблемы с перемешиванием скорее всего происходят от использования переменная экземпляра. Это ведь по сути ruby, и `@var` - это переменная экземпляра, который одновременно используется всеми воркерами. То есть все ваши воркеры пишут в одно и тоже время в одни и те же переменные. Самое простое решение - перейти на локальные переменные (отбросить `@`).

---

<div class="post-metadata">

**Author:** ![11116](https://avatars.discourse-cdn.com/v4/letter/1/6bbea6/32.png) [@11116](https://discuss.elastic.co/u/11116)\
**Post date:** [October 24, 2017, 11:26am UTC](https://discuss.elastic.co/t/topic/104609/5 "2017-10-24T11:26:10Z")

</div>

Да, похоже, дело было в этом. Спасибо большое! 🙂

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [November 21, 2017, 11:26am UTC](https://discuss.elastic.co/t/topic/104609/6 "2017-11-21T11:26:40Z")

</div>

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