superlance介绍
superlance就是基于supervisor的事件机制实现的一系列命令行的工具集,它实现了许多supervisor本身没有实现的实用的进程监控和管理的特性,包括内存监控,http接口监控,邮件和短信通知机制等。同样的,superlance本身也是使用python编写的
superlance命令
superlance是一系列命令行工具的集合,其包括以下这些命令:
httpok
通过定时对一个HTTP接口进行GET请求,根据请求是否成功来判定一个进程是否处于正常状态,如果不正常则对进程进行重启。
crashmail
当一个进程意外退出时,发送邮件告警。
memmon
当一个进程的内存占用超过了设定阈值时,发送邮件告警。
crashmailbatch
类似于crashmail的告警,但是一段时间内的邮件将会被合成起来发送,以避免邮件轰炸。
fatalmailbatch
当一个进程没有成功启动多次后会进入FATAL状态,此时发送邮件告警。与crashmailbatch一样会进行合成报警。
crashsms
当一个进程意外退出时发送短信告警,这个短信也是通过email网关来发送的
1.当supervisord启动的时候,如果我们的listener配置为autostart=true的话,listener就会作为supervisor的子进程被启动。2.listener被启动之后,会向自己的stdout写一个"READY"的消息,此时父进程也就是supervisord读取到这条消息后,会认为listener处于就绪状态。3.listener处于就绪状态后,当supervisord产生的event在listener的配置的可接受的events中时,supervisord就会把该event发送给该listener。4.listener接收到event后,我们就可以根据event的head,body里面的数据,做一系列的处理了。我们根据event的内容,判断,提取,报警等等操作。5.该干的活都干完之后,listener需要向自己的stdout写一个消息"RESULTnOK",supervisord接受到这条消息后。就知道listener处理event完毕了。
Supervisord支持的Event
PROCESS_STATE 进程状态发生改变
PROCESS_STATE_STARTING 进程状态从其他状态转换为正在启动(Supervisord的配置项中有startsecs配置项, 是指程序启动时需要程序至少稳定运行x秒才认为程序运行正常,在这x秒中程序状态为正在启动)
PROCESS_STATE_RUNNING 进程状态由正在启动转换为正在运行
PROCESS_STATE_BACKOFF 进程状态由正在启动转换为失败
PROCESS_STATE_STOPPING 进程状态由正在运行转换为正在停止
PROCESS_STATE_EXITED 进程状态由正在运行转换为退出
PROCESS_STATE_STOPPED 进程状态由正在停止转换为已经停止(exited和stopped的区别是exited是程序自行退出,而stopped为人为控制其退出)
PROCESS_STATE_FATAL 进程状态由正在运行转换为失败
PROCESS_STATE_UNKNOWN 未知的进程状态
REMOTE_COMMUNICATION 使用Supervisord的RPC接口与Supervisord进行通信
PROCESS_LOG 进程产生日志输出,包括标准输出和标准错误输出
PROCESS_LOG_STDOUT 进程产生标准输出
PROCESS_LOG_STDERR 进程产生标准错误输出
PROCESS_COMMUNICATION 进程的日志输出包含 和
PROCESS_COMMUNICATION_STDOUT 进程的标准输出包含 和
PROCESS_COMMUNICATION_STDERR 进程的标准错误输出包含 和
SUPERVISOR_STATE_CHANGE_RUNNING Supervisord 启动
SUPERVISOR_STATE_CHANGE_STOPPING Supervisord 停止
TICK_5 每隔5秒触发
TICK_60 每隔60秒触发
TICK_3600 每隔3600触发
PROCESS_GROUP Supervisord的进程组发生变化
PROCESS_GROUP_ADDED 新增了Supervisord的进程组
PROCESS_GROUP_REMOVED 删除了Supervisord的进程组
安装superlance
也是python程序,直接pip 安装
pip install superlance
既然有了上面的event特性,下面就配置一个发邮件报警,当nginx莫名其妙的重启后 就立刻发邮件通知。
这里在说一下,centos下如何用命令行直接发邮件的,我一直都没有用过默认 自带的,也不好用。推荐一个比较好用的。
sendEmail,用perl语言写好的 也都封装好了,只需要提供发件人 邮箱账号 密码 smtp服务 收件人 就可以了。
先配置一下
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gztar zxvf sendEmail-v1.56.tar.gz
cp sendEmail-v1.56/sendEmail /usr/bin/sendemail
ok,发邮件测试一下,这里我把邮箱信息隐藏一下了.....
sendemail -f 发件人邮箱 -t 收件人邮箱 -s 发件人邮箱smtp服务器 -u"sendEmail"-m"haha"-xu 发件人邮箱 -xp 发件人邮箱密码
-f 发件人-t 收件人-s 发件人smtp服务器-u 主题-m 内容-xu 发件人用户名-xp 发件人密码
我这里用的163发的 qq邮箱收件的,测试没啥问题的。
ok 现在要做的就是配置一个supervisor配置文件,来一直监听进程的状态变化
[root@test /]# cat /etc/supervisor/config.d/mail.conf
[eventlistener:crashmail-exited]
command=crashmail -a -s "/usr/bin/sendemail -f xxxxxx@163.com -t xxxxxx@qq.com -s smtp.163.com -u 'nginx' -xu xxxxxxx@163.com -xp xxxxxxxx -m" -m xxxxxxxx@qq.com
events=PROCESS_STATE_EXITED
redirect_stderr=false
添加好一个进程配置文件后,supervisorctl reload 重启一下
已经是两个进程在running了
下面测试一下 kill 掉nginx进程
ps aux | grep nginx
kill -91765917660
然后看一下supervisor
此时 nginx pid已经变化,说明kill之后 又被拉起来了。