Мониторинг с помощью утилиты MMonit

Мониторинг с помощью утилиты MMonit

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Мониторинг большинства служб, процессов, системных параметров и прочих вещей в жизни любого администратора.

CentOS

1
yum install monit

Dubina/Bubunta

1
apt-get install monit

Не забываем про различные пути до сервисов на разных ОС! Особенно Gentoo :D
Под каждый вид мониторинга создается отдельно файл в папке /etc/monit.d/

Все настройки производятся в файле /etc/monit.conf

1) Раскомментируем и изменим путь для записи лог-файла;

1
2
# set logfile syslog facility log_daemon      
set logfile /var/log/monit.log

2) Настроим отправку уведомлений по SMTP (для клиентских лучше использовать sendmail, чтобы не светить парольку от почты)
Для этого пишем set mailserver localhost

1
2
3
set mailserver smtp.yandex.ru port 465 
username "noreply@mail.ru" password "******"
using SSLAUTO

3) Доступы к веб-морде (лучше не использовать. Консольный вариант также удобен и понятен)

1
2
3
4
5
6
set httpd port 2812 and
use address localhost # only accept connection from localhost
allow localhost # allow localhost to connect to the server and
allow admin:123123123123 # require user 'admin' with password 'monit'
allow @monit # allow users of group 'monit' to connect (rw)
allow @users readonly # allow users of group 'users' to connect readonly

4) Время опроса демона и задержка перед опросом после запуска

1
2
set daemon  60              # проверять сервисы каждую минуту
#with start delay 240 # лучше оставить закоменченной, чтобы монит при старте инициализировал все правила

5) Кому отправлять алерты по-умолчанию (используется только в том случае, если не указан другой адрес для уведомления)

1
set alert alert@mail.ru

Список доступных оповещений

| Event| Failure state | Success state
| :————: | :————: | :————: | :————: | :————:
| ACTION| Action done | “Action done”
| CHECKSUM| “Checksum failed” | “Checksum succeeded”
| CONNECTION| “Connection failed” | “Connection succeeded”
| CONTENT| “Content failed” | “Content succeeded”
| DATA| “Data access error” | “Data access succeeded”
| EXEC| “Execution failed” | “Execution succeeded”
| FSFLAGS| “Filesystem flags failed” | “Filesystem flags succeeded”
| GID| “GID failed” | “GID succeeded”
| ICMP| “Ping failed” | “Ping succeeded”
| INSTANCE| “Monit instance changed” | “Monit instance changed not”
| INVALID| “Invalid type” | “Type succeeded”
| NONEXIST| “Does not exist” | “Exists”
| PERMISSION| “Permission failed” | “Permission succeeded”
| PID| “PID failed” | “PID succeeded”
| PPID| “PPID failed” | “PPID succeeded”
| RESOURCE| “Resource limit matched” | “Resource limit succeeded”
| SIZE| “Size failed” | “Size succeeded”
| STATUS| “Status failed” | “Status succeeded”
| TIMEOUT| “Timeout” | “Timeout recovery”
| TIMESTAMP| “Timestamp failed” | “Timestamp succeeded”
| UID| “UID failed” | “UID succeeded”
| UPTIME| “Uptime failed” | “Uptime succeeded”

Мониторинг процессов

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

Мониторинг NGINX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
check process nginx with pidfile /var/run/nginx.pid
group nginx
start program = "/etc/init.d/nginx start"
stop program = "/etc/init.d/nginx stop"
if failed host 127.0.0.1 port 80 then restart
if cpu > 60% for 2 cycles then alert
if cpu > 90% for 5 cycles then restart
if 5 restarts within 5 cycles then timeout
alert alert@mail.ru on {pid, nonexist, timeout}
with mail-format {
from: noreply@mail.ru
subject: NGINX $EVENT - $ACTION
message: This event occurred on $HOST at $DATE.
NGINX in SERVER_TEST seems down!,
Your awesome monit!
}

Мониторинг PHP-FPM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
check process php-fpm with pidfile /var/run/php-fpm/php-fpm.pid
start program = "/etc/init.d/php-fpm start"
stop program = "/etc/init.d/php-fpm stop"
if failed port 9000 type TCP then restart
if cpu > 60% for 2 cycles then alert
if cpu > 90% for 5 cycles then restart
if 5 restarts within 5 cycles then timeout
alert alert@mail.ru on {pid, nonexist, timeout}
with mail-format {
from: noreply@mail.ru
subject: PHP-FPM $EVENT - $ACTION
message: This event occurred on $HOST at $DATE.
PHP-FPM in SERVER_TEST seems down!,
Your awesome monit!
}

Мониторинг MySQL (для MariaDB отдельный конфиг)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
check process mysqld with pidfile /var/run/mysqld/mysqld.pid
group mysql
start program = "/etc/init.d/mysqld start"
stop program = "/etc/init.d/mysqld stop"
if failed host 127.0.0.1 port 3306 then restart
if cpu > 60% for 2 cycles then alert
if cpu > 90% for 5 cycles then restart
if 5 restarts within 5 cycles then timeout
alert alert@mail.ru on {pid, nonexist, timeout}
with mail-format {
from: noreply@mail.ru
subject: MySQL $EVENT - $ACTION
message: This event occurred on $HOST at $DATE.
MySQL in SERVER_TEST seems down!,
Your awesome monit!
}

Мониторинг MariaDB

