Настройка zabbix для мониторинга oracle

Обновлено: 05.07.2024

ODBC мониторинг соответствует типу элемента данных Монитор баз данных в веб-интерфейсе Zabbix.

Zabbix может выполнять запросы к любой базе данных, которая поддерживается ODBC. Чтобы это сделать, Zabbix не подключается напрямую к базам данных, он использует интерфейс ODBC и драйвера установленные в ODBC. Эта функция позволяет мониторить различные базы данных с различными целями с большей эффективностью - например, проверка специфичных запросов к базе данных, статистика использования и прочее. Zabbix поддерживает unixODBC, которая наиболее часто используются в реализациях ODBC API с открытым исходным кодом.

Установка unixODBC

Установка unixODBC на системы на базе RedHat/Fedora с использованием менеджера пакетов yum:

Установка unixODBC на системы на базе SUSE с использованием менеджера пакетов zypper:

Пакет unixODBC-devel требуется для компиляции Zabbix с поддержкой unixODBC.

Установка драйверов unixODBC

Установка MySQL драйвера на системы на базе SUSE с использованием менеджера пакетов zypper:

Настройка unixODBC

Настройка ODBC выполняется редактированием файлов odbcinst.ini и odbc.ini. Для проверки размещения этих файлов введите:

odbcinst.ini используется для перечисления установленных драйверов баз данных ODBC:

Атрибут Описание
mysql Имя драйвера базы данных.
Description Описание драйвера базы данных.
Driver Размещение библиотеки драйвера базы данных.

odbc.ini используется для определения источников данных:

Атрибут Описание
test Имя источника данных (DSN).
Description Описание источника данных.
Driver Имя драйвера базы данных - как указано в odbcinst.ini
Server IP/DNS сервера базы данных.
User Пользователь базы данных для подключения.
Password Пароль к базе данных.
Port Порт подключения к базе данных.
Database Имя базы данных.

Для проверки работает ли соединение ODBC корректно, подключение к базе данных необходимо протестировать. Для этого можно воспользоваться утилитой isql (включена в пакет unixODBC):

Компиляция Zabbix с поддержкой ODBC

Для включения поддержки ODBC, Zabbix должен быть скомпилирован со следующим флагом:

Смотрите более подробную информацию о установке Zabbix из исходных кодов.

Настройка элемента данных в веб-интерфейсе Zabbix

Настройка элемента данных для мониторинга базы данных:


Специально для элементов данных мониторинга баз данных вы должны указать:

Тип Выберите здесь Монитор баз данных.
Ключ Введите db.odbc.select[уникальное_описание,имя_источника_данных]
Уникальное описание будет служить идентификатором элемента данных в триггерах и тому подобном.
Имя источника данных (DSN) должно быть указано как в настройках odbc.ini.
Имя пользователя Введите имя пользователя для доступа к базе данных (опционально, если пользователь указан в odbc.ini)
Пароль Введите пароль пользователя для доступа к базе данных (опционально, если пароль указан в odbc.ini)
SQL запрос Введите необходимый SQL запрос
Тип информации Очень важно знать какой тип информации будет возвращаться указанным запросом, то есть выберите корректный тип информации здесь. С некорректным типом информации элемент данных станет неподдерживаемым.

Важные замечания

Zabbix не ограничивает время выполнения запроса. Пользователь вправе выбирать запросы, которые могут быть выполнены в разумное время. Значение параметра Timeout с Zabbix сервера используется как время ожидания подключения ODBC (обратите внимание, в зависимости от драйвера ODBC время ожидания подключения может быть проигнорировано). Если запрос возвращает более чем одну колонку, будет прочитана только первая колонка. Если запрос возвращает более чем одну строку, будет прочитана только первая строка. Команда SQL должна возвращать результирующий набор данных, как любой запрос с select … . Синтаксис запроса будет зависеть от RDBMS, которая обрабатывает эти запросы. Синтаксис запроса к хранимым процедурам должен начинаться с ключевого слова call .

image


В статье будет рассмотрена возможность мониторинга база данных по средствам встроенной в Zabbix поддержке ODBC, c использованием автообнаружения объектов.

Для начала рассмотрим доступные для Zabbix методы мониторинга БД, которые использовались до поддержки ODBC.
Так как статья про мониторинг Oracle, то и будем смотреть в этом разрезе.

1. Использования скрипта zabora

В принципе спкрипт всем хорош, но главное, что меня не устраивало: скрипт лежит на каждой машине с БД, и при добавление запроса приходилось идти на эту машину и редактировать конфиг.

Поддерживает параметры запросов, то есть можно передавать параметр в ключ и на основе его делать запрос к БД.
То есть один и то же запрос может быть использован для сбора метрик разных объектов.

