利用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是一系列命令列工具的集合,其包括以下這些命令:
httpok
通過定時對一個HTTP介面進行GET請求,根據請求是否成功來判定一個程序是否處於正常狀態,如果不正常則對程序進行重啟。
crashmail
當一個程序意外退出時,傳送郵件告警。
memmon
當一個程序的記憶體佔用超過了設定閾值時,傳送郵件告警。
crashmailbatch
類似於crashmail的告警,但是一段時間內的郵件將會被合成起來發送,以避免郵件轟炸。
fatalmailbatch
當一個程序沒有成功啟動多次後會進入FATAL狀態,此時傳送郵件告警。與crashmailbatch一樣會進行合成報警。
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入門例項