E então chegou a hora de cair em cima do Oracle, pesquisa aqui, testa, pesquisa ali, e pá, encontrei o projeto do "Danilo Chilene (Bicofino) GITHUB WEBSITE" que realmente esta fantástico inclusive possuí LLD nas tablespaces, e é um Brasileiro opaa fala minha língua (kkkk), ai um SALVE aos Entusiastas Open Source que contribuem com projetos como este.
1 - Entendimento
O projeto do "Danilo Chilene" é um super script em Python que utiliza o cx_Oracle para comunicação no Oracle e então coleta das informações. A forma de coleta no Zabbix pode ser utilizada como ExternalCheck ou PassiveCheck/ActiveCheck ai depende da sua visão e de seu ambiente, mas se você me pergunta como eu uso? No meu ambiente tenho de tudo RedHat/CentOS/Oracle da versão 4 até o 7, ai onde que pega? as versões obsoletas que depois de escovar e garimpar o cx_Oracle não sobe nem com reza, então nesses casos extremos eu vou via ExternalCheck (Graças a Deus são poucos), e nos hosts que subo as dependências bonitinho vou via ActiveCheck (vamos liberar o server pow, joga serviço pro host).
2 - Funcionamento
Funcionamento é simples, basta chamar o script junto com os parâmetros, abaixo o help do comando e as sintaxes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@srv01 ~]# /etc/zabbix/Pyora/pyora.py -h usage: pyora.py [-h] [--username USERNAME] [--password PASSWORD] [--address ADDRESS] [--database DATABASE] {activeusercount,asm_volume_use,bufbusywaits,check_active,check_archive,commits,db_close,db_connect,dbfilesize,dbprllwrite,dbscattread,dbseqread,dbsize,dbsnglwrite,deadlocks,directread,directwrite,dsksortratio,enqueue,fra_use,freebufwaits,hparsratio,indexffs,lastapplarclog,lastarclog,latchfree,logfilesync,logonscurrent,logprllwrite,logswcompletion,netresv,netroundtrips,netsent,query_lock,query_redologs,query_rollbacks,query_sessions,query_sysmetrics,rcachehit,redowrites,rollbacks,show_asm_volumes,show_tablespaces,show_tablespaces_temp,show_users,tablespace,tablespace_abs,tablespace_temp,tblrowsscans,tblscans,uptime,user_status,version} ... positional arguments: {activeusercount,asm_volume_use,bufbusywaits,check_active,check_archive,commits,db_close,db_connect,dbfilesize,dbprllwrite,dbscattread,dbseqread,dbsize,dbsnglwrite,deadlocks,directread,directwrite,dsksortratio,enqueue,fra_use,freebufwaits,hparsratio,indexffs,lastapplarclog,lastarclog,latchfree,logfilesync,logonscurrent,logprllwrite,logswcompletion,netresv,netroundtrips,netsent,query_lock,query_redologs,query_rollbacks,query_sessions,query_sysmetrics,rcachehit,redowrites,rollbacks,show_asm_volumes,show_tablespaces,show_tablespaces_temp,show_users,tablespace,tablespace_abs,tablespace_temp,tblrowsscans,tblscans,uptime,user_status,version} optional arguments: -h, --help show this help message and exit --username USERNAME --password PASSWORD --address ADDRESS --database DATABASE |
Um exemplo para checagem da versão do Oracle, uma dica explore todos argumentos:
1 2 |
[root@srv01 ~]# ./pyora.py --username zabbix --password zabbix --address 192.168.200.13 --database orcl version Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production |
3 - Dependências
Na documentação do projeto informa o "cx_Oracle" e o pacote "python-argparse", abaixo listo os pacotes que subo pra poder utilizar:
oracle-instantclient12.1-devel-12.1.0.2.0-1, oracle-instantclient12.1-sqlplus-12.1.0.2.0-1, oracle-instantclient12.1-devel-12.1.0.2.0-1, gcc, python-pip, python-devel, python-devel, python-argparse, cx_Oracle
O "oracle-instantclient" nas versões atuais vou direto no 12, pois tenho o cx_Oracle pelo "python-pip" na ultima versão que roda no oracle-instantclient12, caso não consiga o pacote do cx_Oracle pelo "python-pip" provavelmente terá que recorrer ao repo abaixo que possui em diversas versões do Python e Oracle, então se atente a isto versão do Python a ser utilizada, versão do OracleInstantClient e versão do cx_Oracle.
Repo cx_Oracle Old Version: https://sourceforge.net/projects/cx-oracle/files/
Repo cx_Oracle 5.2.1: https://pypi.python.org/pypi/cx_Oracle/5.2.1
4 - Instalação
Sanar as dependências e acertar uma biblioteca do Oracle, depois disso chame o script "./pyora.py" se o resultado sair o help significa que as dependências estão ok:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@srv01 ~]# wget http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm [root@srv01 ~]# wget http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm [root@srv01 ~]# wget http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm [root@srv01 ~]# rpm -ivh oracle*.rpm [root@srv01 ~]# echo "/usr/lib/oracle/12.1/client64/lib" > /etc/ld.so.conf.d/oracle.conf [root@srv01 ~]# ldconfig [root@srv01 ~]# yum install gcc python-pip python-devel [root@srv01 ~]# pip install --upgrade pip [root@srv01 ~]# pip install cx_Oracle [root@srv01 ~]# https://pypi.python.org/packages/aa/ce/cb0b105976b56b888ff8fbfc7a6e68ffc414e7293c8abf9e33c8dd8270ef/cx_Oracle-5.3-12c-py27-2.x86_64.rpm [root@srv01 ~]# rpm -ivh cx_Oracle-5.3-12c-py27-2.x86_64.rpm |
É possível validar se esta ok as dependências do Python conforme abaixo, se não retornar nenhum erro é =Sucesso, a ultima que importei não existe e retornou o erro para exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@zabbix externalscripts]# python Python 2.7.5 (default, Nov 20 2015, 02:00:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import argparse >>> import cx_Oracle >>> import inspect >>> import json >>> import re >>> import naoexiste Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named naoexiste >>> |
Criar usuário e setar permissão para consulta no Oracle:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE USER ZABBIX IDENTIFIED BY 'SENHA' DEFAULT TABLESPACE SYSTEM TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK; GRANT CONNECT TO ZABBIX; GRANT RESOURCE TO ZABBIX; ALTER USER ZABBIX DEFAULT ROLE ALL; GRANT SELECT ANY TABLE TO ZABBIX; GRANT CREATE SESSION TO ZABBIX; GRANT SELECT ANY DICTIONARY TO ZABBIX; GRANT UNLIMITED TABLESPACE TO ZABBIX; GRANT SELECT ANY DICTIONARY TO ZABBIX; GRANT SELECT ON V_$SESSION TO ZABBIX; GRANT SELECT ON V_$SYSTEM_EVENT TO ZABBIX; GRANT SELECT ON V_$EVENT_NAME TO ZABBIX; GRANT SELECT ON V_$RECOVERY_FILE_DEST TO ZABBIX; |
5 - Zabbix
No Zabbix utilizando como ExternalCheck temos que jogar o "pyora.py" no diretorio parametrizado "ExternalScripts" no seu .conf do Server, e criar as chaves no modelo abaixo:
E se utilizado como Active/PassiveCheck utilizamos UserParameter, abaixo a chave:
1 |
UserParameter=pyora[*],/etc/zabbix/scripts/pyora.py --username $1 --password $2 --address $3 --database $4 $5 $6 |
6 - Bônus
O cx_Oracle é possível testar a comunicação com o Oracle utilizando um script simples em Python, abaixo um modelo caso seja necessário:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/usr/bin/env python import cx_Oracle ver = con.version.split(".") print ver print ver[0] print ver[-1] print ver[1:4] con.close() |