Zabbix-моніторинг даних в БД Oracle без unixODBC

Було поставлено завдання: реалізувати моніторинг БД Oracle засобами Zabbix, а саме — відслідковувати параметри табличних просторів на певному инстансе. Завдання поставлено, значить робимо. Як відомо, Zabbix надає можливість через визначений тип даних здійснювати запити до баз даних і отримувати результат запиту. На офіційному сайті розробників Zabbix є дуже хороша документація про налаштування ODBC-моніторингу.

image
У нас сервер Zabbix 3.0.4 під управлінням Centos 7. Раніше ODBC моніторинг не був налаштований, а отже, потрібно відкривати інструкції і починати установку і налаштування.

Згідно інструкції з офіційного сайту Zabbix був встановлений пакет unixODBC. Так як UnixODBC-драйвер для Oracle триальный, а бюджет під цю задачу не виділяли, було прийнято рішення — шукати інший спосіб. Перелопативши купу сайтів з інструкціями установки клієнта Oracle, були завантажені з сайту oracle.com пакети:

oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-odbc-11.2.0.3.0-1.x86_64.rpm
Після того, як всі ці пакети були встановлені, залишилося тільки зробити налаштування клієнта та unixODBC. В результаті всі налаштування були зроблені і залишилося тільки протестувати, що все працює.

Перелогиниваемся під користувачем zabbix і виконуємо команду isql, згідно інструкції.

[user@serverZabbix]$ isql -v CMSAHI username/password


