Supervisor 的 Event & Listener进程监控告警

事件是Supervisor在3.0版本中引入的高级功能。如果您只是想将Supervisor用作重新启动崩溃进程的机制,或者用作手动控制进程状态的系统,则不需要理解事件。如果您想将Supervisor作为流程监控/通知框架的一部分,您确实需要了解事件。

file

Supervisor为一个名为“事件侦听器”的专门编写的程序(作为子进程运行)提供了一种订阅“事件通知”的方法。事件通知意味着发生了与supervisord控制的子流程或supervisord本身有关的事情。事件通知被分组为类型,以便事件侦听器可以订阅事件通知的有限子集。即使没有配置侦听器,Supervisor也会在运行时不断发出事件通知。如果侦听器配置并订阅了在supervisord生存期内发出的事件类型,则会通知该侦听器。

配置事件侦听器

http://supervisord.org/configuration.html

不要在[eventlistener:x]节中设置redirect_stderr=true。事件监听器使用stdout和stdin与supervisord进行通信。如果重定向stderr,则stderr的输出将干扰事件侦听器协议。

import sys

from supervisor.childutils import listener

def write_stdout(s):
    sys.stdout.write(s)
    sys.stdout.flush()

def write_stderr(s):
    sys.stderr.write(s)
    sys.stderr.flush()

def main():
    while True:
        headers, body = listener.wait(sys.stdin, sys.stdout)
        body = dict([pair.split(":") for pair in body.split(" ")])

        write_stderr("Headers: %r\n" % repr(headers))
        write_stderr("Body: %r\n" % repr(body))

        if headers["eventname"] == "PROCESS_STATE_STOPPING":
            write_stderr("Process state stopping...\n")

        # acknowledge the event
        write_stdout("RESULT 2\nOK")

不能简单地运行你的脚本来测试它。supervisorctl.conf文件有一些特殊的env变量,如手动运行脚本时不会出现的事件
如果你想测试它,那么就给你的监听器添加一些日志:

[eventlistener:theeventlistenername]
command=python /home/jack/listener.py    ; the program (relative uses PATH, can take args)
process_name=%(program_name)s_%(process_num)s       ; process_name expr (default %(program_name)s)
numprocs=1                           ; number of processes copies to start (def 1)
events=PROCESS_STATE           ; event notif. types to subscribe to (req'd)
autorestart=true
stderr_logfile=errorlogfile
stdout_logfile=applogfile

您还可以调试headers变量,并可以检查您正在接收的数据。
启用日志记录后,您可以在stderr_logfile日志文件上使用tail-f error.log.path进行测试。

 Headers: "{'ver': '3.0', 'poolserial': '4', 'len': '71', 'server': 'supervisor', 'eventname': 'PROCESS_STATE_RUNNING', 'serial': '4', 'pool': 'mylistener'}" 
 Body: "{'from_state': 'STARTING', 'processname': 'someprocess', 'pid': '345', 'groupname': 'someprocess'}" 
 Process state running...

kill -9进程时,上面的输出会出现在日志中。
此外,stdout_logfile将记录此类信息:

RESULT 2
OKREADY
RESULT 2
OKREADY
RESULT 2
OKREADY
RESULT 2
OKREADY
RESULT 2
OKREADY

参考链接:https://stackoverflow.com/questions/41594534/supervisor-events-how-to-listen-for-process-state-stopped-events-for-all-or-spe

AIGC代码生成模型之Salesforce/codegen-6B-mono
shell bash中如何去掉字符串中空格?

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

50 + 72 =

ajax-loader