BigData LogManager для 1С

Стабильней - да.
Удобней - да.

Beats я озвучивал в момент мониторинга и Elastic Search.

Есть там интересная веселуха с forecasting - прогнозный мониторинг который.

Единственная проблема - что необходимо писать плагин на GoLang. То есть свой “Битс”

Попробовал winLogBeat. Это просто праздник какойто: занимает 20кб озу, требует только powerShell для установки, в комплекте визуализация для kibana.

Посмотрев на платформу Beats, заметил такую штуку: они дробят индексы в ES по дням. В этом имеется какой-то смысл с точки зрения производительности\удобства использования?

Считается что так удобней потом строить прогнозирование - то есть подсчитать forecasting.

@Bronislav приветствую. Пытаюсь поднять ELK, но плагин logstash-input-sqlite валится с ошибкой:

➜  bin git:(master) logstash -e "input { sqlite { path => '/Users/ak/Documents/vanessa/БД/1Cv8Log/1Cv8.lgd' } } output { elasticsearch { hosts => '10.211.55.11:9200' } }"

Settings: Default pipeline workers: 4
The error reported is:
  Java::JavaSql::SQLException: [SQLITE_NOTADB]  File opened that is not a database file (file is encrypted or is not a database)

Не подскажете куда копать?

Оказалось, ошибка была именно в файле. Пересоздал файл, получил другую ошибку.

Attempted to send a bulk request to Elasticsearch configured at '["http://10.211.55.11:9200/"]', but an error occurred and it failed! Are you sure you can reach elasticsearch from this machine using the configuration provided? {:client_config=>{:hosts=>["http://10.211.55.11:9200/"], :ssl=>nil, :transport_options=>{:socket_timeout=>0, :request_timeout=>0, :proxy=>nil, :ssl=>{}}, :transport_class=>Elasticsearch::Transport::Transport::HTTP::Manticore, :logger=>nil, :tracer=>nil, :reload_connections=>false, :retry_on_failure=>false, :reload_on_failure=>false, :randomize_hosts=>false}, :error_message=>"Cannot serialize instance of: Sequel::JDBC::Database", :error_class=>"JrJackson::ParseError", :backtrace=>["com/jrjackson/JrJacksonBase.java:78:in `generate'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/jrjackson-0.3.8/lib/jrjackson/jrjackson.rb:59:in `dump'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/multi_json-1.11.2/lib/multi_json/adapters/jr_jackson.rb:20:in `dump'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/multi_json-1.11.2/lib/multi_json/adapter.rb:25:in `dump'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/multi_json-1.11.2/lib/multi_json.rb:136:in `dump'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/elasticsearch-api-1.0.15/lib/elasticsearch/api/utils.rb:102:in `__bulkify'", "org/jruby/RubyArray.java:2414:in `map'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/elasticsearch-api-1.0.15/lib/elasticsearch/api/utils.rb:102:in `__bulkify'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/elasticsearch-api-1.0.15/lib/elasticsearch/api/actions/bulk.rb:82:in `bulk'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/http_client.rb:53:in `non_threadsafe_bulk'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/http_client.rb:38:in `bulk'", "org/jruby/ext/thread/Mutex.java:149:in `synchronize'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/http_client.rb:38:in `bulk'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:162:in `safe_bulk'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:101:in `submit'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:86:in `retrying_submit'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:29:in `multi_receive'", "org/jruby/RubyArray.java:1653:in `each_slice'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:28:in `multi_receive'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/output_delegator.rb:119:in `worker_multi_receive'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/output_delegator.rb:65:in `multi_receive'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/pipeline.rb:290:in `output_batch'", "org/jruby/RubyHash.java:1342:in `each'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/pipeline.rb:290:in `output_batch'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/pipeline.rb:221:in `worker_loop'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/pipeline.rb:190:in `start_workers'"], :level=>:error}
Cannot serialize instance of: Sequel::JDBC::Database {:class=>"JrJackson::ParseError", :backtrace=>["com/jrjackson/JrJacksonBase.java:78:in `generate'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/jrjackson-0.3.8/lib/jrjackson/jrjackson.rb:59:in `dump'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/multi_json-1.11.2/lib/multi_json/adapters/jr_jackson.rb:20:in `dump'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/multi_json-1.11.2/lib/multi_json/adapter.rb:25:in `dump'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/multi_json-1.11.2/lib/multi_json.rb:136:in `dump'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/elasticsearch-api-1.0.15/lib/elasticsearch/api/utils.rb:102:in `__bulkify'", "org/jruby/RubyArray.java:2414:in `map'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/elasticsearch-api-1.0.15/lib/elasticsearch/api/utils.rb:102:in `__bulkify'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/elasticsearch-api-1.0.15/lib/elasticsearch/api/actions/bulk.rb:82:in `bulk'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/http_client.rb:53:in `non_threadsafe_bulk'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/http_client.rb:38:in `bulk'", "org/jruby/ext/thread/Mutex.java:149:in `synchronize'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/http_client.rb:38:in `bulk'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:162:in `safe_bulk'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:101:in `submit'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:86:in `retrying_submit'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:29:in `multi_receive'", "org/jruby/RubyArray.java:1653:in `each_slice'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-2.5.1-java/lib/logstash/outputs/elasticsearch/common.rb:28:in `multi_receive'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/output_delegator.rb:119:in `worker_multi_receive'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/output_delegator.rb:65:in `multi_receive'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/pipeline.rb:290:in `output_batch'", "org/jruby/RubyHash.java:1342:in `each'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/pipeline.rb:290:in `output_batch'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/pipeline.rb:221:in `worker_loop'", "/usr/local/Cellar/logstash/2.2.2/libexec/vendor/bundle/jruby/1.9/gems/logstash-core-2.2.2-java/lib/logstash/pipeline.rb:190:in `start_workers'"], :level=>:warn}

