[打造自己的监控系统]使用Django获取Oracle系统状态数据并存放在redis中

时间:2022-07-23
本文章向大家介绍[打造自己的监控系统]使用Django获取Oracle系统状态数据并存放在redis中,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

开发环境

操作系统:CentOS 7.4 Python版本 :3.6 Django版本: 1.10.5 操作系统用户:oms

前面介绍了如何利用Python获取TOP SQL数据并在前端展现出来

对于Oracle数据库的运维,我们首先需要知道系统的整体运行状况,例如物理读,逻辑读,解析,命中率等

这节就讲如何将这些数据获取

获取原理

我们通过查询v$sysstat 等视图来获取信息

关于redis存储,我们选择的value的数据类型为列表

1. 新建MySQL表存放监控数据

我们无需事先建立redis的key值

2. 编写自定义命令获取指标并存入数据库

如何创建自定义命令请参考

http://www.zhaibibei.cn/oms/3.1/

2.1 主体程序

这里我们用oracle_hit_sysstat_redis.py程序来获取Oracle TOP SQL

vim monitor/management/commands/oracle_hit_sysstat_redis.py

2.2 调用的函数

上面主体程序调用了一些函数用于从Oracle数据库获取必要的数据

文件路径为monitor/command/getoracle_hit_sysstat.py

这里选取几个,具体的参见我的github主页,可根据实际情况进行调整

def getlibhit(cursor):
    fp=open(os.environ['HOME_DIR']+'/mysite/monitor/command/sql/getlibhit.sql','r')
    fp1=fp.read()
    s=cursor.execute(fp1)
    fp.close()
    row=s.fetchone()
    return row
def getdichit(cursor):
    fp=open(os.environ['HOME_DIR']+'/mysite/monitor/command/sql/getdichit.sql','r')
    fp1=fp.read()
    s=cursor.execute(fp1)
    fp.close()
    row=s.fetchone()
    return row
def getcachehit(cursor):
    fp=open(os.environ['HOME_DIR']+'/mysite/monitor/command/sql/getcachehit.sql','r')
    fp1=fp.read()
    s=cursor.execute(fp1)
    fp.close()
    row=s.fetchone()
    return row
def getloadprofile(cursor):
    s=cursor.execute('select name, abs(value) from v$sysstat where name in ('parse count (hard)','parse count (total)','physical reads','session logical reads','user commits','user rollbacks','user calls','sorts (disk)','logons cumulative','redo size','execute count','table fetch by rowid','table fetch continued row','table scan rows gotten','CPU used by this session') order by name')
    row=s.fetchall()
    return row

这个程序讲解如下:

  1. 为方便后面的数据处理,这里获取当前的绝对时间(如17:01分会保存为17:00分)
  2. 然后从oraclelist表中获取信息
  3. 遍历每个数据库,当monitor_type为1和hit_type为1时继续
  4. 利用取出来的信息连接数据库,当连接成功后执行相应的程序获取各个命中率和系统数据,获取完成后关闭数据库连接
  5. 接下来使用redis的push功能保存数据,为方便后面处理数据,如果当前时间为2017-12-12-0:00则会在2017-12-11-23:59保存一条相同数据

一些注意事项

  1. 由于我有9i的库,所以首先会判断是否为9i,是的话则不会获取DB Time的数据
  2. 关于保存的时间采用绝对时间,并且每天0点时间段会保存2次
  3. 这里调用了send_mail函数用于程序运行异常时通知我

3. 最终结果

使用如下命令运行

/usr/bin/python /home/oms/mysite/manage.py oracle_hit_sysstat_redis

可以看出数据库的信息已经保存在redis数据库中了

4. 设置自动运行

这里我们设置每小时执行一次,并重定向所有日志至一个文件

这样我们可以通过检查该日志文件判断脚本是否正常运行

0 * * * * /usr/bin/python /home/oms/mysite/manage.py oracle_hit_sysstat_redis>>/home/oms/mysite/crontab.log 2>&1

源代码位置

欢迎访问我的github主页查看源码

https://github.com/bsbforever/oms_django

好了,这节介绍了如何利用自定义命令获取Oracle数据库的性能指标并保存在redis数据库中

下节介绍如何将这些数据展示在一个页面上