[打造自己的监控系统]使用Django获取Oracle系统状态数据并存放在redis中
开发环境
操作系统:CentOS 7.4 Python版本 :3.6 Django版本: 1.10.5 操作系统用户:oms
对于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
这个程序讲解如下:
- 为方便后面的数据处理,这里获取当前的绝对时间(如17:01分会保存为17:00分)
- 然后从oraclelist表中获取信息
- 遍历每个数据库,当monitor_type为1和hit_type为1时继续
- 利用取出来的信息连接数据库,当连接成功后执行相应的程序获取各个命中率和系统数据,获取完成后关闭数据库连接
- 接下来使用redis的push功能保存数据,为方便后面处理数据,如果当前时间为2017-12-12-0:00则会在2017-12-11-23:59保存一条相同数据
一些注意事项
- 由于我有9i的库,所以首先会判断是否为9i,是的话则不会获取DB Time的数据
- 关于保存的时间采用绝对时间,并且每天0点时间段会保存2次
- 这里调用了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
下节介绍如何将这些数据展示在一个页面上
- 网络字体@font-face 如何处理网页中的特殊字体
- python实现多变量线性回归(Linear Regression with Multiple Variables)
- 【美团技术团队博客】序列化和反序列化
- Java 静态代理与动态代理
- ELK日志套件安装与使用
- HTML知识复习
- MarkDown 常用语法教程
- CSS3盒阴影 box-shadow
- HTML5-类库系列 补讲AJAX
- HTML5-类库系列 事件与获取完成版样式
- 为什么不要在 JavaScript 中使用位操作符?
- 高级语言的编译:链接及装载过程介绍
- 美团技术团队博客:Kafka文件存储机制那些事
- CSS3文本阴影 text-shadow
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- django中的ajax组件教程详解
- php微信公众号开发之校园图书馆
- 查看keras的默认backend实现方式
- Python包和模块的分发详细介绍
- PHP cookie,session的使用与用户自动登录功能实现方法分析
- Python内置方法和属性应用:反射和单例(推荐)
- 使用OpenCV对车道进行实时检测的实现示例代码
- php 读取文件夹下所有图片、文件的实例
- php微信公众号开发之欢迎老朋友
- Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
- PHP使用glob方法遍历文件夹下所有文件的实例
- Python图像阈值化处理及算法比对实例解析
- 浅析Python 条件控制语句
- 浅谈Django前端后端值传递问题
- sklearn和keras的数据切分与交叉验证的实例详解