Анализ логов журнала регистрации 1С с использованием BI Superset

22.04.22

База данных - Журнал регистрации

Что делать, если мы хотим в реальном времени считать, накапливать и показывать бизнесу ошибки, записанные в журнал регистрации 1С?

Скорее всего, многие из вас уже столкнулись с проблемой анализа логов журнала регистрации 1С высоконагруженных конфигураций и, скорее всего, задавались вопросом: «А какие есть варианты, кроме анализа штатными средствами 1С?». Если этот вопрос уже стоял перед вами, то надеюсь, что эта статья поможет вам в выборе альтернативы.

Небольшие извинения прежде, чем мы начнем

Прошло уже больше двух месяцев с момента опубликования последней статьи, где мы обещали продолжение темы мониторинга. Конечно, можно найти множество оправданий, почему мы до сих пор так и не опубликовали обещанное, но я этого делать не буду, так как мы предполагаем, а Бог располагает. Поэтому прошу понять и простить 😊.

Постановка проблемы и формулировка задачи

Как я писал в предыдущей статье, в современном мире ИТ просто хорошо работать недостаточно, нужно уметь продавать свои решения, подходы, результаты. Нужно менять парадигму восприятия ИТ продуктов, да и самого ИТ бизнесом. А что является лучшим решением, как не представить реальные показатели работы информационных систем (ИС) компании в виде красивых картинок? Правильно. BI борды, где каждый желающий в реальном времени может посмотреть, что происходит с той или иной ИС, и в случае необходимости получить детализацию нужного показателя.

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

В этой статье мы затронем вопрос анализа ошибок, регистрируемых в журнале регистрации 1С.

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

Что не так со штатными средствами 1С?

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

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

  1. Чем больше периодичность, тем больше шанс получить «утечку памяти» при чтении данных из файла логов. Хотя, конечно, словосочетание «утечка памяти» здесь может быть и не к месту, но наши пользователи очень любят открывать ЖР в рабочее время и выполнять свои аналитические дела. С учетом того, что у нас была месячная периодичность файлов логов, а при открытии наш дорогой windows подтягивает весь этот файл в память, то мы попадали в ситуацию, когда память неожиданно заканчивалась на сервере. Поэтому мы реализовали запись логов с периодичностью в час, что сразу привело к невозможности проведения полноценного анализа ЖР, но решило проблему с памятью.
  2. Чем больше периодичность, тем больше данных в файле, и тем медленнее выбираются эти данные.
  3. Штатными средствами мы так и не решаем проблему с понятной бизнесу визуализацией данных в реальном времени.

Все новое - хорошо забытое старое

Мы не стали изобретать велосипед и воспользовались наработками Юрия Пермитина, о которых он рассказывал еще в 20 году в своей статье Работа с журналом регистрации. Выходим за границы платформы.

Описанные в статье наработки позволяют в реальном времени загружать данные из логов журнала регистрации 1С в различные базы данных. Так как мы используем MS SQL в качестве СУБД для 1С и у нас уже есть лицензии и люди, обслуживающие данный тип СУБД, то мы приняли решение использовать существующий стек и загружать логи в СУБД MS SQL.

Фактически решение из себя представляет консольную утилиту, которая читает данные из текстовых логов ЖР 1С и пишет их в БД SQL. Утилита умеет догружать данные для этого в БД есть таблица LogFiles в которую пишется последний записанный лог файл. В следующий раз загрузка начнется с этого файла:

 

 

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

RowsData - все основные данные пишутся в эту таблицу. Структура таблицы достаточно понятная и имеет практически все необходимые данные для проведения анализа.

Applications – это сервис или приложение, где произошла ошибка:

 

Computers – здесь находятся имена всех клиентских компьютеров, с которых произошла ошибка, записанная в ЖР 1С

Events – здесь находятся все имена логируемых событий 1С

InformationSystems – здесь хранится имя системы которой принадлежит ЖР 1С

LogFiles – про него я уже упоминал выше.

Metadata – здесь хранятся имена метаданных, при работе с которыми произошла ошибка:

 

 

Severities – серьезность ошибки, точнее слово «ошибка» я использую в контексте всего что логируется в ЖР, но в реальности там следующая разбивка:

 

Users – в таблице хранятся все пользователи и их UID-ы, при работе которых произошла ошибка

WorkServers – это имена серверов, с которыми работает текущий сервер 1С. Если у вас сбалансированный кластер, состоящий из нескольких нод, то в таблице будут все эти ноды.

