Не так давно возникла необходимость простого мониторинга сервисов Docker, и одним из быстрых и легковесных решений является Monit (ну кроме собственных bash-скриптов ;) ). У Monit есть достаточно хорошая и понятная документация. Monit позволяет наблюдать за процессами и файлами (включая права доступа), а также реагировать в зависимости от условий - перезапускать сервисы/отдельные процессы. Кроме этого, Monit можно настроить для мониторинга cети (TCP, UDP) и отдельных веб-ресурсов. Кроме этого существует возможность использовать Monit для тестирования скриптов/программ, проверяя их вывод. Ну и самое простое - это мониторинг системных ресурсов (загрузка процессора/памяти/итд). Однако следует помнить, что для более сложного мониторинга (для больше чем одного сервера) лучше использовать другой продукт на свой вкус.

Основным конфигурационным файлом Monit является /etc/monit/monitrc для Linux. Начальные моменты, которые нужно настроить под себя:

set daemon 120                  # Проверка всех сервисов с 2-х минутным интервалом (120s)
set alert sysadm@foo.bar        # Отправлять на ящик все уведомления
set mailserver mail.bar.baz,    # Основной почтовый сервер
    backup.bar.baz port 10025,  # Резервный почтовый сервер находится на порту 10025
    localhost                   # Если не доступны - складывать почту локально

После того, как начальные моменты настроены - можно посмотреть примеры проверки сервисов в этом же конфигурационном файле. После этого, можно создавать кастомные проверки в специально заданной директории:

include /etc/monit/conf.d/*

Кроме этого, у Monit существует web-интерфейс, он также настраивается в конфигурационном файле:

set httpd port 2812 and
    use address localhost  # Прослушиваем адрес localhost
    allow localhost        # Разрешаем подключение только для localhost
    allow admin:monit      # Используем учетные данные для входа 'admin:monit'

Основные команды

1. Просмотреть список доступных команд:

monit --help

2. Просмотреть статус Monit:

monit status

3. Просмотреть короткий статус Monit:

monit summary

Примеры конфигураций мониторинга

1. Проверка работы контейнера Docker:

  • /etc/monit/conf.d/docker_container_check
check program DOCKER_CONTAINER_NAME with path /var/scripts/check_vpn_server.sh
    if status != 0 then exec "/usr/local/bin/monit2telegram"
  • /var/scripts/check_vpn_server.sh
#!/bin/bash
sudo docker top "DOCKER_CONTAINER_NAME";
exit $?;

2. Проверка работы Postfix:

check process postfix with pidfile /var/spool/postfix/pid/master.pid
    group mail
    start program = "/etc/init.d/postfix start"
    stop  program = "/etc/init.d/postfix stop"
    if failed port 25 protocol smtp then restart
    depends on postfix_rc
check file postfix_rc with path /etc/init.d/postfix
    group mail
    if failed checksum then unmonitor
    if failed permission 755 then unmonitor
    if failed uid root then unmonitor
    if failed gid root then unmonitor

3. Проверка температуры CPU:

check program CPU with path "/usr/local/etc/monit/scripts/cpu_temp.sh"
    if status > 60 then alert
    group temperature
  • /usr/local/etc/monit/scripts/cpu_temp.sh
#!/bin/sh
TP=`/sbin/sysctl -a | grep dev.cpu.0.temperature | awk '{print substr($2,0,2)}'`
#echo $TP
exit $TP

4. Проверка работы Pi-Hole:

{% gist 42703e7c5bfe314d973de17d559d609f %}

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

Больше примеров можно найти по ссылке Real-world configuration examples.

Заключение

Если сказать кратко - Monit может помочь тогда, когда нужен простой мониторинг, без резервного мониторинга, в условиях ограниченных ресурсов. Надежность подобного решения можно усилить (в условиях ограниченности ресурсов), если использовать бесплатные сторонние сервисы мониторинга, например как:

На этом все.

Дополнительные ссылки

  1. Monit Manual
  2. Setup Monit notifications on Slack
  3. Monitoring Docker Containers with Monit
  4. monit2telegram
  5. habr - monit — наблюдатель за системными процессами
  6. Formatting output from Raspberry Pi temperature sensors