Intro
В прошлом году мы развернули ElasticSearh и загрузили туда логи из Журнала регистрации 1С по основным нашим базам. Разово исправили ошибки и потом периодически просматривали статистику. Это была несистемная работа, которая занимала время, была нерегулярной и весьма непредсказуемой.
Целевое состояние, которого мне хотелось достичь: система сама сообщает об ошибках письмом в саппорт, при срабатывании определенных условий.
Плюсы такого решения:
- Оно системное и не зависит от человеческого фактора.
- Частоту проверки можно поставить любую, хоть раз в минуту. Т.е. оно оперативнее.
- Правила на события можно настроить очень гибкие, которые человек, проверяющий elastic, может не обнаружить.
Минусы тоже есть:
- Спам о повторяющихся ошибках, на которые мы не можем повлиять.
Итак, для решения этой задачи была выбрана ElastAlert, которая как будто специально была написана под наши требования.
ElastAlert — это фреймворк, написанный на питоне, который позволяет непрерывно мониторить ElasticSearch на предмет аномалий, различных пиков и всяких прочих паттернов. ElastAlert состоит из двух компонент: 1. Правила мониторинга, 2. Правила оповещения. Все довольно просто.
Виды правил
ElastAlert поддерживает следующие виды правил:
- Частотные события (frequency) — когда событие произошло X раз за Y времени
- Резкий скачок (spike) — когда норма событий, по сравнению с другими периодом, увеличивается или уменьшается.
- Тишина в эфире (flatline) — когда меньше, чем X событий за Y времени.
- Черно-белые списки (blacklist/whitelist) — когда случается событие, одно из полей которого попадает в черный или белый список.
- Любое событие (any) — любое событие по заданному фильтру.
- Изменение (change) — когда у поля два разных значения за определенный период времени
- И многие другие, см.здесь
Виды оповещений
Оповещения в 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.
Основные параметры:
rules_folder
— папка в которой лежат правилаes_host
— адрес, где установлен ElasticSearches_port
— порт ElasticSearches_username
— необязательный параметр, логин к ElasticSearches_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
Наслаждаемся.
Как это работает у нас
Для себя мы настроили два вида правил:
- Частота одной ошибки в час (больше 10)
- Частота всех ошибок в час (больше 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.