Алерты в решении рутинных задач
Привет, друзья! Ежедневная рутина – неотъемлемая часть работы. Однако, с помощью автоматизации рабочих процессов можно значительно оптимизировать свое время и не тратить его на монотонные задачи. Кроме того, автоматизация позволяет более оперативно реагировать на отклонения в данных. В этом посте поделюсь своим опытом по созданию системы алертов.
Под системой алертов я подразумеваю написанную программу, которая самостоятельно и через определенные временные промежутки проверяет метрики на предмет аномалий.
Аномалией считается необычное поведение метрики, в результате которого значения последней отличаются от привычных.
Выявлять аномалии можно по-разному. В решении своей задачи я использовал межквартильный размах. Для него необязательно, чтобы данные были распределены нормально. Кроме того, для мониторинга сильных отклонений в режиме реального времени в целом стоит отдавать предпочтение статистическим методам. Они не такие ресурсозатратные как методы машинного обучения, вследствие чего работают быстрее.
Перед написанием скрипта определил список необходимых метрик: количество активных пользователей, просмотров, лайков и CTR. Сам же скрипт получился из нескольких блоков: списка метрик для мониторинга, коннектора к базе данных приложения, алгоритма мониторинга аномалий, функций для отправки алерта. Далее по пунктам.
1. На первом шаге мне понадобился BotFather. Это сервис для настройки и управления ботами в telegram. При входе в диалог с BotFather в приложении появляется инструкция по использованию и основные команды. Так, через команду /newbot я создал нового бота, ввел логин (название бота) и его юзернейм, получил уникальный токен и id чата. После этого импортировал нужные библиотеки в jupyter notebook.
2. На втором шаге задал подключение к базе данных.
3. Установил дефолтные параметры, которые прокидываются в таски, а также задал интервал запуска DAG (Directed Acyclic Graph, направленный ациклический граф). Это объект, предоставляемый Airflow, который нужен для того, чтобы задать набор последовательных задач (тасков) для их запуска по определенному расписанию.
4. Далее я ввел функцию для детектирования аномалий. Именно здесь происходит проверка полученного значения. Будет ли последнее считаться отклонением или же соответствовать типичному поведению метрики. Для этого я построил доверительный интервал, границы которого рассчитал с помощью квартилей. Так, само значение межквартильного размаха представляет собой разницу между третьим и первым квартилем (df['iqr'] = df['q75'] - df['q25']). Верхняя граница – третий квартиль плюс межкартильный размах, нижняя граница – первый квартиль минус межквартильный размах. Если значение метрики выпадает за эти пределы, то оно считается аномальным. Стоит отметить, что такие метрики, как количество лайков и просмотров, активность пользователей зачастую отличаются особым поведением в течение суток. Например, поздней ночью их значения могут быть низкими, в то время, как утром и вечером достигать своего пика. Чтобы сгладить этот эффект и избежать ложных срабатываний, я использовал скользящее среднее.
5. Наконец, составил сам DAG. В теле сформировал task и создал функцию для запуска системы алертов. Внутри функции задал параметры подключения к телеграмм-боту, написал запрос на SQL для получения значений метрик из базы данных и обозначил необходимую информацию, которая попадет в отчет с случае обнаружения аномалии (текст сообщения, значения метрик и необходимые графики). Скрипт ниже, из-за большого размера, представлен в сокращенном виде с сохранением логики и основной структуры. Полную версию вы можете посмотреть, перейдя по приложенной после статьи ссылке.
В результате получил систему алертов, которая автоматически каждые 15 минут проверяет данные на предмет аномалий, и в случае их обнаружения посылает сводный отчет в телеграмм-чат. Рутинные дела автоматизированы. Есть время подумать над следующим улучшениемJ Буду рад, если мой опыт поможет и вам.
Прилагаю ссылку на код в своем репозитории на github.