天天看點

[打造自己的監控系統]使用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 . 程式主體

[打造自己的監控系統]使用Django批量監控Oracle長會話

程式路徑為:

mysite/monitor/management/commands/checkoracle_job_session.py

這個程式和前面說的檢查Job的程式放在一起

該程式解釋如下:

  1. 首先擷取oraclelist表中所有的資料庫資訊
  2. 然後當monitor_type等于1時連接配接資料庫
  3. 然後通過getoracleinfo.py中的checkactivesession函數擷取會話的情況
  4. 當傳回值為error時候擷取tns名稱并寫入mailcontent清單中
  5. 最後判斷mailcontent是否有資料,有的話則報警
  6. 這裡有郵件和微信報警,微信報警請看我昨天的推送

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. 最終結果

[打造自己的監控系統]使用Django批量監控Oracle長會話

可以看如果有超過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