使用zabbix监控oracle中的表数据

使用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的执行状态。
![[Pasted image 20221120150202.png]]

但笔者希望告警的时候能带上job的名字,所以需要结合下面这张job_config 配置表来联合查询,并且自动发现也是基于这张配置表,这样自动发现出来的监控项就都有名字了。

请添加图片描述

3 实现

python脚本去查询job配置表,组织成zabbix要求的自动发现数据格式。
首先,需要安装python 模块

pip3 install cx-oracle

自动发现和数据采集脚本,传入check时将返回自动发现需要的数据,传入get_job_status将返回job的执行记录数据
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的环境变量等,所以笔者将环境变量写在了一个shell脚本中,并通过shell脚本来调用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
     # 自动发现
    /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

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

好了,脚本和配置都已经做好了,使用zabbix-get 测试下自动发现

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"
    }
]

能出来上面的数据,说明自动发现已经可以了,解下来制作模板。
嫌模板制作太麻烦的,也可以找热心的笔者直接传你,扫描文末的二维码关注即可。

新建一个模板,并配置上自动发现的监控项
请添加图片描述请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
至此,模板制作完成,只需要将此模板关联到要监控的主机即可。
过一段时间后,就能看到采集的数据,如下:
在这里插入图片描述

至此,监控配置结束!
如有疑问可以扫码联系
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Zabbix监控Oracle数据库数据,可以使用Zabbix数据库监控功能结合Oracle的特定监控方法。以下是一个简单的步骤指南: 1. 确保已经安装和配置了Zabbix服务器和Zabbix代理。 2. 在Zabbix服务器上创建一个新的模板,用于监控Oracle数据库。在模板,可以定义触发器、图和报警等。 3. 在Zabbix服务器上创建一个新的主机,对应于要监控Oracle数据库实例。为主机配置IP地址和其他必要的参数。 4. 在Zabbix代理配置文件添加数据库监控参数。编辑zabbix_agentd.conf文件,添加以下内容: ``` UserParameter=oracle.tablespace.discovery,/path/to/script UserParameter=oracle.tablespace.size[*],/path/to/script $1 $2 ``` 5. 创建一个用于获取数据的脚本。可以使用Python、Shell脚本或其他适当的工具来编写脚本。该脚本应该能够连接到Oracle数据库并获取数据。 6. 将脚本放置在Zabbix代理所在主机上,并确保脚本具有执行权限。 7. 在Zabbix服务器上导入模板,并将其关联到Oracle数据库的主机。 8. 在触发器定义阈值和触发条件,以便在数据达到特定阈值时触发警报。 9. 配置图以显示数据的趋势和变化。 10. 测试监控功能,确保Zabbix能够成功获取和显示数据,并在需要时触发警报。 请注意,上述步骤只是一个简单的指南,具体的配置和实施可能因系统环境和要求而有所不同。建议参考ZabbixOracle的官方文档以获取更详细的信息和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值