使用zabbix监控oracle中的表数据
有时候需要对表中的数据进行监控,比如笔者的这种场景: 微服务自己实现了定时任务,定时任务的执行结果会记录到某张日志表中,如果定时任务执行失败将会对业务产生影响,而微服务又没有自己的告警机制进行通知,故笔者用zabbix+python进行了监控,当任务失败时 进行告警。
而这些业务的定时任务又是动态的,会增加新任务也会删除旧任务,所以对于这些任务要动态发现。下面是效果图。
1 原理
python查询job配置表,将表的数据组织成zabbix自动发现的要求的json格式,自动发现监控项后,利用zabbix-sender批量将所有job的数据发送给zabbix-server。
Tips: 使用zabbix-sender批量提交性能更高
使用到的技术组件主要有:
- zabbix-sender
- cx-oracle
- zabbix自动发现
2 表介绍
首先来看下我们需要监控的job日志表,每个job的执行结果都会记录在日志表中,只需要采集job最近执行的一行数据即可,下图中的status字段就是job的执行状态。
但笔者希望告警的时候能带上job的名字,所以需要结合下面这张job_config 配置表来联合查询,并且自动发现也是基于这张配置表,这样自动发现出来的监控项就都有名字了。
3 实现
python脚本去查询job配置表,组织成zabbix要求的自动发现数据格式。
首先,需要安装python 模块
1 | pip3 install cx-oracle |
自动发现和数据采集脚本,传入check时将返回自动发现需要的数据,传入get_job_status将返回job的执行记录数据
app_job.py
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | import cx_Oracle import sys import json file_prefix = '/tmp/' job_status_info = file_prefix + '.job_status_info' class OracleUtils( object ): def __init__( self , user, password, dsn): self .user = user self .password = password self .dsn = dsn self .conn = cx_Oracle.connect(user = self .user, password = self .password, dsn = self .dsn) self .cursor = self .conn.cursor() def fetchaall( self , sql): self .cursor.execute(sql) return self .cursor.fetchall() def insertMany( self , params): self .cursor.executemany() def close( self ): self .conn.close() def check( self ): all_job_sql = """ select job_id "{#JOB_ID}",job_name "{#JOB_NAME}" from job_config a where a.status = 0 and a.del_ind = 0""" conn_job = OracleUtils( self .user, self .password, self .dsn) job_res = conn_job.fetchaall(sql = all_job_sql) job_cols = [d[ 0 ] for d in conn_job.cursor.description] conn_job.close() job_data = [] for row in job_res: job_data.append( dict ( zip (job_cols, row))) data = dict () data[ 'data' ] = job_data print (json.dumps(job_data, indent = 4 ,ensure_ascii = False )) def get_job_status( self ): sql = """ select * from (SELECT a.job_id, a.status FROM (SELECT ROW_NUMBER() OVER(PARTITION BY job_id ORDER BY TO_NUMBER(ID) DESC) rn, job_log.* FROM job_log) a where a.rn = 1) bb where bb.job_id in (select job_id from job_config a where a.status = 0 and a.del_ind = 0) """ conn = OracleUtils( self .user, self .password, self .dsn) res = conn.fetchaall(sql = sql) conn.close() job_status = '' for row in res: # print(row) i = '''- app.job_status[{job_id}] {status} ''' . format (job_id = row[ 0 ],status = row[ 1 ]) job_status + = i with open (job_status_info, 'w+' ) as f: f.write(job_status) if __name__ = = '__main__' : username = 'username' password = 'xxxxx' host_sid = '192.168.1.5:1521/orcl' ora = OracleUtils(username, password, host_sid) param = sys.argv[ 1 ] # param = 'get_job_status' getattr (ora, param)() |
因为要传入oracle的环境变量等,所以笔者将环境变量写在了一个shell脚本中,并通过shell脚本来调用app_job.py
app_job.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 | #!/bin/bash param=$1 ORACLE_BASE= /oracle/app/oracle ; export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE /product/11 .2.0 /db_1 ; export ORACLE_HOME ORACLE_SID=orcl; export ORACLE_SID ORACLE_TERM=xterm; export ORACLE_TERM NLS_DATE_FORMAT= "yyyy-mm-dd HH24:MI:SS" ; export NLS_DATE_FORMAT NLS_LANG=AMERICAN_AMERICA.UTF8; export NLS_LANG PATH=.:$PATH:$HOME /bin :$ORACLE_BASE /product/11 .2.0 /db_1/bin :$ORACLE_HOME /bin ; export PATH zabbix_sender= /usr/bin/zabbix_sender zabbix_conf= /etc/zabbix/zabbix_agentd .conf appjob_send_log= '/tmp/zabbix_sender_appjob.log' job_status_info= '/tmp/.job_status_info' if [ "$param" != 'get_job_status' ]; then # 自动发现 /usr/bin/python3 /etc/zabbix/scripts/app_job .py check else # 数据上报 /usr/bin/python3 /etc/zabbix/scripts/app_job .py $param echo "`date '+%F %T'` start ..........................." >>$appjob_send_log $zabbix_sender -vv -c $zabbix_conf -i $job_status_info >>$appjob_send_log 2>&1 exit_code=$? echo $exit_code fi |
zabbix自定义监控项配置文件
userparameter_apps.conf
1 2 | UserParameter=discovery.app.jobs,/etc/zabbix/scripts/app_job.sh check UserParameter=notify.app.jobs.data[*],/etc/zabbix/scripts/app_job.sh get_job_status |
添加自定义配置项后需要重启zabbix-agent
1 | systemctl restart zabbix-agent |
好了,脚本和配置都已经做好了,使用zabbix-get 测试下自动发现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | zabbix_get -s 10.108.1.15 -k discovery.app.jobs # 返回如下 [ { "{#JOB_ID}": "83", "{#JOB_NAME}": "changePrice" }, { "{#JOB_ID}": "201", "{#JOB_NAME}": "StockFrozenHandleJob" }, { "{#JOB_ID}": "101", "{#JOB_NAME}": "InvalidProcurHandleJob" } ] |
能出来上面的数据,说明自动发现已经可以了,解下来制作模板。
嫌模板制作太麻烦的,也可以找热心的笔者直接传你,扫描文末的二维码关注即可。
新建一个模板,并配置上自动发现的监控项
至此,模板制作完成,只需要将此模板关联到要监控的主机即可。
过一段时间后,就能看到采集的数据,如下:
至此,监控配置结束!
以上就是使用zabbix监控oracle表数据的方法的详细内容,更多关于zabbix监控oracle表数据的资料请关注IT俱乐部其它相关文章!