Анализ 1С: Предприятие 7.7 с помощью ELK стека





Рассмотрим систему на базе Elasticsearch, Logstash и Kibana (ELK Stack) для анализа логов 1С Предприятие 7.7 с целью визуализации и анализа событий 1С.
Не зная прошлого, невозможно понять подлинный смысл настоящего и цели будущего. / Максим Горький
Не знать истории-значит всегда быть ребёнком. / Цицерон

1С Предприятие 7.7 хранит системную информацию в файле SYSLOG1cv7.mlg в виде текста в формате csv, разделитель ";". Таблицы в виде текста сложно читать. Большой объем информации и событий удобнее анализировать визуально, что мы и попытаемся сделать.

Постановка задачи

  1. Видеть нагрузку на систему в реальном времени в виде графиков
    1. по времени выполнения отчетов, документов, обработок
    2. по времени выполнения процедур и функций
  2. Быстро фильтровать события
    1. по ошибкам [если они есть]
    2. по транзакциям или предупреждениям
  3. Система аналитики должна работать автономно, не использовать ресурсы рабочего сервера 1С.

пример

Что такое ELK Stack

  • Elasticsearch используется для хранения, анализа, поиска по логам.
  • Kibana представляет удобную и красивую web панель для работы с логами.
  • Logstash сервис для обработки логов и отправки их в Elasticsearch.
  • Beats — агенты для отправки логов в Logstash. Будем использовать Filebeat для отправки данных из текстовых логов linux, Winlogbeat для отправки логов из журналов Windows систем.
  • Также используем утилиту rsync — для копирования syslog1cv7.mlg c Windows на Ubuntu

Схематично работу системы изобразим так:

1. Подготовка

Скопируем логи 1с с Windows сервера на Ubuntu с помощью утилиты rsync, входящей в пакет cygwin.com На стороне сервера Ubuntu настраиваем сервис rsync

apt-get install rsync

Настраиваем параметры в /etc/rsyncd.conf

uid = user
gid = root
use chroot = yes
max connections = 50
pid file = /var/run/rsyncd.pid
log file = /var/log/rsync.log

[share]
path = /home/files/       # каталог логов
hosts allow = 192.168.0.1 # адрес сервера 1с
hosts deny = *
#list = true
read only = false
#auth users = s1
#secrets file = /etc/rsyncd.secrets

Создаем bat file на сервере 1с

