Как мы научились автоматически отслеживать ошибки в 1С

Время чтения: 3 мин.

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

Содержание

Intro

В прошлом году мы развернули ElasticSearh и загрузили туда логи из Журнала регистрации 1С по основным нашим базам. Разово исправили ошибки и потом периодически просматривали статистику по ошибкам. Это была несистемная работа, которая занимала время, была нерегулярной и весьма непредсказуемой.

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

Плюсы такого решения:

  1. Оно системное и не зависит от человеческого фактора.
  2. Частоту проверки можно поставить любую, хоть раз в минуту. Т.е. оно оперативнее.
  3. Правила на события можно настроить очень гибкие, которые человек, проверяющий elastic, может не обнаружить.

Минусы тоже есть:

  1. Спам о повторяющихся ошибках, на которые мы не можем повлиять.

Итак, для решения этой задачи была выбрана ElastAlert, которая как будто специально была написана под наши требования.

ElastAlert — это фреймворк, написанный на питоне, который позволяет непрерывно мониторить ElasticSearch на предмет аномалий, различных пиков и всяких прочих паттернов. ElastAlert состоит из двух компонент: 1. Правила мониторинга, 2. Правила оповещения. Все довольно просто.

Виды правил

ElastAlert поддерживает следующие виды правил:

  1. Частотные события (frequency) — когда событие произошло X раз за Y времени
  2. Резкий скачок (spike) — когда норма событий, по сравнению с другими периодом, увеличивается или уменьшается.
  3. Тишина в эфире (flatline) — когда меньше, чем X событий за Y времени.
  4. Черно-белые списки (blacklist/whitelist) — когда случается событие, одно из полей которого попадает в черный или белый список.
  5. Любое событие (any) — любое событие по заданному фильтру.
  6. Изменение (change) — когда у поля два разных значения за определенный период времени
  7. И многие другие, см.здесь

Виды оповещений

Оповещения в ElastAlert есть уже готовые на любой вкус и цвет, но если готовые не устраивают, то можно дописать свои. Инструкция по написанию своих оповещений здесь.

Виды готовых оповещений: Command, Email, Jira, OpsGenie, SNS, HipChat, Stride, MS Teams, Slack, Mattermost, Telegram, GoogleChat, PagerDuty, PagerTree, Exotel, TwilioVictorOps, Gitter, ServiceNow, Debug, Stomp, Alerta, HTTP POST, Alerter, Line Notify, theHive, Zabbix.

Как начать

Установить с помощью PIP

$ pip install elastalert

И еще

$ pip install "setuptools>=11.3"
$ python setup.py install

Установим клиент Elasticsearch:

$ pip install "elasticsearch>=5.0.0"

Дальше открываем файл config.yaml и настраиваем наш ElastAlert.

Основные параметры:

  1. rules_folder  — папка в которой лежат правила
  2. es_host  — адрес, где установлен ElasticSearch
  3. es_port  — порт ElasticSearch
  4. es_username — необязательный параметр, логин к ElasticSearch
  5. es_password — необязательный параметр, пароль к ElasticSearch.

Создадим индексы в ElasticSearch для ElastAlert c помощью elastalert-create-index:

$ elastalert-create-index
New index name (Default elastalert_status)
Name of existing index to copy (Default None)
New index elastalert_status created
Done!

Переходим к созданию правил. В папке example_rules вы найдете несколько примеров использования правил. Но я приложу наши, с продакшена:

 # Имя хоста  
 es_host: hostname 
 # Имя правила. Не должно повторяться!
 name: frequencyERP
 # Вид правила
 type: frequency
 
 # Настройки дат. Важно указать конкретный формат, иначе работать не будет.
 use_local_time: true
 timestamp_field: Дата
 timestamp_type: custom
 timestamp_format: "%Y-%m-%dT%H:%M:%S"

 # Имя лога в ElasticSearch
 index: 1c-eventlog-*

 # Ключ группировки
 query_key: "ИнформационнаяБаза"
 # Количество событий
 num_events: 100
 # За какой период проверяем
 timeframe:
   hours: 1
 
 # Раздел фильтрации
 filter:
 # Term - точное соответствие
 term:
 ИнформационнаяБаза: "osn"
 # Query - вхождение слова
 query:
 query_string:
   query: "Уровень: Ошибка" 
 
 # Раздел оповещения
 alert:
 # Способ оповещения 
 email:
  from_addr: "admin@somedomain.com"
  email: "support@somedomain.com" 
 alert_subject: "Превышение количества ошибок в <Имя базы>"
 smtp_host: "XXX.XXX.XXX.XXX"
 smtp_port: XX

Тестируем правило:

$ elastalert-test-rule example_rules/example_frequency.yaml

Если все ок, то запускаем в прод. Указываем конфиг с папкой правил, чтобы работали все правила, находящиеся в ней:

$ python -m elastalert.elastalert --verbose --config config.yaml

Наслаждаемся.

Как это работает у нас

Для себя мы настроили два вида правил:

  1. Частота одной ошибки в час (больше 10)
  2. Частота всех ошибок в час (больше 100)

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

Пример кейса: коллеги от бизнеса поменяли все пароли для доступа к одному из сервисов и 1С безуспешно щемилась в сервис и писала ошибки в журнал регистрации. ElastAlert сообщил нам об этом и мы узнали о проблеме и пофиксили ее.

Пример сообщения от ElastAlert в службу поддержки:

 frequencyERP
 At least 10 events occurred between 2020-01-24 14:15 RTZ 2 (зима) and 2020-01-24 15:15 RTZ 2 (зима)
 id: hEXa1m8BFUH0tc2HXGmC
 index: 1c-eventlog
 type: record
 numhits: 1110
 nummatches: 24
 ВспомогательныйIPПорт: 
 Данные: 
 Дата: 2020-01-24T12:15:38Z
 ИмяПользователя: XXX
 ИмяПриложения: BackgroundJob
 ИнформационнаяБаза: XXX
 Комментарий: ОбщийМодуль.XXX.Модуль(173)}: Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств) ЗаполнитьЗначенияСвойств(СтрокаРТиУ, СтрокаЗНЗ, , "Субконто1");
 по причине:
 Недопустимое значение параметра (параметр номер '4') (Поле 'Субконто1' объекта 'Документ табличная часть строка: Расшифровка затраты' не обнаружено).
 Идентификатор записи: 45ed0c07-692f-4f86-9059-468f1910657c
 Компьютер: xxx
 КраткоеОписание: ОбщийМодуль.XXX.Модуль
 Метаданные: РегистрСведений.ПроизошедшиеБизнесСобытия
 ОсновнойIPПорт: XXX
 Пользователь: 36a7befd-7119-438c-9400-56153da57a0c
 ПредставлениеДанных: 
 ПредставлениеМетаданных: Регистр сведений. Произошедшие бизнес-события
 ПредставлениеПриложения: Фоновое задание
 ПредставлениеСобытия: ОбработкаБизнесСобытий
 РабочийСервер: XXX
 Сеанс: 1427
 Событие: ОбработкаБизнесСобытий
 Соединение: 658922
 Ссылка: 
 СтатусТранзакции: Нет транзакции
 Транзакция: 
 Уровень: Ошибка

Выводы

Мы убрали человеческий фактор в контроле ошибок Журнала регистрации, теперь у нас за это отвечает робот. Повысили оперативность реагирования на ошибки. Научились работать с фреймворком ElastAlert.

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

В планах: настроить дополнительные правила для возникновения новых ошибок, которых еще не было в логах. Настроить работу ElastAlert как службы с помощью Supervisor.

До новых встреч:)

Leave a Comment