Supervisor / supervisor

Supervisor process control system for Unix (supervisord)
http://supervisord.org
Other
8.46k stars 1.24k forks source link

from_state:RUNNING can't be sended by http #1156

Open zxhubo opened 6 years ago

zxhubo commented 6 years ago

I hava used supervisor to manage rsyslog, I hope when rsyslog process state is changed, listener can send the payload to the dingding(dingding is one of a office im tool by alibaba )。 the python code is :

coding=UTF-8

import sys import requests

url = "https://oapi.dingtalk.com/robot/send?access_token=a47c28f0618e46e3acd4afd273f1b90c27fb28cebcbd6ec2efe86bbd913f8d91" data_test = "{ \"msgtype\": \"text\", \"text\": {\"content\": \"test\"}}".decode("utf-8") headers = { "Content-Type": "application/json" } response_data="{\"errmsg\":\"ok\",\"errcode\":0}" def write_stdout(s):

only eventlistener protocol messages may be sent to stdout

sys.stdout.write(s)
sys.stdout.flush()

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

def post_data(url, data):

write_stderr("[*] start send data *"+data+" * to dingding \n")
req = requests.post(url, data=data, headers=headers)
write_stderr("[*]"+req.text+"\n")
# print req.text
if req.text == response_data:
    write_stderr("[*] send data to dingding is successful ! \n")
else:
    write_stderr("[*] send data to dingding is failed ! \n")

def main(): while True:

    # 进入READY状态
    write_stdout('READY\n')
    # 读取事件通知的header
    line = sys.stdin.readline()
    write_stderr(line)
    # 获取body长度,读取body
    headers = dict([x.split(':') for x in line.split()])
    data = sys.stdin.read(int(headers['len']))
    write_stderr("[**]"+data + '\n')
    data_dict = dict([x.split(':') for x in data.split()])
    if data_dict.has_key("processname") and data_dict["processname"] == "rsyslog":
        body = "{ \"msgtype\": \"text\", \"text\": {\"content\":\"" + data + "\"}}"
        write_stderr("[*] body is :" + body + "\n")
        body = body.decode("utf-8")
        post_data(url, body)
    # 发送OK进入ACKNOWLEDGED状态
    write_stdout('RESULT 2\nOK')

if name == 'main':

main()

I use command sudo supervisorctl :

admin@clsapp01-prd-hz:/etc/supervisor/python$ sudo supervisorctl sudo: unable to resolve host clsapp01-prd-hz mylistener RUNNING pid 18583, uptime 1:21:59 rsyslog RUNNING pid 18584, uptime 1:21:59 supervisor> But when I use command sudo service supervisor restart to restart supervisor,,I can find log in error log: ver:3.0 server:supervisor serial:109 pool:mylistener poolserial:109 eventname:TICK_5 len:15 []when:1539166135 ver:3.0 server:supervisor serial:110 pool:mylistener poolserial:110 eventname:PROCESS_STATE_STOPPING len:66 []processname:rsyslog groupname:rsyslog from_state:RUNNING pid:11708 [] body is :{ "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:RUNNING pid:11708"}} [] start send data { "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:RUNNING pid:11708"}} to dingding ver:3.0 server:supervisor serial:0 pool:mylistener poolserial:0 eventname:PROCESS_STATE_STARTING len:70 []processname:mylistener groupname:mylistener from_state:STOPPED tries:0 ver:3.0 server:supervisor serial:1 pool:mylistener poolserial:1 eventname:PROCESS_STATE_STARTING len:64 []processname:rsyslog groupname:rsyslog from_state:STOPPED tries:0 [] body is :{ "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:STOPPED tries:0"}} [] start send data { "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:STOPPED tries:0"}} to dingding [] send data to dingding is successful ! ver:3.0 server:supervisor serial:2 pool:mylistener poolserial:2 eventname:PROCESS_STATE_RUNNING len:73 []processname:mylistener groupname:mylistener from_state:STARTING pid:16145 ver:3.0 server:supervisor serial:3 pool:mylistener poolserial:3 eventname:PROCESS_STATE_RUNNING len:67 []processname:rsyslog groupname:rsyslog from_state:STARTING pid:16146 [] body is :{ "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:STARTING pid:16146"}} [] start send data { "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:STARTING pid:16146"}} to dingding [] send data to dingding is successful ! ver:3.0 server:supervisor serial:4 pool:mylistener poolserial:4 eventname:TICK_5 len:15 [*]when:1539166140 then ,the dingding talk has received four massage: processname:rsyslog groupname:rsyslog from_state:RUNNING pid:19866 processname:rsyslog groupname:rsyslog from_state:STOPPING pid:19866 processname:rsyslog groupname:rsyslog from_state:STOPPED tries:0 processname:rsyslog groupname:rsyslog from_state:STARTING pid:3371 from the log we can say : [] body is :{ "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:RUNNING pid:11708"}} can't send to dingding . the log is :[] start send data { "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:RUNNING pid:11708"}} * to dingding .

however ,I can use shell command curl to send the massage: admin@clsapp01-prd-hz:/etc/supervisor/conf.d$ admin@clsapp01-prd-hz:/etc/supervisor/conf.d$ curl 'https://oapi.dingtalk.com/robot/send?access_token=a47c28f0618e46e3acd4afd273f1b90c27fb28cebcbd6ec2efe86bbd913f8d91' \

-H 'Content-Type: application/json' \ -d '{ "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:RUNNING pid:4004"}}' {"errmsg":"ok","errcode":0}admin@clsapp01-prd-hz:/etc/supervisor/conf.d$ admin@clsapp01-prd-hz:/etc/supervisor/conf.d$ the dingding can receive this massage,but the python code can't send this massage:[*] body is :{ "msgtype": "text", "text": {"content":"processname:rsyslog groupname:rsyslog from_state:RUNNING pid:11708"}} can't send to dingding .

Why ? My English is poor,can you understand what I say and help me.

zxhubo commented 6 years ago

the listener can send massage to dingding by http ,but can't send the massage when "from_state:RUNNING"

zxhubo commented 6 years ago

now ,I say clearly once again, I hava code a python to listen the rsyslog process, when the eventname is "PROCESS_STATE_STOPPING",can't do anything by python code ,for example send message to antwhere by http .for example: if the code is : if header["eventname"] == "PROCESS_STATE_STOPPING": write_stderr(str(type(pheader)) + "\n") write_stderr(str(pheader) + "\n") write_stderr(str(type(ppayload)) + "\n") write_stderr(str(ppayload) + "\n") post_data(URL, data_test) childutils.listener.ok(sys.stdout) continue can write the message to the log but can't execute the code :post_data(URL, data_test). if code is : if header["eventname"] == "PROCESS_STATE_STOPPING": childutils.listener.ok(sys.stdout) write_stderr(str(type(pheader)) + "\n") write_stderr(str(pheader) + "\n") write_stderr(str(type(ppayload)) + "\n") write_stderr(str(ppayload) + "\n") post_data(URL, data_test) continue all of the code can't execute ,so I guess the state "PROCESS_STATE_STOPPING" is a sepecial eventname ? right ?