Есть еще две таблицы ErrorsMetricByHour и ErrorsMetricByWeek, в которых, как я понял, агрегируются ошибки по часам и неделям, но я пытался сравнить расчетные данные, полученные из таблицы RowsData с данными из этих таблиц, и не получил равенство, поэтому я не использую эти агрегированные таблицы для свои целей.

И, к слову сказать, есть еще view vw_EventLog, представляющая из себя такой огромный join, но забегая вперед скажу, что с учетом нашего объема данных вариант оказался для нас нерабочим.

Отсюда мы брали последние версии исходников от автора:

https://github.com/YPermitin/YY.EventLogExportAssistant

https://github.com/YPermitin/YY.EventLogReaderAssistant

А дальше дело техники

После того как мы получили весь набор логов в одной таблице (RowsData), мы подключили БД с логами (EventLog) к нашей BI Superset. Почему мы выбрали Superset, мы уже писали в предыдущей статье. Здесь я дам чуть больше технических деталей.

Так как я не DevOps инженер, то не могу рассказать о процессе установки и настройки Superset-а, но я могу описать те вещи, с которыми мне удалось столкнуться самому.

Подключение БД

По умолчанию Superset не имеет драйвера для подключения MS SQL, и для того чтобы подключить MS SQL нашим DevOps инженерам пришлось еще поискать как это сделать, но по итогу мы получили такую возможность:

 

 

Строка подключения к БД выглядит следующим образом:

mssql+pymssql://имя пользователя SQL:пароль@имя сервера SQL/EventLog(это собственно имя базы)

Создание Dataset

Фактически мы создаем набор данных, из которого потом сможем построить Charts, а те в свою очередь можно будет добавить на Dashboard.

Dataset можно создавать двумя путям:

  1. Если вы будете делать запрос к одной таблице и вам не нужны join-ы, то вы просто нажимаете большую кнопку «+ DATASET», заполняете все указанные поля и радуетесь жизни.
  2. Обычно жизнь сложнее и нужны данные из нескольких таблиц. В этом случае Dataset нужно создавать из механизма SQL Lab. Так как данных может быть много и запрос может выполняться долго, то я рекомендую сначала сделать запрос в Management Studio. В случае необходимости добавить индексы, а только потом создавать Dataset. И важный момент: запрос должен выбирать максимальное количество данных, без сложных группировок и условий. Условия и группировки вы сможете сделать в Chart-ах. Если вы будете использовать это правило, то на базе одного Dataset-а вы сможете строить различные разрезы. Ниже пример настроек Dataset-а по всем ошибкам в ЖР 1С:

 

 

Создание Chart

На базе созданного ранее набора данных (Dataset) можно делать различную визуализацию при помощи Chart-ов. Например, на рисунке ниже показано, что на базе описанного выше dataset-а было сделано три chart-а с разной визуализацией:

 

А это как выглядит интерфейс редактирования конкретного chart-а: 

 

Создание Dashbord

Dashbord-ы создаются по нажатию большой кнопки «+DASHBORD». Добавление Chart-ов на конкретный dashboard происходит в момент сохранения chart-а. И по итогу вы можете получить «красивенький» dashboard, который сможете презентовать всем, кому нужно:

 

 

Ну да, есть и подводные камни

Первая проблема, с которой мы столкнулись, это периодическое падение консольной утилиты по различным причинам. Это могут быть как ошибки подключения к БД, так и различные ошибки данных. Некоторые ошибки просто пропускались после перезапуска утилиты, а некоторые пришлось исправлять.

Например, была ошибка поиска данных в словаре. Оказалось, что словарь в c# регистрозависимый, и у нас появилась ситуация, когда значение условия из БД не совпадало со значением в словаре.

Вторая ошибка, которую мы еще не исправили – это то, что в системе может появиться пользователь с одним именем, но при этом иметь два разных UID-а и по итогу приложение падает с ошибкой, так как не может получить id пользователя. Пока я не разобрался, как починить.

В связи с тем, что проект https://github.com/YPermitin/YY.EventLogExportAssistant использует библиотеки из проекта https://github.com/YPermitin/YY.EventLogReaderAssistant мне пришлось объединить эти проекты, чтобы иметь возможность полноценно пользоваться отладчиком.

Объединенный вариант с исправленной ошибкой лежит в моём репозитории на github: https://github.com/ValentinKozlov/YY.EventLogExportAssistant