Тоже хороший продукт, является демоном на java, создает несколько соединений и поддерживает автоматическое добавление новых запросов в конфиг без перезагрузки. Работает как Zabbix trapper, то есть сам с определенной периодичностью посылает данные в Zabbix сервер.

Недостатки:
— не поддерживает параметры, то есть на каждую метрику создается отдельный запрос.
Представьте у вас 10 tablespace'ов и вам нужно снимать с каждого 4 параметра — получается 40 запросов в файле. Интервал запроса получение метрики, так же выставляется в конфиге, что не очень удобно.

  • запрос к БД — стандартный ключ Zabbix, из этого следует, что мы настраиваем такие параметры как частота опроса в самом интерфейсе
  • редактирование запросов в интерфейсе Zabbix
  • позволяет использовать макросы
  • самое главное позволяет автоматизировать процесс добавления новых объектов на мониторинг

Сначала опишу, что имеется в хозяйстве:

1. 6 баз данных Oracle — 1 БД — 1 сервер + 1 резервный сервер под БД итого: получается 12 серверов.
2. Сервера для каждой БД объединены в кластер — итого 6 кластеров
3. На каждом сервера установлен Zabbix agent для AIX
4. На каждом сервере по скрипту zabora

  1. Zabbix сервер на CentOS 6.5 + TokuDB — 20 000 элементов — 380 nps (новых значений в секунду)
  2. Специально для мониторинга БД, был поднят Zabbix Proxy, так как запросы могут выполнятся достаточно долго, то не хотелось бы из-них подвешивать процессы сбора данных основного Zabbix'a — тоже CentOS 6.5 + TokuDB

В этой статье я не буду касаться настройки TokuDB, так как планирую еще одну статью почему мы перешли с InnoDB на TokuDB, и что нам это дало.

Установка Oracle Instant Client

Сначала необходимо установить Oracle Instant Client на машину с Zabbix Proxy:

  • oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm — основные библиотеки
  • oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm — драйвера для java, для нашей задачи не нужны, но в хозяйстве пригодиться :)
  • oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm — клиент SQLplus
  • oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm — библиотека для работы через ODBC
  • можно еще до кучи: oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm :)

в той папке в которую скачали все эти файлы делаем:

Настройка SQLplus для доступа к БД Oracle.

Для того чтобы клиент работал, необходимо в параметры окружение выставить необходимые переменные, для начала выставим их в своем профиле, прописав в файл $HOME/.bash_profile :


Перелогиниваемся и смотрим есть ли наши переменные в
Обратим внимание на переменную TNS_ADMIN=$ORACLE_HOME/network/admin
Этот путь необходимо создать, туда мы положим файл tnsnames.ora который используется библиотеками клиента для подключения к БД.

Создадим подключение к БД с именем TESTDB например.

Необходимо подставить нужные значения в HOST и SERVICE_NAME.
HOST — можно прописывать IP адрес или DNS имя (проверьте только, что оно ресолвится в IP)

Проверим настройку клиента, только предварительно создайте учетную запись zabbix в Oracle.

Видим, что клиент выдал приглашение, значит соединение прошло успешно, и совсем чтобы быть уверенными сделаем простенький запрос:

Конфигурация ODBC.

Официальные пакеты Zabbix Server и Zabbix Proxy в СentoOS скомпилированы с поддержкой unixODBC, поэтому после их установки у вас должен быть установленный пакет unixODBC, проверяем:
Вывод должен содержать следующие пакеты: unixODBC и oracle-instantclient11.2-odbc .


И сразу делаем такую проверку:

C большой долей вероятностью, вы получите libodbcinst.so.1 => not found , поэтому нужно сделать сим-линк:

Дальше редактируем файл:

После этого у нас должно получится подключится к БД Oracle через клиент ODBC (всегда используйте параметр -v, если будет ошибка подключения, скажет детально в чем проблема):

Так же для очистки совести, что у нас все работает, делаем запрос:


Поздравляю, Вы настроили ODBC.

Теперь нам необходимо добиться, чтобы Zabbix Proxy так же мог делать запросы через ODBC.

Для этого необходимо, чтобы в окружение процесса zabbix_proxy были доступны переменные, указанные выше, для это добавим в файл:

После этого обязательно перезапускаем zabbix_proxy:

Теперь мы сразу перейдем к настройке правил автообнаружения в терминологии Zabbix — это low level discovery rule.

Что такое LLD?
В принципе это любой элемент в Zabbix который может вернуть данные в JSON формате.
Так встроенный мониторинг баз данных в Zabbix всегда возвращает только 1 колонку и 1 строку. Почему-то в команде Zabbix до сиз пор не напишут для БД генератор LLD.