set BACKUP_DIR=E:1ccomplexsyslog\r
cd /d %BACKUP_DIR%
C:cygwin64in
sync.exe -avz --inplace --append --chmod=u=rw --log-file=c:at
sync.log ./*.mlg s1@192.168.100.2::share/1c/

Обязательно указываем параметр — копировать только изменения для уменьшения трафика. И чтобы не перезаписывать весь файл, иначе в ELK данные будут дублироваться. запускаем

C:cygwin64in
sync.exe -avz --inplace --append --chmod=u=rw --log-file=c:at
sync.log ./*.mlg s1@192.168.100.2::share/1c/
sending incremental file list
1cv7.mlg

sent 298 bytes  received 35 bytes  666.00 bytes/sec
total size is 68,683,437  speedup is 206,256.57

Проверяем файл в каталоге назначения на сервере Ubuntu Добавляем задание в планировщик заданий с периодом 5 минут.

Установка Java на Ubuntu

Подключаем репозиторий с Java 8, обновляем список пакетов и устанавливаем Oracle Java 8.

add-apt-repository -y ppa:webupd8team/java
apt update
apt install oracle-java8-installer

Проверяем версию явы в консоли.

java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Установка Elasticsearch

Копируем себе публичный ключ репозитория:

# wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -

Если у вас нет пакета apt-transport-https, то надо установить:

# apt install apt-transport-https

Добавляем репозиторий Elasticsearch в систему:

# echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list

Устанавливаем Elasticsearch на Debian или Ubuntu:

apt update
apt-get install elasticsearch

После установки добавляем elasticsearch в автозагрузку и запускаем.

systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service

Проверяем, состояние сервиса:

systemctl status elasticsearch.service

Если сервис запущен, тогда переходим к настройке Elasticsearch.

Настройка Elasticsearch

Настройки Elasticsearch находятся в файле /etc/elasticsearch/elasticsearch.yml. На начальном этапе нас будут интересовать следующие параметры:

path.data: /var/lib/elasticsearch # директория для хранения данных
network.host: 127.0.0.1 # слушаем только локальный интерфейс

По-умолчанию Elasticsearch слушает все сетевые интерфейсы. Нам это не нужно, так как данные в него будет передавать logstash, который будет установлен локально. Обратите внимание на параметр path.data для директории с данными. Чаще всего индексы будут занимать значительное место. Если останется меньше 10% свободного места elasticsearch уходит в глухой read-only и вывести сервис из этого состояния – ещё та задача. Подумайте заранее, где вы будете хранить логи. Остальные настройки — дефолтные. После изменения настроек, перезапустите службу:

systemctl restart elasticsearch.service

Смотрим, что получилось:

netstat -tulnp | grep 9200
tcp6 0 0 127.0.0.1:9200 :::* LISTEN 14130/java

Elasticsearch работает на локальном интерфейсе — слушает ipv6, про ipv4 ни слова. Но его он тоже слушает, так что все в порядке. Переходим к установке kibana.

Установка Kibana

apt-get install kibana

Добавляем Кибана в автозагрузку и запускаем:

systemctl daemon-reload
systemctl enable kibana.service
systemctl start kibana.service

Проверяем состояние запущенного сервиса:

systemctl status kibana.service

По-умолчанию, Kibana слушает порт 5601. Только не спешите его проверять после запуска. Кибана стартует долго. Подождите минуту и проверяйте.

netstat -tulnp | grep 5601
tcp 0 0 127.0.0.1:5601 0.0.0.0:* LISTEN 27401/node

Настройка Kibana

Файл с настройками Кибана располагается по пути — /etc/kibana/kibana.yml. На начальном этапе можно вообще ничего не трогать и оставить все как есть. По-умолчанию kibana слушает только localhost и не позволяет подключаться удаленно. Это нормальная ситуация, если у вас будет на этом же сервере установлен nginx в качестве reverse proxy, который будет принимать подключения и проксировать их в кибана. Так и нужно делать в продакшене, когда системой будут пользоваться разные люди из разных мест. С помощью nginx можно будет разграничивать доступ, использовать сертификат, настраивать нормальное доменное имя и т.д. Если же у вас это тестовая установка, то можно обойтись без nginx. Для этого надо разрешить Кибана слушать внешний интерфейс и принимать подключения. Измените параметр server.host, Если хотите, чтобы она слушала все интерфейсы, укажите в качестве адреса, например вот так:

server.host: "0.0.0.0"

После этого Kibana надо перезапустить:

systemctl restart kibana.service

Теперь можно зайти в веб интерфейс по адресу http://ubuntu:5601. Kibana Kibana[/caption] В процессе настройки будем подключаться напрямую к Kibana.

Установка и настройка Logstash

apt-get install logstash

Добавляем logstash в автозагрузку:

systemctl enable logstash.service

Запускать пока не будем, надо его сначала настроить. Основной конфиг logstash лежит по адресу /etc/logstash/logstash.yml его трогать не будем настройки будем по смыслу разделять по разным конфигурационным файлам в директории /etc/logstash/conf.d. Создаем первый конфиг input.conf, который будет описывать прием информации с beats агентов.

input {
beats {
port => 5044
}
}

Тут все просто. Указываем, что принимаем информацию на 5044 порт. Этого достаточно. Если вы хотите использовать ssl сертификаты для передачи логов по защищенным соединениям, здесь добавляются параметры ssl. Будем собирать данные из закрытого периметра локальной сети, поэтому использовать ssl нет необходимости. Теперь укажем, куда будем передавать данные. Тут тоже все относительно просто. Рисуем конфиг output.conf, который описывает передачу данных в Elasticsearch.


output {
if [type] == "s1" {
elasticsearch {
hosts    => "localhost:9200"
index    => "s1-%{+YYYY.MM.dd}"
}
}
else {
elasticsearch {
hosts    => "localhost:9200"
index    => "unknown_messages"
}
}

#все поступающие данные logstash будет отправлять в системный лог = /var/log/syslog
#Используйте только во время отладки, иначе лог быстро разрастется
#stdout { codec => rubydebug }
}

Здесь все просто — передавать данные в elasticsearch под указанным индексом с маской в виде даты. Разбивка индексов по дням и по типам данных удобна с точки зрения управления этими данными. Потом легко будет выполнять очистку данных по этим индексам. Остается последний конфиг с обработкой входящих данных. Тут начинается самое интересное. Рисуем конфиг filter.conf.


filter {
if [type] == "s1" {
csv {
separator => ";"
columns => ["date1","time2","user","t1","t2","t3","t4","t5","t6"]
}
mutate {
add_field => {
"timestamp" => "%{date1} %{time2}"
}
#    remove_field => ["time1", "time2"]
}
date {
match => ["timestamp", "YYYYMMdd HH:mm:ss"]
target => "@timestamp"
}
if "_dateparsefailure" in [tags] {
drop{}
}
if [t3] in ["ИзмененПроведенный","ЗапускОтчета","ВосстановлениеПоследовательности", "OpenSession", "GrbgRuntimeErr" ] {
# пропускаем обработку этих событий
}
else {
kv {
value_split => ":"
field_split => " ;"
source => "t5"
}
mutate {
convert => { "ВремяВыполнения" => "integer" }
}
}
}
}

Первое, что делает этот фильтр — парсит логи с помощью фильтра csv, разбивая на колонки по символу ";" и выделяет значения, которые записывает в поля. Дальше используется модуль date для того, чтобы выделять дату из поступающих логов и использовать ее в качестве даты записи в elasticsearch, если не получается — прерываем обработку. Делается это для того, чтобы не возникало путаницы, если будут задержки с доставкой логов. В системе сообщения будут с одной датой, а внутри лога будет другая дата. Неудобно разбирать инциденты. Потом для колонки t3 используем фильтр kv для выделения Параметр:Значение. Разделителями являются символы " " или ";". Закончили настройку logstash. Запускаем его:

systemctl start logstash.service

Проверьте на всякий случай лог /var/log/logstash/logstash-plain.log, чтобы убедиться в том, что сервис запущен и нет ошибок. Теперь настроим агенты для отправки данных в logstash.

Установка Filebeat для отправки логов в Logstash

В Debian/Ubuntu ставим так:

apt-get install filebeat

После установки рисуем примерно такой конфиг /etc/filebeat/filebeat.yml для отправки логов в logstash.

filebeat.inputs:
- type: log
enabled: true
paths:
- /home/files/1c/*.mlg
fields:
type: s1
encoding: "cp1251"
fields_under_root: true
scan_frequency: 5s

output.logstash:
hosts: ["localhost:5044"]

xpack.monitoring:
enabled: true
elasticsearch:
hosts: ["http://localhost:9200"]

Некоторые пояснения к конфигу: с помощью поля type, указываем тип лога: s1, в зависимости от этого типа меняются правила обработки в logstash. Обязательно указываем кодировку "cp1251", иначе по умолчанию будут грузится кракозябры "utf". Запускаем filebeat и добавляем в автозагрузку.

systemctl start filebeat
systemctl enable filebeat

Проверяйте лог по адресу /var/log/filebeat/filebeat. Он весьма информативет. Если все в порядке, увидите список всех логов в директории /var/log/nginx, которые нашел filebeat и начал готовить к отправке. Если все сделали правильно, то данные уже потекли в elasticsearch. Мы их можем посмотреть в Kibana. Для этого открываем web интерфейс и переходим в раздел Discover. Так как там еще нет индекса, нас перенаправит в раздел Managemet, где мы сможем его добавить.

Добавление индекса в Kibana

Вы должны увидеть индекс, который начал заливать logstash в elasticsearch. В поле Index pattern введите s1-* и нажмите Next Step. На следующем этапе выберите имя поля для временного фильтра, выбирайте — @timestamp, и жмите Create Index Pattern.

Создание индекса с данными

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

Просмотр логов Elasticsearch в Kibana

Получением логов с linux серверов настроили. Переходим к анализу.

Добавляем счетчики в 1С

Добавим две функции, которые будем вызывать для анализа документов, отчетов и обработок. Функции оформим в виде класса ОбщиеФункции:

Функция Старт(Конт="") Экспорт
Возврат _GetPerformanceCounter();
КонецФункции

Функция Финиш(ВремяНачала, Конт, Имя="", Док="", ТипСобытия="ВнешняяОбработка") Экспорт
Попытка
Путь = Конт.РасположениеФайла();
Исключение
Попытка
// класс
Путь = Конт.ПолучитьПуть();
Исключение
//Путь = "НеопределеннаяОбработка";
ФормаРасш = СоздатьОбъект("РасширениеФормы");
Попытка
ФормаРасш.УстановитьФорму( Конт );
Путь = ФормаРасш.ПолныйТипОбъекта();
Исключение
Путь = "Модуль";
КонецПопытки;
КонецПопытки;
КонецПопытки;

Время= _GetPerformanceCounter() - ВремяНачала;
Сообщение = "Путь:"+Путь+" ВремяВыполнения:"+Время;

Попытка
Сообщение = Сообщение + " Вид:"+Конт.Вид();
Исключение
КонецПопытки;

Если ПустоеЗначение(Имя)=0 Тогда
Сообщение = Сообщение +" Имя:"+Имя;
КонецЕсли;
ЗаписьЖурналаРегистрации(Сообщение, ТипСобытия, , Док, 3);
Возврат Время;
КонецФункции //Финиш

Для замеров проведения добавляем в модуль проведения документа

Процедура ОбработкаПроведения(ВидыДвижений)
оф = СоздатьОбъект("ОбщиеФункции");
t1 = оф.Старт();
...
оф.Финиш(t1, Контекст, "ОбработкаПроведения", ТекущийДокумент(), "Документ");
КонецПроцедуры //ОбработкаПроведения()

Выводы

Ветис.API — система с последовательным доступом, на текущий момент не позволяющая обрабатывать несколько запросов одновременно — значит, сначала отправляем запрос, потом дожидаемся ответа, и только после этого можно отправлять следующий запрос. Поэтому 7,5 сек за 1 транзакцию — приемлемый результат, если время одного запроса сильно больше — надо выяснять причину. Время, используемое в запросе остатков = 23,8 сек за 1 запрос в большей степени характеризует сервера Ветис.API и нагрузку на них. Если время 1 запроса остатков сильно больше требуется:

  • Сократить период запроса для Ветис.API версии 2.1
  • Привести остатки в соответствии с остатками на складе = списать "лишние" остатки.

ELK — мощный OpenSource инструмент. Мы получили инструмент, с помощью которого можно анализировать работу 1С Предприятия 7.7 в рабочем режиме, не замедляя работы системы. Изучение логов помогает определить слабые места системы и увеличить качество обслуживания систем 1С Предприятие 7.7 Оптимизировать желательно зная слабые места = сколько времени выполняется функция и как часто вызывается, помня о золотом правиле: Оптимизируй там где болит, а не там где хочется. В дальнейшем планируем рассказать о создании Dashbord и Visualize на примере 1С Предприятия 7.7.

Ссылки

установка ELK стека и настрока отправки логов Windows

Фильтры в Logstash мощный инструмент

Исходная статья

17 Comments

  1. CheBurator

    Очень много окружения надо настраивать для такого анализа.

    имеетсмысл делать только если инфоситсема уже сложилась, все эти сервисы, убунты, и прочее — утсановлены итд.

    Основным можно признать только ограничение

    «Система аналитики должна работать автономно, не использовать ресурсы рабочего сервера 1С.»

    Для рядовго 1Сника-клюшечника Оправдано только если такая «подсистема анализа логов» дает действительно удобства КОГДА НИЧЕГО НЕ НАДО ПРОГРАММИТЬ, а все галочками на дашбордах/графиках можно понастраивать и весь упомянутый софт есть в виде готовых к инсталляции пакетов (где ссылки на это?). Ну и желательно без всяких убунт, если пакеты поставить еще можно асилить, то с линуксами возиться — не все могут себе позволить (возражения что «там возиться не надо — ставится с нуля одной кнопкой» — только при наличии ссылки на такую «убунту») — поэтому хочется все на виндах без линукса. А так — можно и через 1С++ с поставщиком данных «журнал регистрации» наверное не хуже сделать… тем более что разновидностей записей/событий не так уж и много…

    Но полезно. Может когда и пригодится.

    Про дашбоарды и визуализацию — будет интересно.

    Reply
  2. Serg O.

    для 1C 7.7 ???? оно 15 лет назад было…

    Вы пишете: 1С Предприятие 7.7 хранит системную информацию в файле SYSLOG1cv7.mlg в виде текста в формате csv, разделитель «;».

    а формат логов для 1С 8.2 — *.lgp — в принципе тоже через ; но файл в 10 — 100 Гб ничем не читается даже!

    а тем более для 1С 8.3 — формат логов вообще другой!

    а про них не слова…

    напишите вариант для 8.2 или лучше для 8.3

    Reply
  3. phsin

    (1)

    1. изучать новое — это весело 😉

    2. еще и полезно — позволяет посмотреть на существующее положение вещей с другой стороны.

    тем более инструменты существуют open source

    Для рядовго 1Сника-клюшечника Оправдано только если такая «подсистема анализа логов» дает действительно удобства КОГДА НИЧЕГО НЕ НАДО ПРОГРАММИТЬ, а все галочками на дашбордах/графиках можно понастраивать и весь упомянутый софт есть в виде готовых к инсталляции пакетов (где ссылки на это?). Ну и желательно без всяких убунт, если пакеты поставить еще можно асилить, то с линуксами возиться — не все могут себе позволить (возражения что «там возиться не надо — ставится с нуля одной кнопкой» — только при наличии ссылки на такую «убунту») — поэтому хочется все на виндах без линукса.

    если такой опытный 1С-ник говорит о том что » рядовой 1Сник-клюшечник» не сможет Ubuntu настроить, тогда понятно почему говорят что 1С ники ничего не знают и не умеют…

    «убунту» — это уже стандарт… даже MS выпускает .NET Core для linux… пора изучать… https://docs.microsoft.com/ru-ru/dotnet/core/linux-prerequisites

    Reply
  4. phsin

    (2) еще многие работают на 7ке…

    описание формата логов для 8ки — *.lgp пока не встречал…

    Reply
  5. phsin

    да и с 8кой как-то все там заморочено…

    скорее всего сохраняются значения через ЗначениеВСтрокуВнутр

    а с внутренней структурой кто будет возиться ?

    вот если бы можно было хранить логи в текстовом файле…

    Reply
  6. artbear
    Функции оформим в виде класса ОбщиеФункции:

    (0) Дело 1С++ живет 🙂 сколько лет прошло уже.

    Приятно, понимаешь 🙂

    Reply
  7. Steelvan

    (3) Вы очень строги к людям.

    Абсолютное большинство людей занимаются программированием на работе за деньги => делают и знают только то, за что платят на текущем рабочем месте.

    И вместо изучения новых технологий тратят время на семью, игры, пиво => просто живут.

    И их в этом обвинять словами «…тогда понятно почему говорят что 1С ники ничего не знают и не умеют…» какой смысл ?

    Reply
  8. phsin

    (7) тогда уж добавить и такие:

    — самое дорогое внедрение

    — и у кого 1С больше всего памяти кушает

    Москва и Питер победят? )))

    кстати на хабре недавно пробегала статья про Windows XP и надо сказать много ретроградов собралось…

    Reply
  9. phsin

    (8) я не обвиняю, а констатирую факт

    извините, неудобно слышать Ваши оправдания — смотря на кого вы равняетесь — вот Давид Хейнемейер Ханссон например создал фреймворк Ruby on Rails,

    ребята создали проект 1cpp = это же вообще магия, волшебство — практически ООП добавили в 1С, в 8ке сейчас такого нет

    Алексей Лустин, кажется, в каждом интервью и выступлении говорит — расширяйте границы, изучайте новое, не замыкайтесь только на 1С

    ну а семью и все остальное никто не отменял 😉

    Reply
  10. Steelvan

    (10) оправдания 0_О

    Маршрутчик целый день крутит баранку, ему нет необходимости учиться водить гоночный болид.

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

    Маляр умеет красить стены, ему нет необходимости учиться живописи.

    Вы напоминает маляра, который научился рисовать и теперь тыкает во всех пальцем, что я умею, а ты нет.

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

    «..тогда понятно почему говорят что 1С ники ничего не знают и не умеют… » = так говорят люди со стандартным и шаблонным мышлением, мне вас жаль.

    Reply
  11. phsin

    (11) если использовать Вашу терминологию — если Вы бухгалтер, тогда должны знать принципы двойной записи…

    установка linux для программиста — нижний уровень вхождения в профессию программиста (это личная точка зрения)

    для 8ки — это обязательно, 8ка устанавливается на *nix как серверная часть так и рабочие версии, это если вы не знали

    Вы переходите на личности и превращаете инфостарт в мисту…

    Если вы испугались страшных слов может не надо об этом кричать всему свету?

    Я не ваш работодатель и никто Вас не упрекает, что чего-то не знаете. посмотрите в интернете там куча инструкций.

    На вашем месте я бы больше обижался если бы меня назвали «программист», «КОГДА НИЧЕГО НЕ НАДО ПРОГРАММИТЬ»

    И эта статья размещена чтобы поделиться опытом и возможно услышать КОНСТРУКТИВНУЮ критику.

    Спасибо, Ваше мнение я услышал, дальше можете не продолжать.

    Reply
  12. Steelvan

    (12)

    Нормальный 1С программист должен знать:

    *) Управленческий учет;

    *) Бухгалтерский учет;

    *) Кадровый учет;

    *) Финансовый учет.

    Вы этого не знаете, зато знаете линукс, смешно.

    Теперь понятно почему из-за таких как Вы говорят что 1С ники ничего не знают и не умеют.

    Reply
  13. CheBurator

    93) я только «за!» начсчет изучения нового и интересного. но только в том случае, если мне за это платят. или я финансово подстрахован. А так — и жизнь пройдет в попытках догнать всякие локомотивы. я их уже несколько благополучно не догнал и они также благополучно сошли со сцены…

    Reply
  14. CheBurator

    но закладочку здесь сделал и следить буду за публикациями.

    Reply
  15. 3vs

    «Установка Java на Ubuntu»

    Кстати, Java, похоже, переходит на коммерческую версию.

    Общедоступные обновления Oracle Java SE 8, выпущенные после января 2019 года, будут недоступны для коммерческого или производственного использования без коммерческой лицензии.

    http://www.java.com/ru/download/release_notice.jsp

    Reply
  16. phsin

    (7) на хабре уже ответили… 🙂

    https://m.habr.com/ru/post/423889/

    Я занимаюсь программированием уже 15 лет. Но в последнее время при разработке не принято думать об эффективности, простоте и совершенстве: вплоть до того, что мне становится грустно за свою карьеру и за IT-отрасль в целом.
    Reply
  17. comol

    (17) Статья клёвая, спасибо. Но к теме то отношения не имеет. 7-ка работает медленнее 8-ки.

    В мире 1С эту статью можно применить скорее к EDT и телодвижениям 1C в сторону Java…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *