使用zabbix監(jiān)控oracle表數(shù)據(jù)的方法
使用zabbix監(jiān)控oracle中的表數(shù)據(jù)
有時候需要對表中的數(shù)據(jù)進行監(jiān)控,比如筆者的這種場景: 微服務(wù)自己實現(xiàn)了定時任務(wù),定時任務(wù)的執(zhí)行結(jié)果會記錄到某張日志表中,如果定時任務(wù)執(zhí)行失敗將會對業(yè)務(wù)產(chǎn)生影響,而微服務(wù)又沒有自己的告警機制進行通知,故筆者用zabbix+python進行了監(jiān)控,當任務(wù)失敗時 進行告警。
而這些業(yè)務(wù)的定時任務(wù)又是動態(tài)的,會增加新任務(wù)也會刪除舊任務(wù),所以對于這些任務(wù)要動態(tài)發(fā)現(xiàn)。下面是效果圖。
1 原理
python查詢job配置表,將表的數(shù)據(jù)組織成zabbix自動發(fā)現(xiàn)的要求的json格式,自動發(fā)現(xiàn)監(jiān)控項后,利用zabbix-sender批量將所有job的數(shù)據(jù)發(fā)送給zabbix-server。
Tips: 使用zabbix-sender批量提交性能更高
使用到的技術(shù)組件主要有:
- zabbix-sender
- cx-oracle
- zabbix自動發(fā)現(xiàn)
2 表介紹
首先來看下我們需要監(jiān)控的job日志表,每個job的執(zhí)行結(jié)果都會記錄在日志表中,只需要采集job最近執(zhí)行的一行數(shù)據(jù)即可,下圖中的status字段就是job的執(zhí)行狀態(tài)。
但筆者希望告警的時候能帶上job的名字,所以需要結(jié)合下面這張job_config 配置表來聯(lián)合查詢,并且自動發(fā)現(xiàn)也是基于這張配置表,這樣自動發(fā)現(xiàn)出來的監(jiān)控項就都有名字了。
3 實現(xiàn)
python腳本去查詢job配置表,組織成zabbix要求的自動發(fā)現(xiàn)數(shù)據(jù)格式。
首先,需要安裝python 模塊
pip3 install cx-oracle
自動發(fā)現(xiàn)和數(shù)據(jù)采集腳本,傳入check時將返回自動發(fā)現(xiàn)需要的數(shù)據(jù),傳入get_job_status將返回job的執(zhí)行記錄數(shù)據(jù)
app_job.py
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的環(huán)境變量等,所以筆者將環(huán)境變量寫在了一個shell腳本中,并通過shell腳本來調(diào)用app_job.py
app_job.sh
#!/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 # 自動發(fā)現(xiàn) /usr/bin/python3 /etc/zabbix/scripts/app_job.py check else # 數(shù)據(jù)上報 /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自定義監(jiān)控項配置文件
userparameter_apps.conf
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
systemctl restart zabbix-agent
好了,腳本和配置都已經(jīng)做好了,使用zabbix-get 測試下自動發(fā)現(xiàn)
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" } ]
能出來上面的數(shù)據(jù),說明自動發(fā)現(xiàn)已經(jīng)可以了,解下來制作模板。
嫌模板制作太麻煩的,也可以找熱心的筆者直接傳你,掃描文末的二維碼關(guān)注即可。
新建一個模板,并配置上自動發(fā)現(xiàn)的監(jiān)控項
至此,模板制作完成,只需要將此模板關(guān)聯(lián)到要監(jiān)控的主機即可。
過一段時間后,就能看到采集的數(shù)據(jù),如下:
至此,監(jiān)控配置結(jié)束!
以上就是使用zabbix監(jiān)控oracle表數(shù)據(jù)的方法的詳細內(nèi)容,更多關(guān)于zabbix監(jiān)控oracle表數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
oracle 12c因誤刪pdb數(shù)據(jù)文件導(dǎo)致整個數(shù)據(jù)庫打不開的解決方法
這篇文章主要給大家介紹了關(guān)于oracle 12c因誤刪pdb數(shù)據(jù)文件導(dǎo)致整個數(shù)據(jù)庫打不開問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。2017-10-10LINUX下Oracle數(shù)據(jù)導(dǎo)入導(dǎo)出的方法詳解
這篇文章主要介紹了LINUX下Oracle數(shù)據(jù)導(dǎo)入導(dǎo)出的方法,較為詳細的分析導(dǎo)出工具exp及導(dǎo)入工具imp的具體使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12Drop、Delete與Trunc的區(qū)別和應(yīng)用方式
這篇文章主要介紹了Drop、Delete與Trunc的區(qū)別和應(yīng)用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08oracle創(chuàng)建刪除用戶示例分享(oracle刪除用戶命令及授權(quán))
這篇文章主要介紹了oracle創(chuàng)建刪除用戶示例還有oracle刪除用戶命令及授權(quán)的使用,需要的朋友可以參考下2014-03-03