利用superlance監控supervisor運行狀態

此文已由做者張家裕受權網易雲社區發佈。
python

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


最近開發問到supervisor管理下的進程重啓了,有無辦法作到主動通知,樓主最早想到的是supervisor自帶的eventlistener,因而找到了下面的解決方法。git

supervisor與superlance簡介

supervisor是一款很是實用的進程管理工具,能夠方便的經過命令開啓、關閉、重啓等操做,並且它管理的進程一旦崩潰會自動重啓。在KM上面已有多篇文章介紹supervisor的優點以及使用技巧,此處對supervisor自己的介紹不予贅述。github

這裏主要介紹與supervisor協同工做的的利器superlance,是基於supervisor的事件機制實現的一系列命令行的工具集,它實現了許多supervisor自己沒有實現的實用的進程監控和管理的特性,包括內存監控,http接口監控,郵件和短信通知機制等。一樣的,superlance自己也是使用python編寫的。redis

安裝

因爲superlance是一個python包,安裝起來十分簡單,經過easy_install或者pip就能夠簡單的安裝:sql

easy_install superlance
pip install superlance複製代碼

固然也能夠到github上得到最新的源碼(https://github.com/Supervisor/superlance)並安裝。安全

python setup.py install複製代碼

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

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)工做
【推薦】 用雙十一的故事串起碎片的網絡協議(下)

相關文章
相關標籤/搜索