Thank you for reading this post, don't forget to subscribe!
Понадобилось мне как-то мониторить в заббиксе свободное место на сервере Oracle. Всё бы ничего, однако задача свелась к более тонкой. Нужно мониторить свободное место внутри определённого tablespace. Данную задачу можно решить с помощью SQL запроса oracle_tablespace_free_space.
SELECT trunc(sum(bytes/1024/1024/1024),0) FROM dba_free_space WHERE tablespace_name=MY_TABLESPACE';
У нас имеется:
- Сервер с БД Oracle и ОС Oracle Linux 7.4.
- На сервере стоит заббикс агент.
- Zabbix сервер 3.4.4.
- На заббиксе уже мониторится наш сервер.
Разобьём задачу на части:
- Нужно создать SQL запрос для определения свободного места внутри tablespace с названием MY_TABLESPACE.
- Разрешить пользователю zabbix, от которого работает zabbix-agent на сервере выполнять этот SQL запрос.
- Написать bash скрипт для получения числа - свободное место (в гигабайтах).
- Передать результат скрипта в zabbix-agent через пользовательскую переменную.
- Поймать на заббикс сервере это число, создать item и trigger для уведомления администратора о том, что места в tablespase осталось мало.
Пишем SQL запрос
1 2 3 |
SELECT trunc(sum(bytes/1024/1024/1024),0) FROM dba_free_space WHERE tablespace_name=MY_TABLESPACE'; |
На месте этого запроса может быть любой другой ваш запрос.
Разрешаем пользователю zabbix выполнять этот SQL запрос
В базе данных создаём юзера zabbix:
1 2 3 |
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" с содержимым:
1 2 3 4 |
Defaults:zabbix !requiretty Defaults:%zabbix !requiretty Cmnd_Alias ZABBIX_CMD = /etc/zabbix/scripts/ zabbix ALL=(oracle) NOPASSWD: ZABBIX_CMD |
В файле "/etc/sudoers" убеждаемся в наличие настроек:
1 2 3 |
Defaults requiretty #includedir /etc/sudoers.d oracle ALL=(ALL) NOPASSWD: ALL |
Отключаем selinux. В файле "/etc/selinux/config" правим:
1 2 |
#SELINUX=enforcing SELINUX=disabled |
Чтобы не перезагружать сервер, отключаем selinux командой:
setenforce 0
Пишем bash скрипт
Создаём директорию "/etc/zabbix/scripts". На всякий случай владельцем папки и содержимого я назначил пользователя oracle. Внутри папки создаём скрипт "oracle_check_tablespace.sh", не забываем дать права на выполнение. Содержимое скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/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.
На этом всё.