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

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

Первое, о чём я подумал, это необходимость мониторинга. Решил сделать как умные люди, не изобретать велосипед, а посмотреть готовые варианты, такие как 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, но она как-то не прижилась.

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

Комментарии (11)


  1. gecube
    25.05.2019 19:31

    Зачем wget, если curl'ом можно в меньшее кол-во букв и параметров уложиться? А в стандартных дистрибутивах обе утилиты есть...


    1. driveirk Автор
      26.05.2019 03:48

      Как то исторически сложилось. В принципи можно и curl-ом дёргать.


      1. keydon2
        26.05.2019 03:51

        Не во всех стандартных по дефолту curl есть.


        1. gecube
          26.05.2019 22:45

          Внезапно — ну, может кроме alpine. В Ubuntu/Centos/RedHat/Debian — обе утилиты были из коробки.


  1. pyur
    25.05.2019 21:53
    +1

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


    1. driveirk Автор
      26.05.2019 03:43

      Я это писал не для того, чтобы показать какой я крутой программист, а чтобы показать народу что можно использовать мессенджеры для мониторинга. И что это просто и не требует каких либо специфических знаний. О чём вы подтвердили. Спасибо.
      Потому что когда я искал как сделать, мне никто подобного не предлагал.
      Это статья была написана как идея для будущих свершений.


      1. keydon2
        26.05.2019 04:56

        Как то очень надуманно. К тому же заббиксу нет проблемы прикрутить нотификацию на месседжеры:
        www.zabbix.com/integrations/?cat=notifications_alerting
        В графане на телеграм алерты и вовсе из коробки.


  1. AKYLA
    26.05.2019 03:43

    Если бы хоть какие-то наброски для бота были, а то все как-то написано действительно, поверхностно.


    1. driveirk Автор
      26.05.2019 03:47

      Там же есть пример.
      Когда делаешь бота тебе дают ключ и id бота. Вставляешь их в нужное место в ссылке. И всё.
      Тебе осталось написать текст уведомления.
      Или имеется ввиду момент приёма сообщений от бота?


      1. driveirk Автор
        26.05.2019 04:19

        Приём сообщений прост, качаешь страницу, и парсишь её по id чата и всё. Это есть по ссылке на создание чат бота. Поэтому не думал что это надо описывать.


  1. M_Muzafarov
    26.05.2019 13:05

    Очередное переизобретение ChatOps? Автор сделал то, что уже давно много где используется и похвастался, как он путешествует и алюминии с телефона — довольно странная статья. Какой главный посыл тут?