Мониторим очереди Bull при помощи lynx, Grafana, Telegraf и Influxdb

Andrey Viktorov
Sibdev
Published in
4 min readFeb 12, 2018

--

В своих проектах мы используем множество очередей 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 - оповещение, если не удалось выполнить запрос

--

--