При этом вывод в stdout работает вроде

inputs git:(master) ✗ logstash -e "input { sqliteonec { path => '/Users/ak/Documents/vanessa/БД/1Cv8Log/1Cv8.lgd' } } output { stdout { } }" --pluginpath /Users/ak/Documents/vanessa/logstash-input-sqlite/lib/
sqliteonec plugin is using the 'milestone' method to declare the version of the plugin this method is deprecated in favor of declaring the version inside the gemspec. {:level=>:warn}
sqliteonec plugin doesn't have a version. This plugin isn't well
 supported by the community and likely has no maintainer. {:level=>:warn}
Settings: Default pipeline workers: 4
Logstash startup completed
2016-03-20T12:31:43.117Z ak.local %{message}
2016-03-20T12:31:43.121Z ak.local %{message}
2016-03-20T12:32:08.347Z ak.local %{message}
2016-03-20T12:32:08.349Z ak.local %{message}

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

Я увидел в указанном файле JRUBY @akunin - я знаю что multi_json штука собираемая из исходников. Поэтому очень похоже на ошибку именно в jruby пакете

Не получилось у меня подружиться с LogStash, написал свой “logstash” с покером и куртизанками. Скоро будет на githab.

Что реализовал:

  1. Проверка существования шаблона и создание шаблона под ЖР
  2. Хранение индексов по дням/месяцам/годам
  3. Автоочистку ЖР после успешной выгрузки.

Картинка для привлечения внимания:

Круто, не на .net хоть? под linux можно будет запустить?

@pumbaE, обычная обработка 1С для запуска из командной строки. Тестирую по OS X и Windows, предполагаю, что и под Linux будет работать, но пока не могу определенно сказать.

Ок, тогда думаю можно и на oscript будет портировать. Тогда как на github опубликуете, добавлю туда и очистку старых индексов, т.е. ежедневный индекс удалить, а добавить ежемесячный для старых данных, тогда не будет деградации производительности у эластика.

Репозиторий:

Оно все еще требует доработки, в текущем виде пригодно разве что - для ознакомления.
Важный момент, чтобы Kibana работала - ИспользованиеByteOrderMark.НеИспользовать

Приглашаю в issues для обсуждения :slight_smile:

1 Симпатия

Если кто тестил обработку - мог заметить - самым узким местом была отправка запросов к ES. У меня это было 20000 за 600 сек.
Я подумал, что это непозволительно долго и переписал это дело на _bulk API (https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html)

Теперь 70% времени тратится на строку:
СтрокаЗапрос = СтрокаЗапрос + "{ ""index"" : { ""_index"" : """ + ИмяИндекса + """, ""_type"" : """ + ИмяТипа + """ } }" + Символы.ПС;

Как думаете, есть способы оптимизации?

Говорят, ТекстовыйДокумент складывает строки намного быстрее. Из-за использования какого-то другого буфера.

Итак, что происходит при выполнении операции S=S+“Some Text”

Происходит т.н. ReAlloc (перевыделение памяти):
a) Выделяется область памяти размером = размер(S) + размер(“Some Text”)
b) В выделенную область копируется S
c) В выделенную область дописывается "Some Text"
d) Адрес дескриптора строки S устанавливается на новую область
e) Старая область памяти, использовавшаяся S освобождается

Спасибо большое! Текстовый документ действительно ощутимо быстрее.
Теперь новые вводные :slight_smile: 150_000 записей не пролазят одним запросом, почему то. Еще разбираюсь с этим.

Если там http запросы, может попробовать multipart через boundary?

Получил забавную ситуацию:
После загрузки в ES ~5_000_000 записей на виртуалке под docker-machine закончилось свободное место в результате индекс за 1 месяц оказался разрушен с полной потерей данных :slight_smile: при этом сервер продолжал принимать запросы и отвечал на запись новых с кодом 200, как ни в чем не бывало.

То что 150_000 не пролазило решил разделением на порции по 50_000

Короче говоря, О сколько нам открытий чудных готовит просвященья дух. (с)

Замер производительности (запущен не с самого начала)

Без тестов ? Без feature файлов ? Как так можно. Ну хоть бы заглушку создал для фич.

1 Симпатия