supervisor+釘でオンラインアラームを実現


1、背景紹介
オンラインプロジェクトの安定性を確保するためには、supervisorが失敗したプロセスを複数回再開し、関連技術者がタイムリーに処理できるように釘を打つ警告が必要です.具体的な効果は以下の通りです.
2、基礎知識
ここではsupervisorや釘ロボットに触れたことがない読者の視覚障害者について、よく知っていれば、直接スキップすることができます.1、supervisorって何?supervisorはpythonが作成した信頼できるプロセス管理ツールで、管理するサブプロセスを監視し、プロセスに予期せぬcrashが発生した場合、実行を再開しようとします(最大引き揚げ回数を設定できますが、一般的には失敗したプロセスを無限に引き上げようとはしません).その大まかな役割を知るだけでいいので、具体的にはsupervisorの公式サイトを参照してください.
2、くぎロボットとは何ですか.釘ロボットは、釘ソフトウェアに基づいて、釘群の機能を拡張します.クラスタロボットはサードパーティサービスの情報をクラスタチャットに集約し,自動化された情報同期を実現することができる.ロボットの種類はgitlabロボット、githubロボット、coodingロボットなどいろいろありますが、ここではカスタムロボットを使っています.
3、カスタム釘ロボットの配置
1、釘付けソフトを開き、ロボット管理を見つける
2、ロボット管理をクリックすると、ロボット管理メニューが表示されます.
残りの手順は公式サイトで詳しく説明されているので、ここを突くのはもうやめます.
最後にaccessを手に入れますtokenのurlリンクは、このurlに対してpostリクエストを開始することによって警告されます.これは次のようなものです.
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX

(ps:ip制限ポリシーを採用)
4、supervisorのeventlistenerを配置する
まず、supervisor eventlistnerのプロファイルの内容を見てみましょう.
[eventlistener:monitor]
command=/home/zero/supervisord.d/monitor.py
events=PROCESS_STATE_FATAL
stdout_logfile=/var/log/supervisor/script_log/monitor.log
stderr_logfile=/var/log/supervisor/script_log/[email protected]

上記の構成の第1行:[eventlistener:monitor]を簡単に分析すると、supervisorに接触したことのある学生はみな知っているが、一般的にsupervisorのサブプロセスの構成の第1行は一般的に[program:プロセス名]であり、ここでは[eventlistener:リスナー名]の形であり、これはイベントリスナーに関する構成であることを示している.リスナーのプロセス名はmonitorです.2行目:command=/home/zero/supervisord.d/monitor.py、このプロセスを実行するコマンドを表します.ここではしばらく無視します.3行目:events=PROCESS_STATE_FATALは、傍受者が傍受するイベントを表します.supervisor 4.1のこのバージョンでは、現在23のイベントがサポートされています.
PROCESS_STATE
PROCESS_STATE_STARTING
PROCESS_STATE_RUNNING
PROCESS_STATE_BACKOFF
PROCESS_STATE_STOPPING
PROCESS_STATE_EXITED
PROCESS_STATE_STOPPED
PROCESS_STATE_FATAL
PROCESS_STATE_UNKNOWN
REMOTE_COMMUNICATION
PROCESS_LOG_STDOUT
PROCESS_LOG_STDERR
PROCESS_COMMUNICATION_STDOUT
PROCESS_COMMUNICATION_STDERR
SUPERVISOR_STATE_CHANGE
SUPERVISOR_STATE_CHANGE_RUNNING
SUPERVISOR_STATE_CHANGE_STOPPING
TICK_5
TICK_60
TICK_3600
PROCESS_GROUP
PROCESS_GROUP_ADDED
PROCESS_GROUP_REMOVED

詳しくはこちらをご覧ください.ここで注目しているのはPROCESSです.STATE_FATAL事件、この事件はどういう意味ですか?以下は公式サイトの洋文です.
Indicates a process has moved from the BACKOFF state to the FATAL state. 
This means that Supervisor tried startretries number of times unsuccessfully to start the process, and gave up attempting to restart it.

          ,   supervisor     BACKOFF     FATAL  。
   supervisor  (    ,      )       ,    ,    

4行目、5行目:傍受者が傍受中に標準出力ログ、エラーログの出力位置を表す
5、eventlistenerリスニングスクリプトの作成
ここでは、eventlistenerの真のリスニングの真の実行者、すなわち、前述の/home/zero/supervisordを構成するcommand構成項目について説明します.d/monitor.pyスクリプト.理論的にはリスニングスクリプトは任意の言語で記述できるが、supervisor自体はpythonで記述されているため、supervisorという名前が提供されている.childutilsのモジュール.これによりpythonスクリプトを使用してリスナーを記述するのは異常に簡単です.公式サイトには簡単なdemoが提供されていますが、私たちがしなければならないのはdemoに対して2回の開発を行うことです.コードは以下の通りです.
#!/usr/bin/env python
import sys
import urllib2
import json


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 main():
    while 1:
        # transition from ACKNOWLEDGED to READY
        write_stdout('READY
') # read header line and print it to stderr line = sys.stdin.readline() # read event payload and print it to stderr headers = dict([ x.split(':') for x in line.split() ]) notifyData = sys.stdin.read(int(headers['len'])) title = "warning online" content = "### supervisor sub process failed
" + "> ![screenshot]( url )
" + "> " + notifyData +"
" url = " " headers = {'Content-Type':'application/json'} body = {'msgtype':'markdown', 'markdown':{'title':title, 'text':content, 'at':{'isAtAll':'true'}}} request = urllib2.Request(url,headers=headers,data=json.dumps(body)) response = urllib2.urlopen(request) # transition from READY to ACKNOWLEDGED write_stdout('RESULT 2
OK') if __name__ == '__main__': main()

(ps:ここではmarkdown形式をサポートするアラーム内容を使用しています)
よし、配置完了、enjoy!!!個人の能力が限られているので、漏れがあれば、教えてあげます.
6、参考資料
supervisor公式サイトhttp://www.supervisord.org/index.html釘付けドキュメントロボットの公式サイトドキュメントhttps://ding-doc.dingtalk.com/doc#/serverapi2/krgddi