Внимание!!! Если работает по сокетам, то указываем путь до каждого из них в новом файле!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
check process mysql with pidfile /var/lib/mysql/voicefree.ru.pid
group mysql
start program = "/etc/init.d/mysql start"
stop program = "/etc/init.d/mysql stop"
if failed host 127.0.0.1 port 3306 then restart
if cpu > 60% for 2 cycles then alert
if cpu > 90% for 5 cycles then restart
if 5 restarts within 5 cycles then timeout
alert alert@mail.ru on {pid, nonexist, timeout}
with mail-format {
from: noreply@mail.ru
subject: MySQL $EVENT - $ACTION
message: This event occurred on $HOST at $DATE.
MySQL in SERVER_TEST seems down!,
Your awesome monit!
}

Мониторинг HTTPD

Не стоит забывать, что порт может быть отличный от примера.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
check process httpd with pidfile /var/run/httpd/httpd.pid
group apache
start program = "/etc/init.d/httpd start"
stop program = "/etc/init.d/httpd stop"
if failed host 127.0.0.1 port 80 then restart
if cpu > 60% for 2 cycles then alert
if cpu > 90% for 5 cycles then restart
if 5 restarts within 5 cycles then timeout
alert alert@mail.ru on {pid, nonexist, timeout}
with mail-format {
from: noreply@mail.ru
subject: HTTPD $EVENT - $ACTION
message: This event occurred on $HOST at $DATE.
NGINX in SERVER_TEST seems down!,
Your awesome monit!
}

Мониторинг места на диске

Если нужно мониторить все место на диске, то вместо имени папки - пишем rootfs

1
2
check device var with path /var
if SPACE usage > 80% then alert

Мониторинг RAID-а

  1. Создаем скрипт в папке /home/scripts/
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

# Copy this file to `/usr/local/bin` and make this file executable.
# Set a cron entry for this script for 10 minutes (see `crontab` file bellow).

# The space usage limit
readonly PERCENT=90

if [ `df -h /dev/md0 | egrep -o '([[:digit:]]{1,3})%' | egrep -o '([[:digit:]]{1,3})' ` -lt PERCENT ] then
touch /var/tmp/monit_flag_raid
fi
  1. Добавляем в crontab
1
*/10 * * * * monit_raid_size > /dev/null 2>&1
  1. Добавляем конфиг в MMonit
1
2
check file raid_hdd with path /home/scripts/monit_flag_raid
if timestamp > 25 minutes then alert

Мониторинг CPU, RAM, LA хоста

1
2
3
4
5
6
7
check system voicefree.ru (ТУТ ПИШЕМ вывод команды hostname или localhost )
if memory usage > 30% then alert
if cpu usage (user) > 80% for 3 cycles then alert
if cpu usage (system) > 80% for 3 cycles then alert
if cpu usage (wait) > 20% then alert
if loadavg (1min) > 2 then alert
if loadavg (5min) > 1 then alert

Проверка и мониторинг маунтов

1
2
3
4
5
6
7
8
9
10
11
check filesystem datafs with path /dev/sdb1
start program = "/bin/mount /data"
stop program = "/bin/umount /data"
if failed permission 660 then alert
if failed uid root then alert
if failed gid disk then alert
if space usage > 80% for 5 times within 15 cycles then alert
if space usage > 99% then stop
if inode usage > 30000 then alert
if inode usage > 99% then stop
group server

Проверка привилегий для файлов, папок

1
2
3
4
check directory bin with path /bin
if failed permission 755 then alert
if failed uid 0 then alert
if failed gid 0 then alert

Мониторинг NTP

1
2
3
4
5
check process ntpd with pidfile /var/run/ntpd.pid
start program = "/etc/init.d/ntpd start"
stop program = "/etc/init.d/ntpd stop"
if failed host 127.0.0.1 port 123 type udp then alert
if 5 restarts within 5 cycles then timeout

Мониторинг Net-SNMP

1
2
3
4
5
6
check process snmpd with pidfile /var/run/snmpd.pid
start program = "/etc/init.d/snmpd start"
stop program = "/etc/init.d/snmpd stop"
if failed host 192.168.1.1 port 161 type udp then restart
if failed host 192.168.1.1 port 199 type tcp then restart
if 5 restarts within 5 cycles then timeout

Мониторинг BIND (chrooted)

1
2
3
4
5
6
check process named with pidfile /var/named/chroot/var/run/named/named.pid
start program = "/etc/init.d/named start"
stop program = "/etc/init.d/named stop"
if failed host 127.0.0.1 port 53 type tcp protocol dns then alert
if failed host 127.0.0.1 port 53 type udp protocol dns then alert
if 5 restarts within 5 cycles then timeout

Мониторинг FTP (Proftpd)

1
2
3
4
5
check process proftpd with pidfile /var/run/proftpd.pid
start program = "/etc/init.d/proftpd start"
stop program = "/etc/init.d/proftpd stop"
if failed port 21 protocol ftp then restart
if 5 restarts within 5 cycles then timeout

Мониторинг SSH

1
2
3
4
5
check process sshd with pidfile /var/run/sshd.pid
start program "/etc/init.d/sshd start"
stop program "/etc/init.d/sshd stop"
if failed port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout

Мониторинг ответа от веб-сервера

1
2
3
4
5
6
7
8
check process apache with pidfile /var/run/httpd.pid
start "/etc/init.d/httpd start"
stop "/etc/init.d/httpd stop"
if failed
host www.mail.ru port 80 and
send "GET / HTTP/1.1\r\nHost: wwww.mail.ru\r\n\r\n"
expect "HTTP/[0-9\.]{3} 200.*"
then alert

Мониторинг по заголовкам

1
2
3
4
5
6
7
check host www.mail.ru with address www.mail.ru
if failed
port 80 protocol http
with http headers [Host: www.mail.ru, Cache-Control: no-cache,
Cookie: csrftoken=nj1bI3CnMCaiNv4beqo8ZaCfAQQvpgLH]
and request /index.php with content = "hosting [0-9.]+"
then alert

Документация MMonit и пояснения по каждой функции