Придется написать скрипт который будет выдавать нам список объектов в JSON формате.

Шаблон и скрипт можно взять на GitHub

Скрипт написан на php, поэтому любителям bash прошу отвернуться в сторону :)
Комментировать сам скрипт не буду, думаю по коду все понятно, скажу только, что его нужно положить в папку которая задана в конфиге zabbix_proxy.conf (или zabbix_server.conf):

Скрипту передаются два параметра:
1. DSN — который вы указали в файле /etc/odbc.ini в квадратных скобках, в случае примера это ORA_TESTDB
2. тип объектов, список которых нужно вернуть: tablespaces или jobs

В случае jobs, скрипт вернет так же и , то есть владельца job'a.

Наконец-то переходим к добавлению мониторинга БД Oracle в Zabbix.

Для начала пару слов о шаблоне:
1. общие ключи мониторинга Oracle взяты из скрипта zabora
2. чтобы шаблона заработал необходимо во вкладе Макросы самого хоста, добавить 3 пользовательских макроса:
— — DSN который прописан в квадратных скобках файла /etc/odbc.ini (в примере ORA_TESTDB)
— — пользователь с правами которого будет подключение к БД Oracle
— — пароль для подключения к БД Oracle




Итак список правил LLD:

Чтобы правила отработали в первый раз, выставите в самих правила интервал, предположим 300 секунд, и через 5 минут у вас в элементах данных должны создаться новые.


Рассмотри сами правила и начнем с Tablespaces.

В принципе здесь все понятно, хочу обратить внимание на поле «Фильтр».
С помощью этого поля можно производить фильтрацию списка который возвращает нам сам элемент, в нашем примере нам не нужно добавлять на мониторинг системные tablespaces. Фильтрация происходит на основе правила regexp. Как видно на картинки поле должно соответствовать правилу regexp Oracle System Excluded Tablespaces. Общие правила regexp описываются в Администрирование > Общие > Регулярные выражения и вызываются в фильтре через символ @.


Аналогично все и для job'ов:


Переходим к прототипам данных



Сам прототип

Картинка говорит сама за себя, но хочу обратить на один нюанс, а именно на поле «Единица измерения», по умолчанию в Zabbix используется 10-тичная система исчисления, что и следовало ожидать, поэтому все приставки Кило, Мега, Гига и т.д. это деление на 1000, что с точки зрения исчисления объема данных не совсем корректно, поэтому чтобы вы получали во вкладке «Последние данные» адекватные значения в Zabbix используется «специальные» единицы измерения: B и Bps — байт и байт в секунду (подробнее).
Но есть забавный момент (баг), в последних данных приставки K(ilo), M(ega), G(iga) переводятся в K, М, Г, а вот сама единица нет, поэтому в случае с гигабайтами у Ваc будет ГB.


Прототипы триггеров для tablespaces:

  • при размере меньше 3ТБ ограничение в процентах
  • от 3ТБ до 10ТБ в гигабайтах
  • от 10ТБ в гигабайтах

Обратить внимание, что значения в условиях используется в байтах, а также обратить на порядок и используемых значений.
На первый взгляд может показаться лишним условие «Максимальный размер > 0»

Но это сделано для того чтобы приходило более информативное письмо для DBA.
В действиях вы указываете:


В действие мы не можем получить значения ключа который был создан автоматически, не то чтобы мы не можем его получить просто мы не знаем его название, для это там нужно вычленить из ключа название tablespace, но таких функций Zabbix нет.

При таких настройках действия, Вам будет приходить нечто подобное:



Прототипы данных для job'ов:


Прототипы триггеров для job'ов:

Понадобилось мне однажды мониторить в заббиксе свободное место на сервере Oracle. Всё бы ничего, однако простая задача усложнилась. Нужно мониторить свободное место внутри определённого tablespace. Данную задачу можно решить с помощью SQL запроса:

Осталось только научиться передавать результат 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 запрос уже есть

На месте этого запроса может быть любой другой ваш запрос.

Разрешаем пользователю 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" убеждаемся в наличие настроек:

Отключаем selinux. В файле "/etc/selinux/config" правим:

Чтобы не перезагружать сервер, отключаем selinux командой:

Пишем bash скрипт

Создаём директорию "/etc/zabbix/scripts". На всякий случай владельцем папки и содержимого я назначил пользователя oracle. Внутри папки создаём скрипт "oracle_check_tablespace.sh", не забываем дать права на выполнение. Содержимое скрипта:

Весь смысл скрипта состоит в том, чтобы от имени zabbix выполнить SQL, почистить его от лишних данных и вывести как число. В случае ошибки выводим "-1". Вместо "my_password", "my_database", "MY_TABLESPACE" установите свои значения.

Пользовательская переменная

