Do you run a supervisor and rarely have a process down? I think there is a way to monitor it externally, but I tried to notify Slack of the state change of the process using the EventListener of Supervisor, which I had been interested in for a long time.
Create a configuration file as shown below.
/etc/supervisord.d/process_state_event_listener.conf
[eventlistener:process_state_event_listener]
command=python /path/to/process_state_event_listener.py
events=PROCESS_STATE
redirect_stderr=false
stdout_logfile=/var/log/supervisor/event_listener_stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=5
stderr_logfile=/var/log/supervisor/event_listener_stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=5
environment=SLACK_WEB_HOOK_URL="https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxxxxxx"
events
We want to be notified of all process state changes, so specify PROCESS_STATE.
environment Set the URL for Incoming WebHook in your environment variable to notify Slack.
The final code looks like this:
/path/to/process_state_event_listener.py
import sys
import os
from supervisor import childutils
from datetime import datetime
import slackweb
def main():
    while True:
        run_forever()
def run_forever():
    headers, payload = childutils.listener.wait(sys.stdin, sys.stdout)
    eventname = headers['eventname']
    payload_header, data = childutils.eventdata(payload+'\n')
    childutils.listener.ok(sys.stdout)
    color = "good"
    if eventname in ['PROCESS_STATE_BACKOFF', 'PROCESS_STATE_EXITED', 'PROCESS_STATE_FATAL', 'PROCESS_STATE_UNKNOWN']:
        color = "danger"
    attachment = {
        "title": "event",
        "text": eventname,
        "color": color,
        "fields": [{
            "title": "datetime",
            "value": datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        }, {
            "title": "hostname",
            "value": os.uname()[1]
        }]
    }
    if 'processname' in payload_header:
        attachment["fields"].append({
            "title": "process",
            "value": payload_header['processname']
        })
    if 'expected' in payload_header:
        attachment["fields"].append({
            "title": "expected",
            "value": payload_header['expected']
        })
    if 'SLACK_WEB_HOOK_URL' in os.environ:
        slack_url = os.environ['SLACK_WEB_HOOK_URL']
        slack = slackweb.Slack(url=slack_url)
        slack.notify(attachments=[attachment])
if __name__ == '__main__':
    main()

--POST message from python to Slack via incoming webhook --Qiita
There is a plugin called superlance if you want to use email notification, but OP25B I didn't receive the email on gmail due to a problem, so I notified Slack. Since the use of Supervisor has increased, I would like to continue to apply it in various ways.
Recommended Posts