97色精品视频在线观看免费,日韩欧美亚洲每日更新网,国产精品色婷婷99久久精品,99e热久久免费精品首页

Supervisor這個監控告警功能你用過嗎?

2024-11-08 15:11:19 Jinyu

Supervisor簡介

Supervisor是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變為后臺daemon,并監控進程狀態,異常退出時能自動重啟。它是通過fork/exec的方式把這些被管理的進程當作supervisor的子進程來啟動,這樣只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去即可。也實現當子進程掛掉的時候,父進程可以準確獲取子進程掛掉的信息的,可以選擇是否自己啟動和報警。supervisor還提供了一個功能,可以為supervisord或者每個子進程,設置一個非root的user,這個user就可以管理它對應的進程

今天要說的不是supervisor,關于supervisor的使用,百度一大堆,這里不多贅述,今天重點要說的是supervisor事件監控

Event & Listener

Event 是在 Supervisor 3.0 引入的一個高級特性,如果只簡單使用 Supervisor 管理進程,則不需要了解 Event

但如果希望監控 Supervisor 管理的進程的各種狀態(如: 啟動、退出、失敗、退出狀態碼 …)并支持告警,才需要了解Event

利用 Supervisor 的 Event & Listener 功能進行訂閱異常退出事件,并進行報警處理

Supervisor 官方對其 Event 機制的描述是:一個進程的監控/通知框架

該機制主要通過一個 event listener 訂閱 event 通知實現。當被 Supervisor 管理的進程有特定行為的時候,supervisor 就會自動發出對應類型的 event。即使沒有配置 listener,這些 event 也是會發的;如果配置了 listener 并監聽該類型的 event,那么這個 listener 就會接收到該 event。event listener 需要自己實現,并像 program 一樣,作為 superviosr 的子進程運行

具體配置實現

配置事件監聽器

主管事件偵聽器是通過 配置文件中的[eventlistener:x]指定的。關于Supervisor [eventlistener:x] 在配置中允許的鍵方面,幾乎與supervisor [program:x]完全一樣,只是Supervisor不遵循事件偵聽器進程的“捕獲模式”輸出(即事件偵聽器不能是 PROCESS_COMMUNICATIONS_EVENT事件生成器)。因此,在事件偵聽器的配置中指定stdout_capture_maxbytes或 stderr_capture_maxbytes是錯誤的。可以放入配置文件的事件偵聽器部分的數量沒有人為限制

vim /etc/supervisord.d/eventlistener.ini
[eventlistener:mylistener]
command=/opt/my_custom_listener.py   自定義的監控程序
events=PROCESS_STATE_EXITED,PROCESS_STATE_FATAL,TICK_60   監控事件
; 下面的配置和`[program:x]`完全一樣
autostart=true
autorestart=true
log_stdout=true
log_stderr=true
stdout_logfile=/opt/supervisor_event_exited-stdout.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=3
buffer_size=10
stderr_logfile=/opt/supervisor_event_exited-stderr.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=3

配置監聽器腳本

