Понадобилось мне как-то мониторить в заббиксе свободное место на сервере Oracle. Всё бы ничего, однако задача свелась к более тонкой. Нужно мониторить свободное место внутри определённого tablespace. Данную задачу можно решить с помощью SQL запроса oracle_tablespace_free_space. Осталось только научиться передавать результат SQL запроса в Zabbix.
Приступим. У нас имеется:
- Сервер с БД Oracle и ОС Oracle Linux 7.4.
- На сервере стоит заббикс агент.
- Zabbix сервер 3.4.4.
- На заббиксе уже мониторится наш сервер.
Разобьём задачу на части:
- Нужно создать SQL запрос для определения свободного места внутри tablespace с названием MY_TABLESPACE.
- Разрешить пользователю zabbix, от которого работает zabbix-agent на сервере выполнять этот SQL запрос.
- Написать bash скрипт для получения числа - свободное место (в гигабайтах).
- Передать результат скрипта в zabbix-agent через пользовательскую переменную.
- Поймать на заббикс сервере это число, создать item и trigger для уведомления администратора о том, что места в tablespase осталось мало.
Пишем SQL запрос
SELECT trunc(sum(bytes/1024/1024/1024),0)
FROM dba_free_space
WHERE tablespace_name=MY_TABLESPACE';
На месте этого запроса может быть любой другой ваш запрос.
Разрешаем пользователю Zabbix выполнять этот SQL запрос
В базе данных создаём юзера zabbix:
CREATE USER zabbix IDENTIFIED BY "my_password";
GRANT CREATE SESSION to zabbix;
GRANT SELECT ON dba_free_space TO zabbix;
Где "my_password" - пароль пользователя. Возможно, ещё какие-то права понадобятся, не помню.
В папке "/etc/sudoers.d" создаем файл "zabbix" с содержимым:
Defaults:zabbix !requiretty
Defaults:%zabbix !requiretty
Cmnd_Alias ZABBIX_CMD = /etc/zabbix/scripts/
zabbix ALL=(oracle) NOPASSWD: ZABBIX_CMD
В файле "/etc/sudoers" убеждаемся в наличие настроек:
Defaults requiretty
#includedir /etc/sudoers.d
oracle ALL=(ALL) NOPASSWD: ALL
Отключаем selinux. В файле "/etc/selinux/config" правим:
#SELINUX=enforcing
SELINUX=disabled
Чтобы не перезагружать сервер, отключаем selinux командой:
setenforce 0
Пишем bash скрипт
Создаём директорию "/etc/zabbix/scripts". На всякий случай владельцем папки и содержимого я назначил пользователя oracle. Внутри папки создаём скрипт "oracle_check_tablespace.sh", не забываем дать права на выполнение. Содержимое скрипта:
#!/bin/bash
. /home/oracle/.bash_profile
justconnect(){
sqlplus -s -L zabbix/"my_password"@my_database << SQL
set echo off;
set tab off;
set pagesize 0;
set feedback off;
set trimout on;
set heading off;
SELECT trunc(sum(bytes/1024/1024/1024),0)
FROM dba_free_space
WHERE tablespace_name='MY_TABLESPACE';
SQL
}
RESULT=$( justconnect );
#убираем пробелы
RESULT=`(echo ${RESULT} | fmt -su)`
#проверяем на число и точки
if [[ "${RESULT}" =~ ^[0-9\.]+$ ]]; then
:
else
RESULT="-1"
fi
echo $RESULT;
exit 0;
Весь смысл скрипта состоит в том, чтобы от имени zabbix выполнить SQL, почистить его от лишних данных и вывести как число. В случае ошибки выводим "-1". Вместо "my_password", "my_database", "MY_TABLESPACE" установите свои значения.
Пользовательская переменная
В файле "/etc/zabbix/zabbix_agentd.conf" смотрим, где должны лежать пользовательские настройки:
Include=/etc/zabbix/zabbix_agentd.d/
В этой папке создаем файл "oracle.conf" с содержимым:
UserParameter=oracle.check_tablespace,sudo -u oracle '/etc/zabbix/scripts/oracle_check_tablespace.sh'
Так мы создаём параметр oracle.check_tablespace и данные для него берём командой sudo -u oracle '/etc/zabbix/scripts/oracle_check_tablespace.sh'.
Zabbix-server
Дальше идём в web-интерфейс заббикс сервера, находим там наш хост (сервер) и добавляем новый item:
В поле Key вписываем нашу переменную. В поле Type information временно ставим text. В скрипте oracle_check_tablespace .sh временно комментируем проверку на число и занимаемся отладкой. Если у заббикс-агента не хватает прав на sudo, то видим ошибку:
Ошибка может быть и другая. После исправления всех ошибок видим искомое:
Ура! В tablespace 175 гигабайт свободного места. В скрипте oracle_check_tablespace .sh возвращаем проверку на число. Правим item:
- Update interval ставим не такой частый, я ставлю себе 1h.
- Type of information теперь Numeric (unsigned)
- Units - GB
Стал появляться график:
Вот теперь можно написать триггеры, которые будут срабатывать при критическом уменьшении свободного места. Например, warning при свободном месте менее 40 Гб и average при значениях меньше 20.
На этом всё.