關于監控系統我們前面介紹了很多,學會了如何使用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