使用zabbix監(jiān)控oracle表數(shù)據(jù)的方法
使用zabbix監(jiān)控oracle中的表數(shù)據(jù)
有時(shí)候需要對(duì)表中的數(shù)據(jù)進(jìn)行監(jiān)控,比如筆者的這種場(chǎng)景: 微服務(wù)自己實(shí)現(xiàn)了定時(shí)任務(wù),定時(shí)任務(wù)的執(zhí)行結(jié)果會(huì)記錄到某張日志表中,如果定時(shí)任務(wù)執(zhí)行失敗將會(huì)對(duì)業(yè)務(wù)產(chǎn)生影響,而微服務(wù)又沒有自己的告警機(jī)制進(jìn)行通知,故筆者用zabbix+python進(jìn)行了監(jiān)控,當(dāng)任務(wù)失敗時(shí) 進(jìn)行告警。
而這些業(yè)務(wù)的定時(shí)任務(wù)又是動(dòng)態(tài)的,會(huì)增加新任務(wù)也會(huì)刪除舊任務(wù),所以對(duì)于這些任務(wù)要?jiǎng)討B(tài)發(fā)現(xiàn)。下面是效果圖。


1 原理
python查詢job配置表,將表的數(shù)據(jù)組織成zabbix自動(dòng)發(fā)現(xiàn)的要求的json格式,自動(dòng)發(fā)現(xiàn)監(jiān)控項(xiàng)后,利用zabbix-sender批量將所有job的數(shù)據(jù)發(fā)送給zabbix-server。
Tips: 使用zabbix-sender批量提交性能更高
使用到的技術(shù)組件主要有:
- zabbix-sender
- cx-oracle
- zabbix自動(dòng)發(fā)現(xiàn)
2 表介紹
首先來看下我們需要監(jiān)控的job日志表,每個(gè)job的執(zhí)行結(jié)果都會(huì)記錄在日志表中,只需要采集job最近執(zhí)行的一行數(shù)據(jù)即可,下圖中的status字段就是job的執(zhí)行狀態(tài)。
![![[Pasted image 20221120150202.png]]](http://img.jbzj.com/file_images/article/202404/2024042211380964.png)
但筆者希望告警的時(shí)候能帶上job的名字,所以需要結(jié)合下面這張job_config 配置表來聯(lián)合查詢,并且自動(dòng)發(fā)現(xiàn)也是基于這張配置表,這樣自動(dòng)發(fā)現(xiàn)出來的監(jiān)控項(xiàng)就都有名字了。

3 實(shí)現(xiàn)
python腳本去查詢job配置表,組織成zabbix要求的自動(dòng)發(fā)現(xiàn)數(shù)據(jù)格式。
首先,需要安裝python 模塊
pip3 install cx-oracle
自動(dòng)發(fā)現(xiàn)和數(shù)據(jù)采集腳本,傳入check時(shí)將返回自動(dòng)發(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)()
因?yàn)橐獋魅雘racle的環(huán)境變量等,所以筆者將環(huán)境變量寫在了一個(gè)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
# 自動(dòng)發(fā)現(xiàn)
/usr/bin/python3 /etc/zabbix/scripts/app_job.py check
else
# 數(shù)據(jù)上報(bào)
/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)控項(xiàng)配置文件
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
添加自定義配置項(xiàng)后需要重啟zabbix-agent
systemctl restart zabbix-agent
好了,腳本和配置都已經(jīng)做好了,使用zabbix-get 測(cè)試下自動(dòng)發(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ù),說明自動(dòng)發(fā)現(xiàn)已經(jīng)可以了,解下來制作模板。
嫌模板制作太麻煩的,也可以找熱心的筆者直接傳你,掃描文末的二維碼關(guān)注即可。
新建一個(gè)模板,并配置上自動(dòng)發(fā)現(xiàn)的監(jiān)控項(xiàng)






至此,模板制作完成,只需要將此模板關(guān)聯(lián)到要監(jiān)控的主機(jī)即可。
過一段時(shí)間后,就能看到采集的數(shù)據(jù),如下:

至此,監(jiān)控配置結(jié)束!
以上就是使用zabbix監(jiān)控oracle表數(shù)據(jù)的方法的詳細(xì)內(nèi)容,更多關(guān)于zabbix監(jiān)控oracle表數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Oracle使用MyBatis中RowBounds實(shí)現(xiàn)分頁查詢功能
這篇文章主要介紹了Oracle使用MyBatis中RowBounds實(shí)現(xiàn)分頁查詢 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Oracle?11g數(shù)據(jù)庫常用對(duì)象創(chuàng)建與管理方法詳解
這篇文章主要介紹了Oracle?11g數(shù)據(jù)庫常用對(duì)象創(chuàng)建與管理的相關(guān)資料,Oracle 11g數(shù)據(jù)庫是企業(yè)級(jí)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它提供了強(qiáng)大的數(shù)據(jù)管理功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
Oracle 數(shù)據(jù)庫中創(chuàng)建合理的數(shù)據(jù)庫索引
在Oracle數(shù)據(jù)庫中,創(chuàng)建索引雖然比較簡(jiǎn)單。但是要合理的創(chuàng)建索引則比較困難了。2009-06-06
使用Navicat Premium工具將oracle數(shù)據(jù)庫遷移到MySQL
最近的業(yè)務(wù)項(xiàng)目需求,因此總結(jié)遇到的問題。使用Navicat Premium工具將Oralce數(shù)據(jù)庫遷移到MySQL,本文通過圖文的形式給大家詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧2021-05-05

