一、需求:
服务、进程等都被 Supervisor 管理,想实现 被管理的程序异常退出后,或者程序尝试重启多次失败后,Supervisor可以告警通知。
二、实现思路
Event 是在 Supervisor 3.0 引入的一个高级特性,如果只简单使用 Supervisor 管理进程,则不需要了解 Event。
但如果希望监控 Supervisor 管理的进程的各种状态(如: 启动、退出、失败、退出状态码 …)并支持告警,才需要了解Event。
利用 Supervisor 的 Event & Listener 功能进行订阅异常退出事件,并进行报警处理。
Supervisor 官方对其 Event 机制的描述是:一个进程的监控/通知框架。
该机制主要通过一个 event listener 订阅 event 通知实现。当被 Supervisor 管理的进程有特定行为的时候,supervisor 就会自动发出对应类型的 event。即使没有配置 listener,这些 event 也是会发的;如果配置了 listener 并监听该类型的 event,那么这个 listener 就会接收到该 event。 event listener 需要自己实现,并像 program 一样,作为 superviosr 的子进程运行。
三、具体配置实现
1、配置事件监听器
主管事件侦听器是通过 配置文件中的[eventlistener:x]
指定的。关于Supervisor [eventlistener:x]
在配置中允许的键方面,几乎与supervisor [program:x]
完全一样,只是Supervisor不遵循事件侦听器进程的“捕获模式”输出(即事件侦听器不能是 PROCESS_COMMUNICATIONS_EVENT
事件生成器)。因此,在事件``侦听器
的配置中指定stdout_capture_maxbytes
或 stderr_capture_maxbytes
是错误的。可以放入配置文件的事件侦听器部分的数量没有人为限制。
vim /etc/supervisord.d/eventlistener.ini
[eventlistener:mylistener]
command=/opt/my_custom_listener.py ; 自定义的监控程序
events=PROCESS_STATE_EXITED,PROCESS_STATE_FATAL,TICK_60 ; 监控事件
; 下面的配置和`[program:x]`完全一样
autostart=true
autorestart=true
log_stdout=true
log_stderr=true
stdout_logfile=/opt/supervisor_event_exited-stdout.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=3
buffer_size=10
stderr_logfile=/opt/supervisor_event_exited-stderr.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=3
2、配置监听器脚本
vim /opt/my_custom_listener.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
<