[打造自己的监控系统]使用Django批量监控Oracle长会话
关于监控系统我们前面介绍了很多,学会了如何使用Django新建网站以及获取数据监控数据至MySQL或redis
然后将获得的数据库处理后再前端显示
往期可以到我的个人网页查看
http://www.zhaibibei.cn/oms/ http://www.zhaibibei.cn/domanager/
这期讲如何使用Django批量监控Oracle 长会话
开发环境
操作系统:CentOS 7.4 Python版本 :3.6 Django版本: 1.10.5 操作系统用户:oms
1. 程序原理
原理为通过Django来批量连接Oracle数据库,然后查看v$session视图的last_call_et字段,如果发现有运行超过指定时间的则报警出来
支持Oracle 9i/10g/11g
12c我没环境应该也可以
2 . 程序主体
程序路径为:
mysite/monitor/management/commands/checkoracle_job_session.py
这个程序和前面说的检查Job的程序放在一起
该程序解释如下:
- 首先获取oraclelist表中所有的数据库信息
- 然后当monitor_type等于1时连接数据库
- 然后通过getoracleinfo.py中的checkactivesession函数获取会话的情况
- 当返回值为error时候获取tns名称并写入mailcontent列表中
- 最后判断mailcontent是否有数据,有的话则报警
- 这里有邮件和微信报警,微信报警请看我昨天的推送
3. 获取Job执行信息的函数
我们通过如下函数获取Job的执行情况,该程序可单独于Django运行
路径为:
mysite/monitor/command/checkoraclejob.py
该函数执行一个文件里的sql语句
检查v$session 中状态为ACTIVE或KILLED的非后台进程的会话,当LAST_CALL_ET字段大于7200(2小时)时候则报警出来
之所以单独排除CJQ 和QMN,因为这2个后台进程在9i中的TYPE为USERS而不是BACKGROUND
def checkactivesession(cursor):
fp=open(os.environ['HOME_DIR']+'/mysite/monitor/command/sql/getsession.sql','r')
fp1=fp.read()
s=cursor.execute(fp1)
fp.close()
row=s.fetchone()
if row is None:
return 'normal'
else:
return 'error'
getsession.sql
select a.sid,a.serial#,a.username,a.machine,a.program,a.sql_hash_value,a.type,a.LAST_CALL_ET
from v$session a
where a.status IN ('ACTIVE', 'KILLED')
and a.type <> 'BACKGROUND'
AND a.LAST_CALL_ET>7200
and a.PROGRAM not like '%CJQ%'
and a.PROGRAM not like '%QMN%'
4. 最终结果
可以看如果有超过2小时活动的会话则会发邮件
5. 设置自动运行
这里我们设置每天凌晨进行一次,并重定向所有日志至一个文件
这样我们可以通过检查该日志文件判断脚本是否正常运行
45 * * * * /usr/bin/python2.7 /ezio/website/manage.py checkoracle_job_session >>/home/oracle/crontab.log 2>&1
源代码位置
欢迎访问我的github主页查看源码
https://github.com/bsbforever/oms_django
- Go语言基于Socket编写服务器端与客户端通信的实例
- Linux强制用户首次登陆修改密码
- crontab执行python脚本提示ImportError解决方法
- Java学习之约瑟夫环的两中处理方法
- Zabbix实现QQ报警配置
- 限制用户使用su切换身份
- 微信小程序优秀开发资源汇总
- 编译安装openresty
- hdu 3367(Pseudoforest ) (最大生成树)
- chattr命令
- hdu 1561 The more, The Better (树上背包)
- hdu 1829 A Bug's Life(分组并查集(偏移量))
- 前端游戏编程基础-如何实现Canvas图像的拖拽、点击等操作
- hdu 4081 Qin Shi Huang's National Road System (次小生成树)
- 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 数组属性和方法