我们服务多是用 supervisor 启动的, 但监控多数是用 monit
, 如果我们能通过监测 supervisor 事件变化来做监控,就可以写一套通用的监控程序。
庆幸的是,supervisor 的 eventListener
支持我的设想。
这个监控程序需要用 supervisor 启动,类型不再是program
, 而是eventlistener
,这里有几个比较耗时的地方需要记录下。
- supervisor 有独特的通信协议,需要遵循,否则通讯不会被触发
1
2
3
4
5
6
| def write_stdout(self, s):
sys.stdout.write(s)
sys.stdout.flush()
write_stdout('READY\n') //类似开始握手
write_stdout('RESULT 2\nOK') //结束通讯
|
- 需要从标准输入端读取事件,而且他是个阻塞的事件模型
1
2
3
4
5
| while 1:
self.write_stdout('READY\n')
line = sys.stdin.readline()
do_some_thing()
self.write_stdout('RESULT 2\nOK')
|
1
2
3
4
5
6
7
8
| [eventlistener:alarm]
user=zj
command=/usr/bin/python /home/ymserver/bin/alarm/main.py
events=PROCESS_STATE_EXITED,PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL
# 记录控制台输出的日志位置
stderr_logfile=/home/zj/log/supervisor/alarm.err.log
stdout_logfile=/home/zj/log/supervisor/alarm.output.log
|
弄好 supervisor 配置,以及部署好代码之后,需要重启 supervisor 才会真正的订阅事件。
从此 supervisor 管理的程序一旦有 FATAL
,EXIT
等状态就会触发程序,程序中就会触发自定义的报警。
代码
Happy Hack!