其實python監控的問題并不復雜,但是又很多的朋友都不太了解如何用Python監控系統狀態,因此呢,今天小編就來為大家分享python監控的一些知識,希望可以幫助到大家,下面我們一起來看看這個問題的分析吧!
本文目錄
有一個API,注冊后,文件發生變動,它會自動通知你。另外還有一個辦法,似乎是以特定方式,打開文件,當有人修改這個文件時,你會獲得通知。還有監控目錄的辦法。最笨的辦法當然是定時輪詢。不需要什么技巧,定時檢查文件和目錄的修改時間,如果時間發生變化就是變動了。
我遇到過和題主一樣的問題,其實每種數據庫都能找到一些方法去監控數據的變化,比如mysql可以通過配置my.ini將數據庫操作日志寫到文本文件中,然后通過分析文本去獲取變化。但是這樣處理實在缺少Python精神:一是你的代碼同特定數據庫深度耦合,如果后續會遷移到其它數據庫問題很多;二是這種代碼安裝部署很麻煩,需要系統管理員去配合修改mysql設置,而且對mysql的性能影響也需要測試人員進行深度測試。
最終,我選擇了一種看起來有點笨,但卻非常通用,而且對數據庫的性能影響也能預估的方法:使用sql語句去監控數據表的變化。
這種方法具有以下優點:
只使用sql語句,很容易移植到其它數據庫系統中使用。定義好輪詢間隔時間,可以有效的控制對數據庫系統的資源占用。安裝配置非常簡單,無需修改數據庫系統的設置。設計思路非常簡單,每隔固定間隔檢查一下數據表,如果有新的記錄觸發回調函數。通常的業務需要兩種監控模式,一是新增記錄監聽(我稱之為listen),二是監控已有記錄的變化(稱之為moniter)。
新增記錄的監聽所有待監聽的表需要有一個自增的字段id,只要判斷上一次輪詢后有沒有新的id出現即可。你需要將上一次處理的最后一個id存儲下來,這里我只用了一個變量去存儲,你可能需要把它持久存在磁盤或數據庫里。代碼原型如下:
#!/usr/bin/python#-*-coding:UTF-8-*-importthreadingclassBaseListener(object):#使用一個線程啟動監聽def__init__(self):self.checkpoint=0self.listen_thread=threading.Thread(name="Listener",target=self.do_listen)self.listen_thread.start()defstart(self):self.stop_flag=Falsedefstop(self):self.stop_flag=Truedefset_checkpoint(self,v):#設置監聽的斷點,如果需要可以持久存儲在磁盤上self.checkpoint=vdefget_checkpoint(self):returnself.checkpointdefdo_listen(self):whileTrue:ifnotself.stop_flag:#監聽用sql語句,應當以id倒排,需要使用WHEREid>{CHECK_POINT}進行篩選,如sql="SELECT*FROMaWHEREid>{CHECK_POINT}ORDERBYidDESC"checkpoint=self.get_checkpoint()sql_listen=sql.replace("{CHECK_POINT}",checkpoint)#fetchall為讀取全部記錄的語句recs=self.fetchall(sql_listen)forrecinrecs:rec_id=rec.get('id')self.callback(rec)self.set_checkpoint(rec_id)#根據情況設置輪詢時間time.sleep(1)defcallback(self,dictdata):#這是do_listen調用的一個回調函數,把數據傳過來處理,在子類中實現print"Shouldbeimplementedinsubclasses!"已有記錄是否變化為了更加通用,我們可以抽象為,某一個sql語句查詢結果是否有變化。查詢結果通常是一個結構體,在Python里面無法有效的比較一個結構體是否有變化,我們可以使用討巧的辦法:將這個結構體序列化后去做比較,我選擇了pickle去做序列化操作,它比json更加高效和穩定一些。很明顯,這里的一個關鍵是你需要存儲上一次查詢得到的數據才能和最近一次查詢做比較。代碼原型如下:
#!/usr/bin/python#-*-coding:UTF-8-*-importthreadingimportpickleclassBaseMonitor(object):"""監聽數據變化的基類"""def__init__(self):self.prev_data=Noneself.stop_flag=Trueself.monitor_thread=threading.Thread(name="Monitor",target=self.do_monitor)self.monitor_thread.start()defstart(self):self.stop_flag=Falsedefstop(self):self.stop_flag=Truedefdo_monitor(self):whileTrue:ifnotself.stop_flag:self.execute(self.extra_sql)data=self.fetchall(self.base_sql)ifdata:str_data=pickle.dumps(data)ifstr_data!=self.prev_data:self.callback(data)self.prev_data=str_datadefcallback(self,dictdata):#這是do_monitor調用的一個回調函數,把數據傳過來處理,在子類中實現print"Shouldbeimplementedinsubclasses!"如何使用使用這兩個類,只需要繼承它們,并實現callback函數就好。如:
classListenTest(BaseListener):defcallback(self,dictdata):print"LISTEN:",dictdataif__name__=="__main__":ad=ListenTest()ad.start()希望上面的思路或多或少能幫到你。
可以考慮下Selenium的方法進行截圖并保存截取的圖片。
如下這是使用webdriver進行截圖的方法:
祝樓主好運,可以嘗試下,這里因為篇幅愿意,只提供一個思路出來。
本人主要用shell,結合工作經驗,給出如下常用功能:
1.制作定時任務,可以獲得系統狀態,然后截取系統狀態,發送至故障監控平臺或短信平臺,實現故障的自動預警。
2.提取數據,形成文本,處理文本,得到規格化的數據,提供給相關部門使用。
3.制作shell交互式菜單,提供給其他運維值班人員使用,用以手工監控系統各種狀態4.版本升級、系統變更等操作需要使用。
PythonIdle是Python編程語言的集成開發環境(IDE),它是一個用于編寫、測試和調試Python程序的桌面應用程序。Python是一種流行的編程語言,而PythonIdle作為一個IDE,可以提供強大的編輯和調試功能,以幫助程序員更輕松地編寫和測試Python程序。除了PythonIdle之外,還有許多其他的PythonIDE可供選擇,例如PyCharm、Spyder和VisualStudioCode等,每個IDE都有其獨特的功能和優點。同時,Python也可以在命令行下運行,因此可以使用文本編輯器編寫代碼,再在終端中運行程序。
好了,本文到此結束,如果可以幫助到大家,還望關注本站哦!
搜浪信息科技發展(上海)有限公司 備案號:滬ICP備17005676號