В файле "/etc/zabbix/zabbix_agentd.conf" смотрим, где находятся пользовательские настройки:

В этой папке создаем файл "oracle.conf" с содержимым:

Zabbix-server

Дальше идём в web-интерфейс заббикс сервера, находим там наш хост (сервер) и добавляем новый item:

В поле Key вписываем нашу переменную. В поле Type information временно ставим text. В скрипте oracle_check_tablespace .sh временно комментируем проверку на число и занимаемся отладкой. Если у заббикс-агента не хватает прав на sudo, то видим ошибку:

Определяем переменные того пользователя, под кем будем настраивать и проверять.

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib64:$LD_LIBRARY_PATH

Перелогиниваемся и смотрим есть ли наши переменные в

Создадим директорию, где будет находится файл для подключения

создаем сам файл подключения

Проверяем подключение, предполагается, что у вас в oracle уже есть УЗ с именем zabbix и паролем, который вы определили

Oracle Database 11g Enterprise Edition Release 11.2 . 0.4 . 0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,

выполним простеший запрос

Oracle Database 11g Enterprise Edition Release 11.2 . 0.4 . 0 - 64bit Production

Убедимся, что у нас стоят необходимые компоненты

Нас интересуют, чтобы были установлены

Теперь поправим файл /etc/odbcinst.ini добавив туда путь до ораклового драйвера

вставляем в самый конец

проверим, что все зависимости корректны выполнив ldd и нет not found зависимостей, на которые ссылаются в других статьях

ldd: warning: you do not have execution permission for `/usr/lib/oracle/ 12.2 /client64/lib/libsqora.so. 12.1 ' libpthread.so. 0 => /usr/lib64/libpthread.so. 0 ( 0x00007f98e30fc000 ) libnsl.so. 1 => /usr/lib64/libnsl.so. 1 ( 0x00007f98e2ee3000 ) libaio.so. 1 => /usr/lib64/libaio.so. 1 ( 0x00007f98e2ad8000 ) libresolv.so. 2 => /usr/lib64/libresolv.so. 2 ( 0x00007f98e28be000 ) libclntsh.so. 12.1 => /usr/lib/oracle/ 12.2 /client64 //lib/libclntsh.so.12.1 (0x00007f98dee18000) libclntshcore.so. 12.1 => /usr/lib/oracle/ 12.2 /client64 //lib/libclntshcore.so.12.1 (0x00007f98de84a000) libodbcinst.so. 2 => /usr/lib64/libodbcinst.so. 2 ( 0x00007f98de638000 ) libgcc_s.so. 1 => /usr/lib64/libgcc_s.so. 1 ( 0x00007f98de05e000 ) libmql1.so => /usr/lib/oracle/ 12.2 /client64 //lib/libmql1.so (0x00007f98ddde7000) libipc1.so => /usr/lib/oracle/ 12.2 /client64 //lib/libipc1.so (0x00007f98dd9b3000) libnnz12.so => /usr/lib/oracle/ 12.2 /client64 //lib/libnnz12.so (0x00007f98dd26a000) libons.so => /usr/lib/oracle/ 12.2 /client64 //lib/libons.so (0x00007f98dd01c000) libltdl.so. 7 => /usr/lib64/libltdl.so. 7 ( 0x00007f98dce11000 )

После этого у нас должно получится подключится к БД Oracle через клиент ODBC (всегда используйте параметр -v, если будет ошибка подключения, скажет детально в чем проблема):

Так же для очистки совести, что у нас все работает, делаем запрос:

| Oracle Database 11g Enterprise Edition Release 11.2 . 0.4 . 0 - 64bit Production |

В болшьшинсве статей, содержиться не актуальная информация для настройки для centos 6. Для настройки Centos 7, нужно выполнить другие шаги, приступим

Создадим файл, который укажет на переменно окружение для zabbix-proxy

sudo nano /etc/systemd/system/zabbix-proxy.service.d/environment.conf

внутрь добавляем 2 строчки

Теперь создадим сам файл с переменными

внутрь, вставляем уже абсолютные пути и без экспорта переменных

LD_LIBRARY_PATH=/usr/lib/oracle/ 12.2 /client64/lib:/usr/lib64:$LD_LIBRARY_PATH

теперь перечитываем настройки рестартим прокси

После чего, осталось сделать какой либо простейший запрос с сервера, чтобы убедится что все работает

преполагается, что создавать шаблоны или хотябы создавать item для сервера вы умеет.

для проверки, будем использовать самый простеший запрос

После добавления, прокся может подтупливать, если хочется убедится сразу, хорошо помогает, если ее рестартануть

и в сервере в разделе Monitoring→latest data для вашего сервера, для которого вы делали уведем

Читайте также: