[PYTHON] Benachrichtigen Sie Slack über Änderungen des Prozessstatus mithilfe des EventListener des Supervisors

Einführung

Führen Sie einen Supervisor und haben selten einen Prozess ausgefallen? Ich denke, es gibt eine Möglichkeit, es extern zu überwachen, aber ich habe versucht, Slack über die Statusänderung des Prozesses mit EventListener of Supervisor zu informieren, an dem ich schon lange interessiert war.

Was ich getan habe

Konfigurationsdatei erstellen

Erstellen Sie eine Einstellungsdatei wie unten gezeigt.

/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 Wir möchten über alle Änderungen des Prozessstatus informiert werden. Geben Sie daher "PROCESS_STATE" an.

environment Legen Sie die URL für Incoming WebHook in der Umgebungsvariablen fest, um Slack zu benachrichtigen.

Referenz-URL

Erstellen eines Ereignis-Listeners

Der endgültige Code sieht folgendermaßen aus:

/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()

Benachrichtigungsbild

supervisor_slack.png

Referenz-URL

abschließend

Es gibt ein Plug-In namens superlance, wenn eine E-Mail-Benachrichtigung akzeptabel ist, aber OP25B Ich habe die E-Mail an Google Mail aufgrund eines Problems nicht erhalten, daher habe ich Slack benachrichtigt. Da der Einsatz von Supervisor zugenommen hat, möchte ich ihn weiterhin auf verschiedene Arten anwenden.

Recommended Posts

Benachrichtigen Sie Slack über Änderungen des Prozessstatus mithilfe des EventListener des Supervisors
Benachrichtigen Sie Slack über GitHub Push
Benachrichtigen Sie Slack regelmäßig über verpasste Backlog-Probleme
Benachrichtigen Sie Slack darüber, wie Keras lernt
Ich habe versucht, Slack über das Update von Redmine zu informieren