Supervisor事件机制

Supervisor的事件机制是其3.0版本引入的高级特性,主要用于进程状态变化的监控和告警。以下是核心要点:

一、事件机制概述

  1. 基本原理:Supervisor在工作时会生成各种类型的事件通知,通过eventlistener实现订阅和处理
  2. 工作模式:采用发布-订阅模型,即使没有配置listener,事件也会生成;配置listener后才能接收处理

二、事件类型分类

Supervisor支持27种事件类型,主要分为:

  1. 进程状态事件
    PROCESS_STATE_STARTING:进程启动中
    PROCESS_STATE_RUNNING:进程运行中
    PROCESS_STATE_EXITED:进程退出(可区分正常/异常退出)
    PROCESS_STATE_FATAL:进程启动失败且达到重试上限
  2. 日志事件
    PROCESS_LOG_STDOUT:标准输出日志
    PROCESS_LOG_STDERR:错误输出日志
  3. 定时事件
    TICK_60:每60秒触发一次

三、事件监听器配置

[eventlistener:mylistener]
command=/path/to/listener.py  # 监听器程序路径
events=PROCESS_STATE_EXITED,TICK_60  # 监听的事件类型
buffer_size=10  # 事件缓冲区大小
autostart=true
autorestart=true

四、监听器实现要点

  1. 通信协议
    • 通过stdin接收事件,stdout返回处理结果
    • 消息格式包含header和payload,header包含事件类型和payload长度
  2. 状态管理
    READY:准备接收事件
    BUSY:处理事件中
    • 处理完成后需返回RESULT 2\nOKRESULT 4\nFAIL

五、Python实现示例

import sys
from supervisor import childutils

def main():
    while True:
        headers, payload = childutils.listener.wait()
        # 处理事件逻辑
        childutils.listener.ok()  # 返回处理成功

if __name__ == '__main__':
    main()

六、典型应用场景

  1. 进程异常退出告警
  2. 进程启动时执行依赖任务
  3. 状态同步到外部监控系统
  4. 定时任务触发

七、注意事项

  1. 监听器不能使用stdout_capture_maxbytes配置
  2. 多个事件类型用逗号分隔
  3. 建议设置合理的buffer_size防止事件丢失

通过事件机制,Supervisor实现了更灵活的进程监控能力,特别适合需要实时响应状态变化的运维场景。

滚动至顶部