Приветствую, коллеги.
Этим решением хочу предложить сообществу еще один способ выгрузки журнала 1С в ClickHouse.
Предыстория
Как и у многих, у нас в компании возникали неудобства и сложности при использовании стандартного журнала регистрации 1С. В поиске решения этой проблемы мы обратили внимание на разработку Евгения Аклаева, наверное, это лучшее решение из того, что можно найти в открытом доступе.
Но при тестировании этого решения мы обнаружили, что иногда экспортер перестает отправлять данные в ClickHouse (помогал только перезапуск), происходит, вероятно, это при потере связи с ClickHouse. Гарантировать бесперебойный доступ к ClickHouse мы не могли, поскольку базы 1С у нас территориально размещены на разных площадках (филиалах), и периодически могут возникать кратковременные перебои со связью по независящим от нас причинам. Из-за этой проблемы и невозможности подключить экспортер к мониторингу нам пришлось продолжить поиск инструмента для выгрузки ЖР 1С.
Так как у нас ранее уже был положительный опыт использования на не 1С проектах сборщика логов Vector, то мы решили попробовать его применить и для 1С.
Немного о Vector
Vector это кроссплатформенный open-source сборщик логов с возможностями ETL.
Его задача заключается в том, чтобы взять из некоторого источника лог, при необходимости как то его трансформировать и отправить в некоторое хранилище. Написан Vector на Rust, что позволяет показывать ему очень хорошие результаты по производительности при скромном потреблении ресурсов.
В Vector можно писать очень гибкие алгоритмы трансформации данных на встроенном языке VRL или на языке LUA в случае, если возможностей VRL не хватает. И, что немаловажно, Vector имеет встроенный экспортер своих метрик в Prometheus, что позволяет настроить его мониторинг например в Grafana, а также у Vector есть возможность проверять статус его работы (healthcheck) путем обычного GET запроса. На момент написания статьи проект Vector имеет около 18K звезд на github.
В общем, инструмент хороший, и нам оставалось только подружить его с логом 1С, что мы собственно и сделали. Алгоритм парсера журнала 1С был написан на основе статьи Антона Ширяева, огромная ему благодарность за проделанную работу, а формат таблицы в ClickHouse мы оставили почти такой же, как в экспортере Евгения Аклаева, что по идее должно дать возможность продолжить пользоваться уже существующими инструментами для просмотра журнала: вариант1, вариант2.
Если в вашей инфраструктуре не развернуты ClickHouse, Grafana и Prometheus, то для тестирования работы предлагаемого решения вы можете развернуть их самостоятельно с помощью Docker, Docker-compose конфиг с этими сервисами есть в архиве, а о том, как настроить ClickHouse в Docker, я писал в этой статье.
Инструкция по установке и настройке Vector для windows
- Скачиваем и устанавливаем дистрибутив Vector c официального сайта.
(я использую вариант дистрибутива: Windows MSI) - Распаковываем архив, приложенный к статье, например в c:\collector\
- Редактируем файл collector.cmd, в нем через переменные окружения задаются настройки сборщика:
onec_logs_path - путь к папке, где хранятся логи 1С
onec_logs_server - адрес сервера ClickHouse
onec_logs_database - база данных CH
onec_logs_user - пользователь CH
onec_logs_password - пароль CH
onec_logs_table_logs - таблица для ЖР 1С
onec_logs_table_errors - таблица для сообщений об ошибках парсинга ЖР
onec_logs_api_ip_port - ip, порт для проверки состояния сборщика
onec_logs_metric_ip_port - ip, порт для экспорта метрик в prometheus
onec_logs_debug - режим отладки
- Создаем в ClickHouse базу данных с именем, что и в переменной onec_logs_database и далее в этой базе создаем две таблицы: одну для журнала 1С с именем, заданным в переменной onec_logs_table_logs
и вторую для хранения ошибок парсинга журнала с именем заданной в переменной onec_logs_table_errors. Скрипты для создания этих таблиц приведены в файлах create-table-ones-logs.sql, create-table-ones-logs-error.sql. - Для запуска сборщика запускаем файл collector.cmd.
После запуска сборщика в папке с журналом 1С будет создана папка input_logs, в ней хранятся данные о том, на какой позиции обработки находится сборщик, важно знать, что если эту папку удалить, то сборщик логов начнет отправку данных журнала с самого начала.
Данное решение предполагает отправку журнала регистрации только из одной базы 1С, поэтому если вам нужно отправлять ЖР из нескольких баз, просто размножьте файл collector.cmd с внесением необходимых изменений для каждой базы 1С.
Настройка мониторинга
Для того, чтобы проверить, что сборщик находится в рабочем состоянии, нужно отправить GET запрос на http://host:port/health.
Номер порта задается в переменной onec_logs_api_ip_port. В случае, если Vector находится в рабочем состоянии, в ответ мы получим сообщение в json формате: {"ok":true} с кодом статуса 200.
Для того, чтобы информацию о статусе сборщика можно было мониторить с помощью Grafana, можно воспользоваться blackbox exporter. Blackbox exporter - это сервис, предназначенный для того, чтобы собирать информацию о доступности сервисов и отдавать ее в виде Prometheus метрик.
Метрики сборщика можно получить, перейдя по адресу http://host:port/metrics/.
Номер порта задается в переменной onec_logs_metric_ip_port.
Пример дашборда с метриками Vector можно скачать из маркета Grafana, выглядит она следующим образом:
А описание всех существующих метрик можно получить, обратившись к официальной документации Vector.
Как это работает
Конфигурация Vector находится в файле vector.toml и разбита на секции, которые из себя представляют блоки конвейера (pipeline) по обработкие потока данных (журнала 1С). Визуально этот конвейер выглядит следующим образом:
В секции [sources.input_logs] указывается, откуда брать файлы ЖР 1С, а в параметре multiline.condition_pattern указывается регулярное выражение, по которому Vector разделяет строки в лог файле на отдельные записи журнала. Подробнее о возможных настройках можно почитать в документации.
Секция [transforms.remap_logs] ссылается на файл transform.vrl, в котором размещен алгоритмом трансформации, задачей которого является:
- разбить полученную строку лога на отдельные колонки. Разбиение записи журнала на колонки также выполняется с помощью регулярного выражения.
- Преобразовать дату записи журнала в формат, который понимает ClickHouse.
- В случае, если в процессе парсинга лога произойдет ошибка, записать ее в поле err.
Полученные в результате трансформации данные поступают на вход фильтров. В случае, если поле err не пустое (возникла ошибка), то информация об ошибке отправляется в таблицу с ошибками, имя которой задается в переменной onec_logs_table_errors.
Если ошибок не было (поле err пусто), то данные поступают в секцию [transforms.preparation_data], в которой происходит обогащение данных лога из словаря 1Cv8.lgf. Алгоритм работы со словарем находится в файле transform.lua. После обогащения данные отправляются в ClickHouse в таблицу с именем описанной в переменной onec_logs_table_logs.
В заключение хотелось бы сказать, что Vector с легкостью запускается в ОС Linux или Docker контейнере.
Надеюсь получить от сообщества конструктивную обратную связь и помощь в развитии данного решения.