1. 程式人生 > >利用superlance監控supervisor執行狀態

利用superlance監控supervisor執行狀態

此文已由作者張家裕授權網易雲社群釋出。

歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。


最近開發問到supervisor管理下的程序重啟了,有無辦法做到主動通知,樓主最先想到的是supervisor自帶的eventlistener,於是找到了下面的解決方法。

supervisor與superlance簡介

supervisor是一款非常實用的程序管理工具,可以方便的通過命令開啟、關閉、重啟等操作,而且它管理的程序一旦崩潰會自動重啟。在KM上面已有多篇文章介紹supervisor的優勢以及使用技巧,此處對supervisor本身的介紹不予贅述。

 

這裡主要介紹與supervisor協同工作的的利器superlance,是基於supervisor的事件機制實現的一系列命令列的工具集,它實現了許多supervisor本身沒有實現的實用的程序監控和管理的特性,包括記憶體監控,http介面監控,郵件和簡訊通知機制等。同樣的,superlance本身也是使用python編寫的。

 

安裝

由於superlance是一個python包,安裝起來十分簡單,通過easy_install或者pip就可以簡單的安裝:

easy_install superlance
pip install superlance

當然也可以到github上獲得最新的原始碼(https://github.com/Supervisor/superlance)並安裝。

python setup.py install

安裝後執行以下httpok命令,如果該命令存在,則說明superlance已經正常安裝了。

 

superlance的元件

superlance是一系列命令列工具的集合,其包括以下這些命令:

  1. httpok 

    通過定時對一個HTTP介面進行GET請求,根據請求是否成功來判定一個程序是否處於正常狀態,如果不正常則對程序進行重啟。

     

  2. crashmail 

    當一個程序意外退出時,傳送郵件告警。

     

  3. memmon 

    當一個程序的記憶體佔用超過了設定閾值時,傳送郵件告警。

     

  4. crashmailbatch 

    類似於crashmail的告警,但是一段時間內的郵件將會被合成起來發送,以避免郵件轟炸。

     

  5. fatalmailbatch 

    當一個程序沒有成功啟動多次後會進入FATAL狀態,此時傳送郵件告警。與crashmailbatch一樣會進行合成報警。

     

  6. crashsms 

    當一個程序意外退出時傳送簡訊告警,這個簡訊也是通過email閘道器來發送的。

實際使用例子:

注意:在實際配置supervisor使用superlance之前,首先要安裝sendmail,superlance使用這個命令列工具來發送email,利用各種包管理工具都可以簡單的安裝:

apt-get install sendmail

crashmail使用介紹

supervisor的配置內容如下:

cat /etc/supervisor/conf.d/redis.conf
[program:redis]
command=/usr/local/redis/bin/redis-server /home/redis/etc/redis.conf
directory=/usr/local/redis/bin/
user=mysql
autostart = trueautorestart = true#startsecs = 30stopwaitsecs = 1stopsignal = TERM
redirect_stderr = true
 [eventlistener:redis_monitor]
command=crashmail -p redis -m [email protected]
events=PROCESS_STATE_EXITED
redirect_stderr=false


首先配置了redis程序啟動專案,隨後配置了一個名為redis_monitor的事件監聽器,它接受來自supervisor的PROCESS_STATE_EXITED事件,並且會觸發crashmail的命令列呼叫。 

PROCESS_STATE_EXITED是在一個supervisor的監控項對應的程序意外退出時會觸發的事件,這就使得一個程序出現意外退出的情況下會通知到crashmail。 

command引數中-p引數配置了crashmail只會對名為redis的監控項作出響應,而-m引數中則配置了崩潰郵件會被髮送到的地址。

 

配置了上訴配置後,就可通過supervisorctl看到配置的兩條內容,一條是redis監控項,另外一條則是事件監聽器redis_monitor: 

 使用kill來殺掉redis程序

 收到程序26039退出的郵件通知

該配置可以在程序重啟時通過郵件的方式通知到使用者。

memmon使用介紹 

這裡利用memmon監控程序的記憶體佔用情況,這裡有一段測試指令碼:

 這段指令碼在執行的過程中會出現記憶體洩露的情況,導致記憶體佔用越來越大,直至無法系統無法再分配記憶體導致程式異常退出,利用這段指令碼我們可以配置一個memmon的事件監聽來發出記憶體洩露的告警。 

supervisor的配置如下:

[program:leak]
command=python /home/zhangjy/memoryleak.py
user=zhangjy
directory=/home/zhangjy
priority=999process_name=%(program_name)s
numprocs=1autostart = trueautorestart = truestopwaitsecs = 1stopsignal = TERM
exitcodes=0,2redirect_stderr = falsestdout_logfile_maxbytes = 1024MB
stdout_logfile_backups = 5stdout_logfile = /home/zhangjy/stdout.log
stderr_logfile_maxbytes = 1024MB
stderr_logfile_backups = 5stderr_logfile = /home/zhangjy/stderr.log
 
[eventlistener:leak_monitor]
command=memmon -p leak=1MB -m [email protected]
events=TICK_60
redirect_stderr=false

這裡memmon事件監聽器監聽的是TICK_60事件,也就是每60秒間隔觸發一次的事件,這使得memmon會每60秒檢測一次對應的監控項的佔用記憶體情況,這裡設定的是監控leak監控項,如果其記憶體佔用超過1MB,則會重啟程序,併發送郵件進行告警。 起到該程序後,檢視狀態

執行60s後,leak程序的記憶體佔用超過了1MB的告警值, leak的uptime也重置了,說明該程序已經被重啟了,使得該程序可以保持正常執行,同時也達到了記憶體洩露告警的目的。

可以看到郵箱中收到了告警郵件:

利用superlance工具可以完成各種各樣的告警需求,擴充套件了supervisor的功能,這些工具的具體使用方法可以參考官方文件:

https://superlance.readthedocs.org/en/latest/index.html


免費體驗雲安全(易盾)內容安全、驗證碼等服務

更多網易技術、產品、運營經驗分享請點選


相關文章:
【推薦】 iOS安裝包瘦身(上篇)
【推薦】 一個體驗好的Windows 工作列縮圖開發心得
【推薦】 Jmeter入門例項