Все ок. Пробуємо отримати той же результат з веб Zabbix. Після установки елемента даних «Моніторинг БД» чекаємо результату. Але не тут-то було. Елемент даних перейшов у статус «Не підтримується». Отримуємо помилку: Cannot connect to ODBC DSN:[SQL_ERROR]:[01000][0][[unixODBC][Driver Manager]can't open lib '/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1': file not found]|.

Дивна помилка, тим більше, що вказаний файл за вказаною шляху є.


Почався процес пошуку причини і спроби виправити помилку. Після кількох днів пошуку, перепробувавши купу порад, знайдених в інтернеті, набрів на тікет у баг-трекері Zabbix. З опису проблеми – це як раз наша проблема. Що ж робити? Тікет відкритий, знайдений баг і в наступних версіях Zabbix, а отже, якщо причина нашої помилки саме цей баг, налаштувати моніторинг не вийде. Ну не ставити ж свежевышедшую версію Zabbix заради вирішення однієї задачі.

В голову прийшла думка: а що, якщо для підключення до БД використовувати не unixODBC а SqlPlus, який був встановлений разом з пакетом oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm. Виходячи з цієї ідеї, необхідно налаштувати клієнт oracle для підключення.

Клієнт Oracle був встановлений у /usr/lib/oracle/11.2/client64. Перше, що потрібно зробити – це створити файл tnsnames.ora і заповнити його даними для підключення до БД oracle. Для цього потрібно створити папку для збереження цього файла:

sudo mkdir /usr/lib/oracle/11.2/client64/network/admin –p

У створеній директорії потрібно створити файл з ім'ям tnsnames.ora і заповнити його. Обов'язково потрібно перевірити, щоб у всіх створених директорій і самого файлу права доступу на читання для користувача zabbix.

Далі, потрібно створити скрипт для підключення до БД та виконання запитів. Нижче приклад скрипта для виконання простих селектов:

#!/bin/sh
## Для коректної роботи потрібно задати змінні середовища нижче
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib64:/usr/lib:$ORACLE_HOME/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin
## Директорія для зберігання sql – файлів. Створена заздалегідь.
## Обов'язково переконатися, що користувачеві zabbix видані права доступу на запис і читання
scriptLocation=/etc/zabbix/SqlScripts
## Тут задається абсолютний шлях та назву файлу з виконуваним запитом
## в якості першого параметра скрипта передбачається передавати якусь унікальну ## рядок, для ідентифікації файлу із запитом
sqlFile=$scriptLocation/sqlScript_"$1".sql
## Записуємо виконується запит в файл
echo "$2" > sqlFile;
## Власне, нижче підключаємося до БД і виконуємо запит з раніше збереженого файлу.
## Логін і пароль відкриті, не добре. 
username="$3"
password="$4"
tnsname="$5"
var=$($ORACLE_HOME/bin/sqlplus -s $username/$password@$tnsname < $sqlFile)
## Отримуємо результат запиту з отриманої вище рядки і повертаємо результат.
echo $var | cut -f3 -d " "

Скрипт необхідно помістити в папку /etc/zabbix/externalscripts – папка для зберігання скриптів зовнішніх перевірок (см налаштування zabbix_server.conf рядок ExternalScripts=/etc/zabbix/externalscripts). Також скрипту необхідно видати права доступу на читання і виконання користувачеві zabbix. Скрипт готовий. Налаштовуємо елемент даних «Зовнішня перевірка» у веб-інтерфейсі Zabbix як на скріні нижче.


Створений раніше скрипт приймає сл. параметри:

  1. Ідентифікатор файлу із запитом (рядок)
  2. Простий запит (рядок)
  3. логін для підключення до БД (рядок)
  4. Пароль для підключення до БД (рядок)
  5. TNS БД, до якої хочемо підключитись (рядок)
На скріні вище полі «Ключ» заповнена наступним чином:

getOracleSelect.sh["TestSelect","select count(*) from testTable;","username","password","CMSAHI"]

де «TestSelect» – рядковий ідентифікатор, для формування sql-файлу;
      «select count(*) from testTable;» – сам запит.
      «username» і «password» – дані підключення до бази
      «tnsname» – назва бази (см tnsnames.ora)


! ВАЖЛИВО! Запит повинен повертати значення тільки однієї колонки результуючої таблиці, якщо очікується отримати чисельну або текстове значення результату вибірки.

Після того, як елемент створений, якщо все налаштовано правильно, веб-інтерфейс Zabbix відобразить результат виконання запиту.

Цей метод, звичайно ж, має ряд недоліків, але, в якості тимчасового рішення він працює. Таким недоліком, наприклад, є те, що великий і складний запит вписувати в якості параметра дуже незручно.

Для отримання параметрів зайнятого табличного простору використаний скрипт нижче:

SELECT round((totalspace — freespace) * 100 / decode(maxspace, 0, totalspace, maxspace), 2) "%USED" 
FROM (SELECT tablespace_name, SUM (bytes) / (1024*1024*1024) totalspace, Sum(maxbytes)/ 1024/1024/1024 maxspace
FROM dba_data_files
GROUP BY tablespace_name) a, 
(SELECT tablespace_name, SUM (Bytes) / (1024*1024*1024) freespace
FROM dba_free_space
GROUP BY tablespace_name) b
WHERE A. TABLESPACE_NAME = B. TABLESPACE_NAME (+)
AND A. TABLESPACE_NAME = 'TAB_SPACE1';

Так як потрібно моніторити всього декілька табличних просторів, під кожне був створений свій sql-файл. Для вирішення поставленої задачі, скрипт був змінений. Нижче сам скрипт:

#!/bin/sh
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib64:/usr/lib:$ORACLE_HOME/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin
scriptLocation=/etc/zabbix/SqlScripts
sqlFile=$scriptLocation/getPUsedTableSpace_"$1".sql
username="$2"
password="$3"
tnsname="$4"
var=$($ORACLE_HOME/bin/sqlplus -s $username/$password@$tnsname < $sqlFile)
echo $var | cut -f3 -d " "

Ключ для елемента даних, відповідно, виглядає так:

getOracleSelect.sh["TAB_SPACE1","username","password","CMSAHI"]

де 'TAB_SPACE1' — найменування табличного простору.


Як видно з скріна вище, веб-інтерфейс Zabbix отримує результати виконання запиту і відображає відсоткове значення використаного табличного простору.

Залишається тільки налаштувати тригери і дії сповіщень.

Якщо комусь допоможе даний спосіб, буду радий. Якщо у когось будуть ідеї щодо модернізації скриптів і самого підходу, минаючи unixODBC, пишіть.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.