Как я научил Zabbix за своей нодой присматривать и о проблемах сообщать

Привет, Хабр!

Я сейчас работаю над проектом мессенджера на блокчейне вместе с командой своих коллег. Кому интересно — смотрите ссылки в профиле или спрашивайте в комментариях.

Блокчейн-разработка — область новая и неизведанная, поэтому порой приходится использовать очень нестандартные инструменты. Куда там микроскопу и гвоздям! Поэтому и решил вести этот блог, чтобы рассказывать разные интересные случаи из практики. Сегодняшний пост — о том, как я настроил моментальные уведомления о состоянии своей ноды, чтобы в случае чего оперативно ее возвращать к жизни.

qqtv7hpy3x3jiswfyat9zqeg8dc.jpeg

План, которого я придерживался


Задачу я себе поставил такую: при каждом выходе из строя или прекращении работы ноды мне должны приходить моментальные уведомления об этом. Мы же живем в прогрессивный век и привыкли получать всю важную информацию мгновенно, правда?

Я решил, что для осуществления этой задачи я прикручу Zabbix к Slack (он у нас рабочий инструмент проекта). Zabbix, соответственно, будет мониторить ноду и присылать сообщения о неисправностях мне в личку Slack«a.

Реализация: шаг за шагом


Шаг 1: Zabbix


Конечно же, у Zabbix нет стандартных преднастроенных средств мониторинга для нашей ноды. Поэтому первым желанием было определять доступность порта ноды, используя ключ net.tcp.listen[port].

Но есть одно «но»: случается, что нода активна, слушает на порту, но при этом функционирует неправильно. И вот тут-то я столкнулся с тем, что нужно определить основной признак работоспособности ноды.

Нода что должна делать? Правильно, расти. Вот рост и будет главным признаком. Поэтому я решил использовать ключ system.run[command, mode].

Совместно с curl -s http://127.0.0.1:36666/api/blocks/getHeight.

В результате мы получали строку формата JSON вида

{"success":true,"nodeTimestamp":XXXXXXX,"height":XXXXXXX}


На помощь в решение задачи парсинга JSON пришел пакет jq (https://stedolan.github.io/jq/). Нехитрая передача результата через пайп curl http://127.0.0.1:36666/api/blocks/getHeight | jq .height, и вместо долгожданной высоты мы получили ответ содержащий информацию о выполнении команды curl.

8aa5aw1zpzwkd8sfagshwhxe8di.png

Избыточную информацию необходимо было убирать, и тут пришел помощник — ключ -s, он же --silent. В итоге с помощью Zabbix-ключа system.run[curl -s http://127.0.0.1:36666/api/blocks/getHeight | jq .height] мы получаем высоту ноды желаемого и удобного для мониторинга вида ХХХХХХХХ.

ug0uvhe-dlzx1xbsndurogpbkyq.png

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

{ADAMANT Node Monitoring:system.run[curl -s http://127.0.0.1:36666/api/blocks/getHeight | jq .height].change()}<1


Шаг 2. Zabbix to Slack


acbm7-ojg-sbdpdyw3gt8k9gk-8.jpeg

Следующая задача — оповещать о срабатывание триггера в Slack. За основу я взял материал https://github.com/ericoc/zabbix-slack-alertscript.

Инструкция понятная, но использование смайликов для различения Severity — это не серьезно. Выделение цветовыми полосами намного интереснее. После переработки скрипта осталось это:

 url='********************************'
username='Server'

to="$1"
subject="$2"

recoversub='^RECOVER(Y|ED)?$'
if [[ "$subject" == 'Warning' ]]; then
        color='#EBFF00'
elif [ "$subject" == 'Not classified' ]; then
        color='#D8E3FF'
elif [ "$subject" == 'Information' ]; then
        color='#0049FF'
elif [ "$subject" == 'Average' ]; then
        color='#FFC200'
elif [ "$subject" == 'High' ]; then
        color='#FF5500'
elif [ "$subject" == 'Disaster' ]; then
        color='#FF0000'
else
        color='#00FF06'
fi

message="${subject} \n $3"

payload="payload={\"attachments\": [{\"color\": \"${color}\", \"text\": \"${message}\"}]}"
curl -m 5 --data-urlencode "${payload}" $url 


Выводы


В качестве морали — пара слов, почему удобный мониторинг так важен. Чем быстрее узнаешь о ситуации, тем быстрее ее исправишь и тем менее выраженными будут последствия. Как говорится, вовремя поднятое не считается упавшим. А в Slack, помимо всего прочего, есть групповые чаты, поэтому команда может подключиться к устранению проблемы и координировать действия. Кстати, у нашего проекта открытый исходный код, и мы относимся с большим уважением к другим open source проектам. Мой эксперимент в очередной раз показал, что открытый код — это хорошо.

© Habrahabr.ru