Мониторим очереди Bull при помощи lynx, Grafana, Telegraf и Influxdb
В своих проектах мы используем множество очередей Bull для всех сортов фоновых задач. Не смотря на то, что Bull достаточно надежный инструмент, периодически с ним возникают проблемы, как по его, так и по нашей вине.
Самой главной проблемой, которую мы хотели бы этим решить, является бесконтрольный рост очередей (когда очередь растет быстрее, чем разбирается, например, по причине малого числа воркеров) и отслеживание Error rate.
Поскольку Bull хранит все данные очередей в Redis, “растущая” очередь может вызвать большие проблемы, особенно на серверах с не сильно большим количеством оперативной памяти, так что о таких вещах хотелось бы узнавать быстро. Отсюда еще одно требование - алертинг.
Собирая вместе все требования:
- Мониторинг текущего размера очереди
- Отслеживания зафейленных джоб
- Алертинг (в нашем случае в Telegram)
- Простота
Для реализации всего этого безобразия я выбрал следующий стек:
- lynx для отправки метрик по протоколу statsd
- Telegraf как сервер statsd
- Influxdb для хранения метрик
- Grafana для отображения красивых дешбордов и алертинга
Telegraf, Influxdb и Grafana мы уже используем для сбора/хранения/отображения метрик, так что здесь выбор был предопределён.
Я опущу часть про установку и настройку этих трёх ребят, всё это описано в их документации достаточно подробно.
Собираем метрики
И так, посмотрим, что нам может предложить сам Bull:
- getJobCounts - показывает количество задач в очереди (в работе + в очереди)
- events - позволяет выполнять действия при наступлении одного из событий очереди
На основе этих двух вещей мы и будем получать информацию о состоянии очереди.
Изначально я хотел описать в коде всё шаги, которые нам потребуются, но в итоге просто завернул всё это безобразие в удобный npm-пакетик:
Для его использования вам понадобится настроить statsd в Telegraf и указать в конфиге Telegraf шаблон (есть в README), после чего мы можем погрузиться в удивительный мир настройки графаны.
Удивительный мир настройки графаны
Рисуем графики
Настройка графаны - тема, заслуживающая отдельной статьи. Постараюсь вкратце показать несколько вещей.
Давайте отобразим, например, общее число задач во всех очередях:
Создаем новую панель, на ней создаем график и выбираем источник данных.
Затем, делаем вот такой запрос:
Где:
bull_reporter_counts - имя “коллекции”
[!] Если вместо bull_reporter_counts у вас что-то вроде bull_reporter_counts_queue_name_waiting, настройте templates в Telegraf согласно README
metric = waiting - фильтруем по типам метрик “waiting”
sum() - функция, по которой аггрегируем данные
fill(previous) - говорит, что разрывы в графике нужно заполнять предыдущими значениями (иначе график нечитаем)
А вот так будет выглядеть запрос с выборкой по конкретной очереди:
Как видите, в выборку добавилось условие queue_name = update_subscribers_data, а так же функция сменилась на last(), потому что нас интересует только одно значение в единицу времени
Теперь чуть-чуть улучшим внешний вид графика. Во вкладке Display выставляем вот такие значения в Mode Options:
Они вляют на толщину линий и непрозрачность
Алертинг
После того, как вы собрали достаточное количество данных, чтобы точно сказать о том, когда следует бить тревогу, самое время настроить уведомления:
Открываем график и переходим на вкладку Alert.
Например, я хочу, чтобы меня оповещали, когда в одной из очередей больше 500 задач:
Переводя на русский язык:
Если максимальное значение в течение 1 минуты в запросе A больше, чем 500 - слать уведомление.
Так же два поля снизу:
If no data or all values are null - оповещение, если с сервера не приходят данные
If execution error or timeout - оповещение, если не удалось выполнить запрос