[PYTHON] Notifier Slack des changements d'état de processus à l'aide d'EventListener de Supervisor

introduction

Dirigez-vous un superviseur et avez rarement un processus en panne? Je pense qu'il existe un moyen de le surveiller en externe, mais j'ai essayé d'informer Slack du changement d'état du processus en utilisant EventListener de Supervisor, ce qui m'intéressait depuis longtemps.

Ce que j'ai fait

Créer un fichier de configuration

Créez un fichier de paramètres comme indiqué ci-dessous.

/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 Nous voulons être informés de tous les changements d'état du processus, spécifiez donc PROCESS_STATE.

environment Définissez l'URL du WebHook entrant dans la variable d'environnement pour notifier Slack.

URL de référence

Créer un écouteur d'événements

Le code final ressemble à ceci:

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

Image de notification

supervisor_slack.png

URL de référence

en conclusion

Il existe un plug-in appelé superlance si la notification par e-mail est acceptable, mais OP25B Je n'ai pas reçu l'e-mail à Gmail en raison d'un problème, j'ai donc averti Slack. Étant donné que l'utilisation de Supervisor a augmenté, j'aimerais continuer à l'appliquer de diverses manières.

Recommended Posts

Notifier Slack des changements d'état de processus à l'aide d'EventListener de Supervisor
Notifier Slack de l'envoi de GitHub
Informer régulièrement Slack des problèmes de backlog manqués
Informer Slack de la manière dont Keras apprend
J'ai essayé d'informer Slack de la mise à jour de Redmine