vim /opt/my_custom_listener.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from supervisor import childutils


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\n')

        # read header line and print it to stderr
        line = sys.stdin.readline()
        write_stderr(line)

        # read event payload and print it to stderr
        headers = dict([ x.split(':'for x in line.split() ])
        data = sys.stdin.read(int(headers['len']))
        write_stderr(data)

        # transition from READY to ACKNOWLEDGED
        write_stdout('RESULT 2\nOK')


        # 使用supervisor的childutils解析
        headers, payload = childutils.listener.wait(sys.stdin, sys.stdout)
        pheaders, pdata = childutils.eventdata(payload + '\n')
        # 當 program 的退出碼為對應配置中的 exitcodes 值時, expected=1; 否則為0
        if int(pheaders.get('expected'1)):
            childutils.listener.ok(sys.stdout)
            continue
        else:  # 0, 異常退出,根據 pheaders 的值發送報警處理
            ############################
            pass  # 你的自定制發送報警邏輯 #
            with open('/opt/sup.log''a'as f:  # 這里寫入文件作為報警簡單模擬
                f.write(str(pheaders))
                f.write(str(pdata))
                f.write('\n')
            ############################

            # 向 stdout 寫入"RESULT\nOK",并進入下一次循環
            childutils.listener.ok(sys.stdout)

if __name__ == '__main__':
    main()

這里告警的方式可以自己定義,可以郵件,也可以通過webhook調用im接口告警

實際上supervisor自帶有監控利器——superlance

superlance

superlance是基于supervisor的事件機制實現的一系列命令行的工具集,它實現了許多supervisor本身沒有實現的實用的進程監控和管理的特性,包括內存監控,http接口監控,郵件和短信通知機制等。同樣的,superlance本身也是使用python編寫的

安裝

由于superlance是一個python包,安裝起來十分簡單,通過easy_install或者pip就可以簡單的安裝:

easy_install superlance
pip install superlance

當然也可以到github上獲得最新的源碼(https://github.com/Supervisor/superlance)并安裝

python setup.py install

安裝后執行以下httpok命令,如果該命令存在,則說明superlance已經正常安裝了

superlance組件

superlance是一系列命令行工具的集合,其包括以下這些命令:

  • httpok 通過定時對一個HTTP接口進行GET請求,根據請求是否成功來判定一個進程是否處于正常狀態,如果不正常則對進程進行重啟。

  • crashmail 當一個進程意外退出時,發送郵件告警。

  • memmon 當一個進程的內存占用超過了設定閾值時,發送郵件告警。

  • crashmailbatch 類似于crashmail的告警,但是一段時間內的郵件將會被合成起來發送,以避免郵件轟炸。

  • fatalmailbatch 當一個進程沒有成功啟動多次后會進入FATAL狀態,此時發送郵件告警。與crashmailbatch一樣會進行合成報警。

  • crashsms 當一個進程意外退出時發送短信告警,這個短信也是通過email網關來發送的

郵件告警

superlance是使用sendmail來發送郵件的,所以需要安裝sendmail

apt install sendmail

安裝完成后配置superlance

cat /etc/supervisor/conf.d/redis.conf
[program:redis]
command=/usr/local/redis/bin/redis-server /home/redis/etc/redis.conf
directory=/usr/local/redis/bin/
user=redis
autostart = true
autorestart = true
#startsecs = 30
stopwaitsecs = 1
stopsignal = TERM
redirect_stderr = true
[eventlistener:redis_monitor]
command=crashmail -p redis -m xxx@qq.com
events=PROCESS_STATE_EXITED
redirect_stderr=false

首先配置了redis進程啟動項目,接著配置了一個名為redis_monitor的事件監聽器,它接受來自supervisor的PROCESS_STATE_EXITED事件,并且會觸發crashmail的命令行調用。

PROCESS_STATE_EXITED是在一個supervisor的監控項對應的進程意外退出時會觸發的事件,這就使得一個進程出現意外退出的情況下會通知到crashmail。

command參數中-p參數配置了crashmail只會對名為redis的監控項作出響應,而-m參數中則配置了崩潰郵件會被發送到的地址

靈活利用superlance,可以完成各種告警需求,實現各種進程監控


我要咨詢
主站蜘蛛池模板: 读书| 博客| 敦化市| 莱西市| 昌乐县| 晋江市| 海安县| 天津市| 丰镇市| 万源市| 麻城市| 鹿泉市| 儋州市| 海盐县| 三河市| 和静县| 饶平县| 商都县| 漯河市| 康保县| 莒南县| 兴安盟| 内乡县| 皋兰县| 建始县| 育儿| 招远市| 双柏县| 塘沽区| 长宁区| 永定县| 沙洋县| 阳东县| 府谷县| 祁连县| 黄大仙区| 临朐县| 卫辉市| 宜章县| 新宁县| 理塘县|