Я в начале пути по изучению c# и возможно наделал всяких непотребств, но до других вариантов решения я пока не дошел.

Вторая большая проблема – это объем БД и соответственно скорость выполнения запросов. Мы закачали данные с 1 января 2021 года и на начало апреля 2022 года наша база имеет размер 1,1 Тб, с количеством строк в таблице RowsData более 1 млрд. Это накладывает огромные накладные расходы как на обслуживание такой базы, так и на скорость выполнения запросов, поэтому пока приходится тюнить индексами каждый разрабатываемый запрос и внимательно следить за тем, чтобы запросы выполнялись за адекватное время.

Что дальше

Для решения первой проблемы мы привлекли профессиональных разработчиков c#, которые помогут нам превратить консольную утилиту в полноценный enterprise service с возможностью автоматического перезапуска, безопасного хранения паролей и логированием ошибок для дальнейшего их мониторинга при помощи Prometheus + Grafana.

Для решения второй проблемы у нас уже есть план по уменьшению базы:

  1. Мы сделали скрипт, которым будем удалять данные старше 6 месяцев, не считая текущий месяц. Скрипт и его тестовый вариант можно найти в моём репозитории в папке Scripts (TableClearing_RowsData_DB_EnentLog.sql и TableClearing_RowsData_DB_EnentLog_Test.sql)
  2. Также мы планируем применить к таблице RowsData сжатие. На основании статьи MSDN  для таблицы RowsData мы выбрали тип сжатия - page compression. В первую очередь это связанно с тем, что данные в таблице не обновляются, а только добавляются, а чтений у нас будет достаточно много.

 

Заключение

Мне показалось, что получилось как-то много букАв, но сократить текст без потери смысла не получилось. Вероятно, Чукча не писатель, Чукча читатель 😊. В любом случае, надеюсь, читать было интересно, и кто-то из вас смог почерпнуть полезную информацию.

Больше не буду обещать, что в ближайшее время напишу новую статью, но пока я собирался писать эту, я уже успел набросать 1С connector для хранилища S3 Minio на базе типовой БСП. Доработка не претендует на законченный вариант, так как там еще полно багов, да и тестирования полноценного не было, но взять в качестве прототипа для своих разработок уже можно. Кому интересно, можно взять здесь и потыкать: https://github.com/ValentinKozlov/1c-s3connector

ЖР Sepeeset

См. также

LogManager - Внешний журнал регистрации в SQL

Журнал регистрации Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Журнал регистрации платформы 1С в SQL. Общая база хранения всех журналов. Через com-подключение регламентным заданием периодически догружает журналы регистраций из рабочих баз. Предоставляет настраиваемый доступ к журналам по правам подразделений. Формирует отчеты по пользователям и данным.

10000 руб.

23.05.2014    55700    52    16    

47

Версионирование объектов для Альфа-авто, ред 4 и 5.

Оптовая торговля Розничная торговля Журнал регистрации Платформа 1С v8.3 Конфигурации 1cv8 Автомобили, автосервисы Управленческий учет Платные (руб)

Подсистема версионирования объектов для конфигураций Рарус: Альфа-авто на базе типовой подсистемы от 1С. Позволяет хранить историю изменений документов и справочников, кто, что, когда и какие данные изменял, а так же вернуться к предыдущим версиям объекта.

4800 руб.

03.09.2016    42411    33    24    

38

Мониторинг баз и серверов 1С

Журнал регистрации Мониторинг Платформа 1С v8.3 Платные (руб)

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

9000 руб.

28.08.2019    31331    15    21    

68

LogiCH - хранение и анализ журнала регистрации в сверхбыстрой СУБД ClickHouse

Журнал регистрации Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Конфигурация LogiCH эффективно решает проблему хранения и анализа записей журналов регистрации. Разработка использует столбцовую СУБД ClickHouse, одну из самых быстрых Big Data OLAP СУБД. Любой анализ журнала можно выполнить в одном отчете, в котором доступны все возможности СКД с учетом ограничений RLS. Количество подключаемых баз не ограничено и не влияет на скорость построения анализа.

5000 руб.

28.11.2018    19733    13    6    

37

Регламентное сокращение журнала регистрации

Инструменты администратора БД Журнал регистрации Платформа 1С v8.3 1С:Управление торговлей 11 Абонемент ($m)

