需求:
根据机器名查询oracle连接数,并通过zabbix进行监控
脚本:
[root@rac1 Zabbix_S]# cat get_conns.py
#!/usr/bin/python
#coding:utf-8
import os,sys
from subprocess import Popen,PIPE
#根据machine对连接数进行分组,求各服务器到oracle的连接数
sql='''/opt/app/oracle/product/11.2.0/db_1/bin/sqlplus -S "system/xxxx@x.x.x.x:1521/xxxx" <<EOF
set lines 300 pages 1000
set feedback off
set heading off
col tablespace_name for a20
select machine,count(*) co from gv\$session where machine like '%-web-node%.xxx.com' group by machine;
quit
EOF'''
def get_data(sql):
result={}
try:
#重点:zabbix服务端调用agent端的脚本时,需要查询环境变量,所以需要在python脚本中通过os.environ设置当前python脚本所在进程的环境变量
#试过使用os.system('export ORACLE_HOME=xxxx')的方式,不好使,服务端调用会报找不到对应oracle_home和sqlplus命令
env=os.environ.copy()
env['ORACLE_SID']='xxxx1'
env['ORACLE_HOME']='/opt/app/oracle/product/11.2.0/db_1'
env['PATH']='$ORACLE_HOME/bin:$PATH'
res=Popen(sql,stdout=PIPE,env=env,shell=True)
for line in res.stdout:
if len(line)!=1:
#将主机名和连接数做成字典映射,便于根据主机名检索对应连接数
result[line.split()[0]]=(line.split()[1])
except Exception, e:
print e
return result
if __name__=='__main__':
if len(sys.argv)!=3:
#脚本第一个参数是区域,第二个参数是节点号
print "Usage: %s Zone Node" % (sys.argv[0])
sys.exit()
k=sys.argv[1]+'-web-'+sys.argv[2]+'.xxx.com'
res=get_data(sql)
try:
#判断是否有这个主机名对应的key
if res.has_key(k):
print res[k]
else:
print '%s not exists' %(k)
except Exception , e:
print e
脚本调用方式:
修改脚本的属主为zabbix
chown zabbix.zabbix get_conns.py
调用脚本并传递参数:
[root@rac1 Zabbix_S]# su - zabbix -s /bin/bash -c '/home/oracle/script/Zabbix_S/get_con.py bj node4'
25
配置zabbix配置文件,添加对应key:
[root@rac1 Zabbix_S]# cat /etc/zabbix_agentd.conf.d/oracle
UserParameter=db.hostconn[*],/home/oracle/script/Zabbix_S/get_conns.py $1 $2
之后在zabbix web页面配置对应的监控项和触发器即可