Как я писал свой мониторинг

Решил поделиться своей историей. Может даже кому пригодится подобное бюджетное решение всем известной проблемы.

Когда я был молод и горяч и не знал, куда девать свою энергию, я решил немного пофрилансить. Мне удалось быстро набить рейтинг и я нашёл пару постоянных клиентов, которые попросили поддерживать их сервера на постоянной основе.

Первое, о чём я подумал, это необходимость мониторинга. Решил сделать как умные люди, не изобретать велосипед, а посмотреть готовые варианты, такие как Munin или Zabbix. Но сразу обнаружилось, что Web-версия требует хорошего интернет соединения, особенно если открывать впервые с телефона. Если же ты отдыхаешь на природе вдали от города, получить стабильную связь сложно. Поэтому был выбран консольный вариант мониторинга.

В качестве консольного мониторинга мне хорошо помог atop и программа для чтения логов atop’а — atopsar. Их уже упоминали на habr, atop даже разобрали, а вот про atopsar ничего почти не рассказали.

Установка

Очень простая установка, всего три команды.

#Centos

yum install atop

#Debian/Ubuntu

apt-get install atop

Далее можно настроить работу мониторинга под себя или использовать настройки по умолчанию.

#Debian/Ubuntu/Centos

/etc/default/atop 

Стандартный файл:

 #cat /etc/default/atop
INTERVAL=60                    #Время, через которое создаётся снимок нагрузки в секундах, по умолчанию каждые 10 минут
LOGPATH="/var/log/atop"        #Путь до папки хранения логов
OUTFILE="$LOGPATH/daily.log"   #Название файла логов за сегодняшний день

Добавляем в автозапуск
#Debian/Ubuntu/Centos

systemctl enable atop 

Запускаем atop как демон
#Debian/Ubuntu/Centos

systemctl start atop  

Для ленивых собрал в одну команду
#Centos

yum install atop && systemctl enable atop && systemctl start atop

#Debian/Ubuntu

apt-get install atop && systemctl enable atop && systemctl start atop

Atopsar

Вместе с atop ставится и atopsar, это удобный консольный анализатор бинарных логов, которые ведёт демон atop. Конечно можно читать логи и самим atop’ом, но это не так удобно, если требуется захватить большой интервал времени.

Небольшой ликбез по работе atopsar.

При запуске atopsar без ключей открывается лог за сегодняшний день и выводится нагрузка на каждое ядро по отдельности и строка idl по всем ядрам.

Ключи, которые я использую:

-A = вывести всю информацию из лога
= вывести информацию по нагрузки на ядра процессора, ключ по умолчанию
-m = нагрузка на оперативную память и swap
-d = дисковая активность
-O = топ-3 процессов нагрузки на CPU
-G = топ-3 процессов нагрузки на RAM
-D = топ-3 процессов нагрузки на диск
-N = топ-3 процессов нагрузки на сеть
-r = указать путь до лога, который хотите прочитать, если надо посмотреть нагрузку за прошедшие дни
-b = время, с которого начать вывод
-e = время, на котором надо закончить вывод
-M = создаёт дополнительный столбец в конце, в котором помечается критичность строки (+ есть нагрузка, * — критическая нагрузка)

Благодаря мониторингу мы сможем понять причину некорректного поведения сервера в любое время.

Уведомления

Итак, мониторинг нагрузки есть, но он всё равно не даёт возможности оперативно находить и решать проблемы. Нам нужны уведомления о возникшей проблеме.

Я один слежу за серверами, поэтому уведомлять нужно туда, где я всегда смогу это увидеть и хоть как-то на это среагировать.

В начале были SMS — быстро, надёжно, бесплатно. Но потом мобильные операторы прикрыли бесплатную SMS рассылку через свои шлюзы.
Почта — долго, могут быть проблемы с доставкой.
Мессенджеры — надо ставить на телефон, необходимо создавать ботов.

В результате поиска был выбран мессенджер Телеграмм за простоту и удобное приложение на телефоне и десктопе.

Создал своего бота с помощью botfather.
После положил на сервер несколько скриптов, отслеживающих нагрузку на сервер (IDL, smartct и др.l), наличие ошибок вида «oom killer», ошибки при создании бэкапа и другие операции, которые необходимо контролировать.

Скрипты довольно простые, написанные на bash, например, проверка LA и уведомление о превышении Load Averadge’м количества ядер на сервере.

if [ ${LA[0]} -gt 2000 ] || [ ${LA[1]} -gt 3000 ] || [ ${LA[2]} -gt 4000 ]
    then
        wget -O /dev/null "https://api.telegram.org/$bot_id:$bot_key/sendMessage?chat_id=$chat_id&text=На сервере $ip LA $LAd"
        wget -O /dev/null "https://api.telegram.org/$bot_id:$bot_key/sendMessage?chat_id=$chat_id&text=`top -b -n 1 | grep Cpu`"
        wget -O /dev/null "https://api.telegram.org/$bot_id:$bot_key/sendMessage?chat_id=$chat_id&text=Топ 5 процессов `top -b -n 1 | grep -A 5 'PID USER' | tail -5`"
    fi

Простота синтаксиса даёт очень много вариантов использования (и написать/дописать может любой, кто хоть немного владеет языком программирования).

Единственный нюанс — если сервер находится в России (и у вас нет IPv6 на сервере), то необходимо пользоваться прокси. Для этого в начале скрипта надо прописать строку подключения к прокси:

export https_proxy=http://логин:пароль@IP.адрес:порт

Это не конец

Идёшь ты себе спокойно по горам с рюкзаком за спиной, отдыхаешь от цивилизации, и тут телефон, случайно поймав связь, кидает уведомление о возникшей на твоём сервере проблеме. Что делать? Безмятежное настроение как ветром сдуло. Звонить жене и надиктовывать команды? Ха-ха!

Нужно было срочно придумать какой-то способ устранения возникших проблем быстро и без наличия хорошего интернета. Здесь меня опять спас мессенджер (#телеграммживи). Я научил своего бота общаться только со мной, игнорируя всех остальных. Теперь, вместе с уведомлением о проблеме, мне приходит немного больше данных, по которым я понимаю, кто источник проблемы, и могу попробовать ее решить удалённо. Достаточно просто написать сообщение боту, подкинуть телефон повыше, чтобы это сообщение ушло, и вуаля — бот пошёл делать твою работу. Таким образом я могу, например, убить какой-нибудь неугодный процесс, перезапустить демон, заблокировать IP и прочее.

Сюда же я перенёс будущие нужные запросы от клиентов, например, срочный сброс паролей пользователям (ибо “Аааа, мы не можем попасть на сервер, мы теряем миллионы!”), поиск пользователя, имеющего доступ в нужную папку, включение и выключение сайта и другие. Конечно же я постоянно дорабатываю функционал бота, так как фантазия клиентов подкидывает порой неожиданные и не предусмотренные мной запросы. Но основные удовлетворены.

Имеется и версия для VK, но она как-то не прижилась.

Теперь я спокойно путешествую и изучаю этот мир, не боясь, что что-то там сломается, а я не смогу об этом узнать или исправить.

Источник: habr.com