Внешняя обработка для регламентного сокращения журнала регистрации для конфигураций на базе БСП и платформы 8.3.20+

1 стартмани

29.12.2023    1458    16    dima_gsv    1    

12

Магия преобразований Vector, часть 3: журнал регистрации + прямой экспорт ошибок в Sentry

Журнал регистрации Мониторинг Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

19.11.2023    853    3    AlexSTAL    0    

7

Магия преобразований: ЖР, ТЖ, RAS/RAC, логи - универсальное решение Vector

Мониторинг Журнал регистрации Технологический журнал Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

13.11.2023    3375    5    AlexSTAL    0    

46

Мониторинг состояния с отправкой в telegram

Журнал регистрации Инструменты администратора БД Мониторинг Мессенджеры и боты Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Абонемент ($m)

Внешняя обработка для БСП-конфигураций с простым программным интерфейсом. Предназначена для мониторинга состояния системы. Базово реализована отправка ошибок из журнала регистрации, но можно легко добавить мониторинг других журналов, каких-либо действий пользователей, состояния системы (например закрытие месяца).

3 стартмани

26.09.2023    1912    11    doom2good    10    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 93 25.04.22 11:23 Сейчас в теме
мы хотим в реальном времени считать, накапливать и показывать бизнесу ошибки, записанные в журнал регистрации 1С

Какая странная задача, там же столько "добра" будет, зачем его анализировать...
ну, а в целом, то таких решений для хранения ЖР во внешней бд уже предостаточно. Хотя тут реализация на уровне.
2. digital-samolet 125 27.04.22 19:03 Сейчас в теме
(1) Цель - реализовать комплексную метрику продукта и ошибки в ЖР одна из метрик. Кстати и не только ошибки, например, количество входов в продуктивный конфигуратор, говорит о том, что процесс разработки в команде построен плохо. В нормальном flow в продуктивный конфигуратор не в ходят, а находят большую часть ошибок до выкатки релиза.
3. triviumfan 93 04.05.22 18:18 Сейчас в теме
(2)
В нормальном flow в продуктивный конфигуратор не в ходят, а находят большую часть ошибок до выкатки релиза.

Нереально. Утопия)
4. digital-samolet 125 05.05.22 09:09 Сейчас в теме
(3) На 100% конечно утопия, но это не отменяет того что нужно к этому стремиться. Если после выкатки релиза у нас 100500 входов в конфигуратор, куча остановок работы и баг фиксов, то это 100% неэффективный процесс разработки или вообще его отсутствие. Если же время от времени кто-то заходит, то все норм.
Цель - получить метрики, а в метриках главное тренд, а не точность значений.
5. malikov_pro 1297 27.05.22 06:38 Сейчас в теме
"уже успел набросать 1С connector для хранилища S3 Minio на базе типовой БСП" - развивал тему в свое время https://infostart.ru/public/1276986/ + https://github.com/malikov-pro/external-storage-1c-ssl.

На github не увидел issue с тем что нужно доделать, тема актуальная отправить PR реально. Во что сам уперся - копирование меду томами делается через копирование между папками. При использовании дополнительных вариантов хранения (желательно закладывать в виде адаптера) нужно сначала получать на сервер 1С, отправлять в новое место, после удалять из источника и сервера.

Вариант применения для меня - перенос каталога картинок между базами розницы РИБ, типовой результат - все в БД, сейчас решил за счет блокировки передачи и проксирования через NGINX, нормальное решение - наличие ссылки на S3, из которого можно сделать локальное зеркало и за счет DNS на него завернуть нужный узел РИБ.
6. malikov_pro 1297 27.05.22 06:58 Сейчас в теме
"Более или менее нормальный анализ штатными средствами 1С возможен, только если мы имеем достаточно большую периодичность хранения логов."
По логам что доп транспорт сделали - хорошо, сам выгружаю в sentry рег заданием раз в 5 мин. Вопрос в содержании и анализе логов, доведения до разработчиков и проверка повторного появления.
Типовой формат ЖР оставляет желать лучшего, стек трейс может быть задублирован если исключение было вызвано вызовом команды, стек трейс не получить локальным исключением, только заваливать весь процесс (выяснить из какой ветки прилетают ошибочные данные). Отсутствие информации о окружении (версии расширений).
Готов к дискуссии на тему как формировать логи, чтобы их понятно было анализировать.
7. пользователь 27.05.22 17:41
Сообщение было скрыто модератором.
...
Оставьте свое сообщение