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