使用superlance插件增強supervisor的監控能力

supervisor與superlance簡介

supervisor是一款用python編寫的進程監控、進程守護和進程管理的工具,可以工作在各種UNIX-like的操作系統上,通過簡單的配置就可以啓動、監控和管理大量的進程,並且可以守護這些進程的運行,同時其還提供了一套自帶的事件機制與XML-RPC API,可以很方便的在其之上擴展各種功能滿足各類需要。
而superlance就是基於supervisor的事件機制實現的一系列命令行的工具集,它實現了許多supervisor本身沒有實現的實用的進程監控和管理的特性,包括內存監控,http接口監控,郵件和短信通知機制等。同樣的,superlance本身也是使用python編寫的。

superlance的安裝

由於本文主要介紹superlance插件,對supervisor本身的介紹不予以贅述。
由於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網關來發送的。

superlance實戰

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

sudo apt-get install sendmail

(1)crashmail
supervisor的配置內容如下:

[program:top]
command=top -b
process_name=%(program_name)s
numprocs=1
directory=/tmp
umask=022
priority=999
autostart=false
autorestart=false
startsecs=10
startretries=3
exitcodes=0,2
stopsignal=TERM
stopwaitsecs=10
redirect_stderr=true

[eventlistener:crashmail]
command=crashmail -p top -m [email protected]
events=PROCESS_STATE_EXITED
redirect_stderr=true

首先配置了一個名爲top的進程監控項,其內容就是很簡單的重複執行top -b,持續地輸出當前系統的進程信息。
隨後配置了一個名爲crashmail的事件監聽器,它接受來自supervisor的PROCESS_STATE_EXITED事件,並且會觸發crashmail的命令行調用。
PROCESS_STATE_EXITED事件是在一個supervisor的監控項對應的進程意外退出時會觸發的事件,這就使得一個進程出現意外退出的情況下會通知到crashmail。
而在command參數中-p參數配置了crashmail只會對名爲top的監控項作出響應,而-m參數中則配置了崩潰郵件會被髮送到的地址。

上線了這些配置,就可以在supervisor的web端看到配置的兩條內容,一條是top監控項,另外一條則是事件監聽器crashmail:
這裏寫圖片描述

啓動top,可以看到正常的top輸出:
這裏寫圖片描述

通過shell的ps指令找到top對應的進程id,使用kill -9的方式強行結束進程,這使得supervisor可以判定top進程異常退出:
這裏寫圖片描述

最後收到了崩潰報警的郵件:
這裏寫圖片描述

通過這樣的配置,就可以以郵件的方式來提醒你一個需要長期跑的進程掛掉的事實了。

(2)memmon
與crashmail類似,只不過memmon監控的不是進程是否還活着而是監控進程的內存佔用情況,這裏首先先給出一段測試腳本:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Filename : memoryleak.py
import time

class LeakTest(object):
    def __init__(self):
        print 'Object with id %d born here.' % id(self)

    def __del__(self):
        print 'Object with id %d dead here.' % id(self)

def doLeak():
    A = LeakTest()
    B = LeakTest()
    A.b = B
    B.a = A

if __name__ == '__main__':
    while True:
        for i in range(1, 10000):
            doLeak()
        time.sleep(5)

這段腳本在執行的過程中會出現內存泄露的情況,導致內存佔用越來越大,直至無法系統無法再分配內存導致程序異常退出,利用這段腳本我們可以配置一個memmon的事件監聽來發出內存泄露的告警。
supervisor的配置如下:

[program:memoryleak]
command=python /home/xmxjq/supervisord/samples/memoryleak.py
process_name=%(program_name)s
numprocs=1
directory=/tmp
umask=022
priority=999
autostart=false
autorestart=false
startsecs=10
startretries=3
exitcodes=0,2
stopsignal=TERM
stopwaitsecs=10
redirect_stderr=true

[eventlistener:memmon]
command=memmon -p memoryleak=1MB -m [email protected]
events=TICK_60
redirect_stderr=true

這裏memmon事件監聽器監聽的是TICK_60事件,也就是每60秒間隔觸發一次的事件,這使得memmon會每60秒檢測一次對應的監控項的佔用內存情況,這裏設置的是監控memoryleak監控項,如果其內存佔用超過1MB,則會重啓進程,併發送郵件進行告警。
同樣地上線這些配置,並啓用memoryleak進程:
這裏寫圖片描述

運行60s後,memoryleak進程的內存佔用已經達到了21M,超過了1MB的告警值,可以看到郵箱中收到了告警郵件:
這裏寫圖片描述

同時memoryleak的uptime也重置了,說明該進程已經被重啓了,使得該進程可以保持正常運行,同時也達到了內存泄露告警的目的。

利用superlance插件提供的其他工具也可以完成各種各樣的告警需求,擴展了supervisor的功能,這些工具的具體使用方法可以參考官方文檔:https://superlance.readthedocs.org/en/latest/index.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章