СКАЧАТЬ Низкоуровневое обнаружения (LLD)
Zabbix агент
монитор базы данных
Пользовательский скрипт
# mysbix
Zabbix Agent - MySQL
* Репликация: Мастер и Ведомый
# Зависимости
## Пакеты
* ksh
* jq
### Debian/Ubuntu
apt install ksh jq
## MySQL Конфигурация
cat /etc/zabbix/scripts/agent/mysbix/.my.cnf
[client]
user = "monitor"
password = "xxxxx"
# Разработчик
## Zabbix
#~ git clone https://github.com/sergiotocalini/mysbix.git
#~ ./mysbix/deploy_zabbix.sh 'monitor' 'xxxxxx' 'localhost'
zabbix_agentd.conf > UserParameter
UserParameter=mysbix[*],/etc/zabbix/scripts/agentd/mysbix/mysbix.sh -s $1 -a p=$2 -a p=$3 -a p=$4 -a p=$5
UserParameter=mysbix.discovery[*],/etc/zabbix/scripts/agentd/mysbix/mysbix.sh -s $1 -j $2 -a p=$3
UserParameter=mysbix.version,/etc/zabbix/scripts/agentd/mysbix/mysbix.sh -v short
my.conf
[client]
user = monitor
password = xxxxxxx
host = localhost
Скрипт mysbix.sh
Код: Выделить всё
#!/usr/bin/env ksh
PATH=/usr/local/bin:${PATH}
IFS_DEFAULT="${IFS}"
#################################################################################
#################################################################################
#
# Variable Definition
# ---------------------
#
APP_NAME=$(basename $0)
APP_DIR=$(dirname $0)
APP_VER="1.0.0"
APP_WEB="http://www.sergiotocalini.com.ar/"
#
#################################################################################
#################################################################################
#
# Load Oracle Environment
# -------------------------
#
[ -f ${APP_DIR}/${APP_NAME%.*}.conf ] && . ${APP_DIR}/${APP_NAME%.*}.conf
#
#################################################################################
#################################################################################
#
# Function Definition
# ---------------------
#
usage() {
echo "Usage: ${APP_NAME%.*} [Options]"
echo ""
echo "Options:"
echo " -a Query arguments."
echo " -h Displays this help message."
echo " -j Jsonify output."
echo " -s ARG(str) Query to MySQL."
echo " -v Show the script version."
echo ""
echo "Please send any bug reports to sergiotocalini@gmail.com"
exit 1
}
version() {
echo "${APP_NAME%.*} ${APP_VER}"
exit 1
}
zabbix_not_support() {
echo "ZBX_NOTSUPPORTED"
exit 1
}
vert2json() {
sql="${1}"
attrs="${2:-.[]}"
json_raw=""
idx="${#rows[@]}"
while read line; do
if [[ "${line}" =~ ^\* ]]; then
pos=${idx}
let "idx=idx+1"
else
key=`echo ${line}|awk -F: '{print $1}'|awk '{$1=$1};1'`
val=`echo ${line}|awk -F: '{print $2}'|awk '{$1=$1};1'`
rows[${pos}]+="\"${key}\":\"${val}\","
fi
done <<< "${sql}"
json_raw="[ "
for idx in ${!rows[@]}; do
json_raw+="{${rows[${idx}]%?}},"
done
echo "${json_raw%?} ]" | jq -r "${attrs}" 2>/dev/null
}
sql_exec() {
sql=${1}
sql_args=( ${2} )
sql_opts=${3}
if [[ -f "${sql%.sql}.sql" ]]; then
count=1
for arg in ${sql_args[@]}; do
params+="SET @p${count}=\"${arg}\";"
let "count=count+1"
done
rval=`mysql --defaults-file=${APP_DIR}/.my.conf \
-s${sql_opts:-N}e "${params}source ${SQL%.sql}.sql;" 2>/dev/null`
echo "${rval}"
return 0
fi
return 1
}
join() {
delimiter=${1}
shift
array=( ${@} )
length=$(( ${#array[@]} - 1 ))
for idx in ${!array[@]}; do
if [[ ${array[${idx}]} != '' && ${array[${idx}]} != ${delimiter} ]]; then
str+="${array[${idx}]}"
if [[ ${idx} < ${length} ]]; then
str+="${delimiter}"
fi
fi
done
echo "${str}"
}
#
#################################################################################
#################################################################################
while getopts "s::a:q:s:uphvj:" OPTION; do
case ${OPTION} in
h)
usage
;;
s)
SQL="${APP_DIR}/sql/${OPTARG}"
;;
o)
OUTPUT="${OPTARG}"
;;
j)
JSON=1
IFS=":" JSON_ATTR=( ${OPTARG-:0} )
IFS="${IFS_DEFAULT}"
;;
a)
param=${OPTARG//p=}
[[ -n ${param} ]] && ARGS[${#ARGS[*]}]=${param}
;;
v)
version
;;
\?)
exit 1
;;
esac
done
if [[ `basename ${SQL%.sql}` =~ replication_(masters|slaves) ]]; then
rval=$( sql_exec "${SQL}" "" "E" )
[ ${?} != 0 ] && zabbix_not_support
if [[ -n ${rval} ]]; then
if [[ ${#ARGS[*]} > 0 ]]; then
for arg in ${ARGS[@]}; do
key=`echo ${arg}|awk -F: '{print $1}'|awk '{$1=$1};1'`
val=`echo ${arg}|awk -F: '{print $2}'|awk '{$1=$1};1'`
if [[ -n ${key} && -n ${val} ]]; then
selec[${#selec[@]}]=".${key}==\"${val}\""
else
attrs[${#attrs[@]}]="\(.${arg})"
fi
done
filters[${#filters[@]}]=".[]"
[[ ${#selec[*]} > 0 ]] && filters[${#filters[@]}]="select($( join " and" ${selec[@]} ))"
[[ ${#attrs[*]} > 0 ]] && filters[${#filters[@]}]="\"$( join " | " ${attrs[@]:-'\(.)'} )\""
filters=$( join "|" ${filters[@]} )
elif [[ `basename ${SQL%.sql}` == 'replication_masters' ]]; then
if [[ ${JSON} -eq 1 ]]; then
filters=".[] | \"\(.Master_Host)|\(.Master_Port)|\(.Master_Server_Id)|\(.Master_UUID)\""
else
filters=".[] | {Master_Host, Master_Port, Master_Server_Id, Master_UUID}"
fi
elif [[ `basename ${SQL%.sql}` == 'replication_slaves' ]]; then
if [[ ${JSON} -eq 1 ]]; then
filters=".[] | \"\(.Host)|\(.Port)|\(.Server_id)|\(.Slave_UUID)|\(.Master_id)\""
else
filters=".[] | {Host, Port, Server_id, Slave_UUID, Master_id}"
fi
fi
rval=$( vert2json "${rval}" "${filters}" )
fi
else
rval=$( sql_exec "${SQL}" "${ARGS[*]}" )
[ ${?} != 0 ] && zabbix_not_support
if [[ `basename ${SQL%.sql}.sql` =~ (global_status|global_variables) ]]; then
rval=`echo ${rval} | sed -s "s:^${ARGS[0]} ::"`
fi
fi
if [[ ${JSON} -eq 1 ]]; then
echo '{'
echo ' "data":['
count=1
while read line; do
if [[ ${line} != '' ]]; then
IFS="|" values=(${line})
output='{ '
for val_index in ${!values[*]}; do
output+='"'{#${JSON_ATTR[${val_index}]:-${val_index}}}'":"'${values[${val_index}]}'"'
if (( ${val_index}+1 < ${#values[*]} )); then
output="${output}, "
fi
done
output+=' }'
if (( ${count} < `echo ${rval}|wc -l` )); then
output="${output},"
fi
echo " ${output}"
fi
let "count=count+1"
done <<< ${rval}
echo ' ]'
echo '}'
else
echo "${rval:-0}"
fi
exit ${rcode}
Скрипт deploy_zabbix.sh
Код: Выделить всё
#!/usr/bin/env ksh
SOURCE_DIR=$(dirname $0)
ZABBIX_DIR=/etc/zabbix
MYSQL_USER=${1:-monitor}
MYSQL_PASS=${2}
MYSQL_HOST=${3:-localhost}
mkdir -p ${ZABBIX_DIR}/scripts/agentd/mysbix
SCRIPT_AUTH="${ZABBIX_DIR}/scripts/agentd/mysbix/.my.conf"
[[ -f ${SCRIPT_AUTH} ]] && SCRIPT_AUTH="${SCRIPT_AUTH}.new"
SCRIPT_CONFIG="${ZABBIX_DIR}/scripts/agentd/mysbix/mysbix.conf"
[[ -f ${SCRIPT_CONFIG} ]] && SCRIPT_CONFIG="${SCRIPT_CONFIG}.new"
cp -rv ${SOURCE_DIR}/mysbix/mysbix.sh ${ZABBIX_DIR}/scripts/agentd/mysbix/
cp -rv ${SOURCE_DIR}/mysbix/sql ${ZABBIX_DIR}/scripts/agentd/mysbix/
cp -rv ${SOURCE_DIR}/mysbix/zabbix_agentd.conf ${ZABBIX_DIR}/zabbix_agentd.d/mysbix.conf
cp -rv ${SOURCE_DIR}/mysbix/.my.conf ${SCRIPT_AUTH}
cp -rv ${SOURCE_DIR}/mysbix/mysbix.conf.example ${SCRIPT_CONFIG}
regex_array[0]="s|host = .*|host = \"${MYSQL_HOST}\"|g"
regex_array[1]="s|user = .*|user = \"${MYSQL_USER}\"|g"
regex_array[2]="s|password = .*|password = \"${MYSQL_PASS}\"|g"
for index in ${!regex_array[*]}; do
sed -i "${regex_array[${index}]}" ${SCRIPT_AUTH}
done
mysql -sNe "CREATE USER IF NOT EXISTS '${MYSQL_USER}'@'${MYSQL_HOST}' IDENTIFIED BY '${MYSQL_PASS}';"
mysql -sNe "GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '${MYSQL_USER}'@'${MYSQL_HOST}';"
db_count.sql
Код: Выделить всё
SELECT COUNT(*)
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME
NOT IN ('mysql', 'performance_schema', 'information_schema', 'sys');
Код: Выделить всё
SHOW DATABASES;
Код: Выделить всё
SELECT Sum(data_length + index_length)
FROM information_schema.tables
WHERE table_schema=@p1
GROUP BY table_schema;
Код: Выделить всё
SHOW GLOBAL STATUS WHERE variable_name=@p1;
Код: Выделить всё
SHOW GLOBAL VARIABLES WHERE variable_name=@p1;
Код: Выделить всё
SELECT 1;
Код: Выделить всё
SHOW SLAVE STATUS\G;
Код: Выделить всё
SHOW SLAVE HOSTS\G;
Код: Выделить всё
SELECT VERSION();
Template DB MySQL Mysbix RUS
Группы элементов данных 1
MySQL
Элементы данных 34
[MySQL] Глобальный статус: Прерванные клиенты mysbix[global_status, Aborted_clients] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Прерванные соединения mysbix[global_status, Aborted_connects] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Получено байт (в секунду) mysbix[global_status, Bytes_received] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Отправленные байты (в секунду) mysbix[global_status, Bytes_sent] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Операции - Начаты mysbix[global_status, Com_begin] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Операции - Фиксация mysbix[global_status, Com_commit] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Операции - Удалить mysbix[global_status, Com_delete] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Операции - Вставить mysbix[global_status, Com_insert] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Операции - Отброс mysbix[global_status, Com_rollback] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Операции - Выберите mysbix[global_status, Com_select] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Операции - Обновление mysbix[global_status, Com_update] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный Статус: Созданы Таблицы Временные - Диска mysbix[global_status, Created_tmp_disk_tables] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Созданы Временные файлы mysbix[global_status, Created_tmp_files] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный Статус: Созданы Временные - Таблицы mysbix[global_status, Created_tmp_tables] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный Статус: Ключевые Блоки - Не Сброшены mysbix[global_status, Key_blocks_not_flushed] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Ключевые блоки - Неиспользуемые mysbix[global_status, Key_blocks_unused] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Ключевые блоки - Используются mysbix[global_status, Key_blocks_used] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Ключевые блоки - Warm mysbix[global_status, Key_blocks_warm] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Считывание ключей mysbix[global_status, Key_reads] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Запросы на чтение ключей mysbix[global_status, Key_read_requests] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Запись ключей mysbix[global_status, Key_writes] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Запросы на запись ключей mysbix[global_status, Key_write_requests] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Запросы в секунду mysbix[global_status, Questions] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Медленные запросы mysbix[global_status, Slow_queries] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Блокировка таблиц - Сразу mysbix[global_status, Table_locks_immediate] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Блокировки таблиц - Ожидание mysbix[global_status, Table_locks_waited] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Потоки - Кэшированы mysbix[global_status, Threads_cached] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Потоки подключены mysbix[global_status, Threads_connected] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Потоки созданы mysbix[global_status, Threads_created] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Потоки запущены mysbix[global_status, Threads_running] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальный статус: Время безотказной работы mysbix[global_status, Uptime] 10m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Глобальные переменные: UUID сервера mysbix[global_variables, server_uuid] 12h 30d Zabbix агент MySQL Активировано
[MySQL] Общий: Статус Триггеры 1 mysbix[ping] 1m 30d 90d Zabbix агент MySQL Активировано
[MySQL] Общие: Версия mysbix[version] 12h 30d Zabbix агент MySQL Активировано
Триггеры 1
Средняя MySQL: Экземпляр не работает {Template DB MySQL Mysbix RUS:mysbix[ping].last(#3)}=0 Активировано
Графики 8
[MySQL] Глобальный статус: Созданы Временные файлы/Таблицы 900 200 Нормальный
[MySQL] Глобальный статус: Пропускная способность 900 200 Нормальный
[MySQL] Глобальный статус: Прерванные клиенты/Подключения 900 200 Нормальный
[MySQL] Глобальный статус: Потоки 900 200 Нормальный
[MySQL] Глобальный статус: Операции 900 200 Нормальный
[MySQL] Глобальный статус: Ключи - Чтение/Запись 900 200 Нормальный
[MySQL] Глобальный статус: Ключевые блоки 900 200 Нормальный
[MySQL] Глобальный статус: Блокировки таблиц 900 200 Нормальный
Правила обнаружения 3
[MySQL] Обнаружение: Базы данных Прототипы элементов данных 1 Прототипы триггеров Прототипы графиков 1 Прототипы узлов сети mysbix.discovery[db_list, DBNAME] 12h Zabbix агент Активировано
[MySQL] Обнаружение: Мастера репликации Прототипы элементов данных 7 Прототипы триггеров 2 Прототипы графиков Прототипы узлов сети mysbix.discovery[replication_masters, MASTER_HOST:MASTER_PORT:MASTER_ID:MASTER_UUID] 1m Zabbix агент Активировано
[MySQL] Обнаружение: Подчиненные устройства репликации Прототипы элементов данных 3 Прототипы триггеров Прототипы графиков Прототипы узлов сети mysbix.discovery[replication_slaves, SLAVE_HOST:SLAVE_PORT:SLAVE_ID:SLAVE_UUID:MASTER_ID] 1m Zabbix агент Активировано
Прототипы элементов данных 1
[MySQL] База данных {#DBNAME}: Размер mysbix[db_size, {#DBNAME}] 15m 30d 90d Zabbix агент MySQL Да
Прототипы графиков 1
[MySQL] База данных {#DBNAME}: Размер 900 200 Нормальный
Прототипы элементов данных 7
[MySQL] Мастер репликации "{#MASTER_HOST}": Потеря пакетов (%) icmppingloss[{#MASTER_HOST},10,100,,] 10m 1w 90d Простая проверка MySQL Да
[MySQL] Мастер репликации "{#MASTER_HOST}": Главный файл журнала mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Master_Log_File] 10m 30d Zabbix агент MySQL Да
[MySQL] Мастер репликации "{#MASTER_HOST}": Идентификатор мастера mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Master_Server_Id] 12h 30d Zabbix агент MySQL Да
[MySQL] Мастер репликации "{#MASTER_HOST}": Главный UUID mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Master_UUID] 12h 30d Zabbix агент MySQL Да
[MySQL] Мастер Репликации "{#MASTER_HOST}": Отставание от Мастера на Несколько Секунд mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Seconds_Behind_Master] 5m 30d 90d Zabbix агент MySQL Да
[MySQL] Мастер репликации "{#MASTER_HOST}": Запущен подчиненный ввод-вывод mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Slave_IO_Running] 5m 30d 90d Zabbix агент MySQL Да
[MySQL] Мастер репликации "{#MASTER_HOST}": Запущенный подчиненный SQL mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Slave_SQL_Running] 5m 30d 90d Zabbix агент MySQL Да
Прототипы триггеров 2
Высокая MySQL:Мастер репликации "{#MASTER_HOST}" не запущен {Template DB MySQL Mysbix RUS:mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Slave_IO_Running].last(#3)}=0 or {Template DB MySQL Mysbix RUS:mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Slave_SQL_Running].last(#3)}=0 Да
Средняя MySQL:Мастер репликации "{#MASTER_HOST}" не синхронизируется {Template DB MySQL Mysbix RUS:mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Seconds_Behind_Master].min(#3)} > {Template DB MySQL Mysbix RUS:mysbix[replication_masters, Master_Server_Id:{#MASTER_ID}, Seconds_Behind_Master].max(1h)} Да
Прототипы элементов данных 3
[MySQL] Подчиненное устройство репликации "{#SLAVE_HOST}": Идентификатор ведущего устройства mysbix[replication_slaves, Server_id:{#SLAVE_ID}, Master_id] 12h 30d Zabbix агент MySQL Да
[MySQL] Подчиненное устройство репликации "{#SLAVE_HOST}": ИДЕНТИФИКАТОР mysbix[replication_slaves, Server_id:{#SLAVE_ID}, Server_id] 12h 30d Zabbix агент MySQL Да
[MySQL] Подчиненное устройство репликации "{#SLAVE_HOST}": UUID mysbix[replication_slaves, Server_id:{#SLAVE_ID}, Slave_UUID] 12h 30d Zabbix агент MySQL Да