Плагин для мониторинга sleep соединений в mysql для Nagios
Подумав, я решил написать плагин для мониторинга sleep запросов в mysql для nagios. Потратив несколько часов, я это сделал. Это довольно простой скрипт, но для первого раза сойдет. Ели прийдет вдохновение ,я перепишу его и может что-то добавлю нового.
Плагин для мониторинга sleep соединений в mysql для Nagios:
# vim /usr/local/nagios/libexec/check_mysql_sleep_connections.sh
И вставляем:
#!/bin/sh
#
# Vitaliy Natarov
# vnatarov@gorillagroup.com
#
#. /usr/local/nagios/libexec/utils.sh
warn=$1
crit=$2
OUTPUT_FILE="/usr/local/nagios/var/processlist.txt"
if [ ! -f "$OUTPUT_FILE" ]; then
touch $OUTPUT_FILE
chmod 755 $OUTPUT_FILE
else
cat /dev/null > $OUTPUT_FILE
chmod 755 $OUTPUT_FILE
fi
MYSQL=`which mysql`
$MYSQL -uYour_USER -pYOUR_PW -Bse "show full processlist\G" > $OUTPUT_FILE
Total_processes=$(cat `echo $OUTPUT_FILE`|grep -E "Command:"| cut -d: -f2|wc -l)
Sleep_processes=$(cat `echo $OUTPUT_FILE`|grep -E "Command:"| cut -d: -f2| grep -E "Sleep"|wc -l)
status=$(echo "Total=$Total_processes" Sleeps=$Sleep_processes)
if (("$warn" <= "$Sleep_processes")); then
if (( "$crit" <= "$Sleep_processes" )); then
echo "CRITICAL - $status"
exit 2
else
echo "WARNING - $status"
exit 1
fi
else
echo "OK - $status"
exit 0
fi
В данном скрипте нужно изменить:
- Your_USER — на вашего пользователя в mysql;
- YOUR_PW — Пароль для указанного пользователя.
У меня он выглядит вот так (я подправил его немного для отображения графиков):
#!/bin/sh
#
# Vitaliy Natarov
# vnatarov@gorillagroup.com
#
#. /usr/local/nagios/libexec/utils.sh
warn_total=$1
crit_total=$2
warn_sleeps=$3
crit_sleeps=$4
OUTPUT_FILE="/tmp/processlist.txt"
if [ ! -f "$OUTPUT_FILE" ]; then
touch $OUTPUT_FILE
chmod 755 $OUTPUT_FILE
else
cat /dev/null > $OUTPUT_FILE
chmod 755 $OUTPUT_FILE
fi
MYSQL=`which mysql`
$MYSQL -Bse "show full processlist\G" > $OUTPUT_FILE
Total_processes=$(cat `echo $OUTPUT_FILE`|grep -E "Command:"| cut -d: -f2|wc -l)
Sleep_processes=$(cat `echo $OUTPUT_FILE`|grep -E "Command:"| cut -d: -f2| grep -E "Sleep"|wc -l)
status=$(echo "Total=$Total_processes Sleeps=$Sleep_processes | Total=$Total_processes;$1;$2;0; Sleeps=$Sleep_processes;$3;$4;0;")
if (("$warn_total" <= "$Sleep_processes")); then
if (( "$crit_total" <= "$Sleep_processes" )); then
echo "CRITICAL - $status"
exit 2
else
echo "WARNING - $status"
exit 1
fi
else
echo "OK - $status"
exit 0
fi
Я для своего localhost-а создал следующее. Открываем файл:
# vim /usr/local/nagios/etc/objects/commands.cfg
и вставил в самый конец:
define command {
command_name check_mysql_sleep_connections.sh
command_line /usr/local/nagios/libexec/check_mysql_sleep_connections.sh $ARG1$ $ARG2$
}Теперь его нужно подключить в клиенте, т.к у меня — это локалхост, то я открываю:
# vim /usr/local/nagios/etc/objects/localhost.cfg
и прописываю:
define service{
use local-service,graphed-service
host_name localhost
service_description check_mysql_sleep_connections.sh
check_command check_mysql_sleep_connections.sh!30!50
}
Где: 30 — это значение при котором будет выводиться «WARNING», а 50 -значение при котором будет выводиться «CRITICAL».
PS: Если нужно настроить данную проверку на удаленном хосте. То нужно сделать следующие действия.
На удаленном хосте открываем:
# vim /usr/local/nagios/etc/nrpe.cfg
И прописываем следующую проверку:
# mysql_sleeps_checker.sh command[mysql_sleeps_checker.sh]=/usr/local/nagios/libexec/mysql_sleeps_checker.sh!30!50
Примите во внимание, если не заработает в таком виде (!30!50), то нужно вставить эти переменные в сам скрипт:
[...] warn=30 crit=50 [...]
и тогда проверка будет иметь вид:
#mysql_sleeps_checker.sh command[mysql_sleeps_checker.sh]=/usr/local/nagios/libexec/mysql_sleeps_checker.sh
У меня:
#Custom check for Mysql Sleep queries command[check_mysql_sleep]=/usr/local/nagios/libexec/mysql_sleeps_checker.sh 50 70 20 35
После того как добавили проверку на удаленном хосте, заходим на нагиос сервер и прописываем в месте где находятся ваши клиенты следующую проверку:
# vim /usr/local/nagios/etc/clients/Some_host.cfg
Содержание:
define service {
service_description check sleep connections of MYSQL
check_command check_nrpe_custom!$_HOSTNRPE_PORT$!mysql_sleeps_checker.sh
host_name Some_host
check_period 24x7
notification_period 24x7
max_check_attempts 3
check_interval 5
retry_interval 1
first_notification_delay 0
notification_interval 30
active_checks_enabled 1
use generic-service
#contact_groups +admins
}
Перезапусаем nagios :
# service nagios restart
Все! Смотрим на проверку в веб-интерфейсе. Статья «Плагин для мониторинга sleep соединений в mysql для Nagios» завершена.
Ужас какой. Нет, идея терпимая, хоть и бесполезная (спящие процессы нужно по таймауту сбрасывать). Но я Вас умоляю: не пишите на шелле — это не Ваше.
Идея заключалась в том, чтобы мониторить sleep-ы, которые плодились из-за плохо написанного кода на PHP. Вот и все.