利用superlance監控supervisor執行狀態

網易雲社群發表於2018-11-06

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

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


最近開發問到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 zhangjy@corp.netease.com
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 zhangjy@corp.netease.com
events=TICK_60
redirect_stderr=false複製程式碼

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

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

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

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

superlance.readthedocs.org/en/latest/i…


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

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


相關文章:
【推薦】 WM_QUERYENDSESSION與WM_ENDSESSION
【推薦】 大中型 UGC 平臺的反垃圾(anti-spam)工作
【推薦】 用雙十一的故事串起碎片的網路協議(下)


相關文章