久久久久无码精品,亚洲国产精品国语在线,国产成人精品热玖玖玖,国产福利一区二区在线观看

Supervisor這個(gè)監(jiān)控告警功能你用過(guò)嗎?

2024-11-08 15:11:19 Jinyu

Supervisor簡(jiǎn)介

Supervisor是用Python開(kāi)發(fā)的一套通用的進(jìn)程管理程序,能將一個(gè)普通的命令行進(jìn)程變?yōu)楹笈_(tái)daemon,并監(jiān)控進(jìn)程狀態(tài),異常退出時(shí)能自動(dòng)重啟。它是通過(guò)fork/exec的方式把這些被管理的進(jìn)程當(dāng)作supervisor的子進(jìn)程來(lái)啟動(dòng),這樣只要在supervisor的配置文件中,把要管理的進(jìn)程的可執(zhí)行文件的路徑寫(xiě)進(jìn)去即可。也實(shí)現(xiàn)當(dāng)子進(jìn)程掛掉的時(shí)候,父進(jìn)程可以準(zhǔn)確獲取子進(jìn)程掛掉的信息的,可以選擇是否自己?jiǎn)?dòng)和報(bào)警。supervisor還提供了一個(gè)功能,可以為supervisord或者每個(gè)子進(jìn)程,設(shè)置一個(gè)非root的user,這個(gè)user就可以管理它對(duì)應(yīng)的進(jìn)程

今天要說(shuō)的不是supervisor,關(guān)于supervisor的使用,百度一大堆,這里不多贅述,今天重點(diǎn)要說(shuō)的是supervisor事件監(jiān)控

Event & Listener

Event 是在 Supervisor 3.0 引入的一個(gè)高級(jí)特性,如果只簡(jiǎn)單使用 Supervisor 管理進(jìn)程,則不需要了解 Event

但如果希望監(jiān)控 Supervisor 管理的進(jìn)程的各種狀態(tài)(如: 啟動(dòng)、退出、失敗、退出狀態(tài)碼 …)并支持告警,才需要了解Event

利用 Supervisor 的 Event & Listener 功能進(jìn)行訂閱異常退出事件,并進(jìn)行報(bào)警處理

Supervisor 官方對(duì)其 Event 機(jī)制的描述是:一個(gè)進(jìn)程的監(jiān)控/通知框架

該機(jī)制主要通過(guò)一個(gè) event listener 訂閱 event 通知實(shí)現(xiàn)。當(dāng)被 Supervisor 管理的進(jìn)程有特定行為的時(shí)候,supervisor 就會(huì)自動(dòng)發(fā)出對(duì)應(yīng)類(lèi)型的 event。即使沒(méi)有配置 listener,這些 event 也是會(huì)發(fā)的;如果配置了 listener 并監(jiān)聽(tīng)該類(lèi)型的 event,那么這個(gè) listener 就會(huì)接收到該 event。event listener 需要自己實(shí)現(xiàn),并像 program 一樣,作為 superviosr 的子進(jìn)程運(yùn)行

具體配置實(shí)現(xiàn)

配置事件監(jiān)聽(tīng)器

主管事件偵聽(tīng)器是通過(guò) 配置文件中的[eventlistener:x]指定的。關(guān)于Supervisor [eventlistener:x] 在配置中允許的鍵方面,幾乎與supervisor [program:x]完全一樣,只是Supervisor不遵循事件偵聽(tīng)器進(jìn)程的“捕獲模式”輸出(即事件偵聽(tīng)器不能是 PROCESS_COMMUNICATIONS_EVENT事件生成器)。因此,在事件偵聽(tīng)器的配置中指定stdout_capture_maxbytes或 stderr_capture_maxbytes是錯(cuò)誤的??梢苑湃肱渲梦募氖录陕?tīng)器部分的數(shù)量沒(méi)有人為限制

vim /etc/supervisord.d/eventlistener.ini
[eventlistener:mylistener]
command=/opt/my_custom_listener.py   自定義的監(jiān)控程序
events=PROCESS_STATE_EXITED,PROCESS_STATE_FATAL,TICK_60   監(jiān)控事件
; 下面的配置和`[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

配置監(jiān)聽(tīng)器腳本

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')
        # 當(dāng) program 的退出碼為對(duì)應(yīng)配置中的 exitcodes 值時(shí), expected=1; 否則為0
        if int(pheaders.get('expected'1)):
            childutils.listener.ok(sys.stdout)
            continue
        else:  # 0, 異常退出,根據(jù) pheaders 的值發(fā)送報(bào)警處理
            ############################
            pass  # 你的自定制發(fā)送報(bào)警邏輯 #
            with open('/opt/sup.log''a'as f:  # 這里寫(xiě)入文件作為報(bào)警簡(jiǎn)單模擬
                f.write(str(pheaders))
                f.write(str(pdata))
                f.write('\n')
            ############################

            # 向 stdout 寫(xiě)入"RESULT\nOK",并進(jìn)入下一次循環(huán)
            childutils.listener.ok(sys.stdout)

if __name__ == '__main__':
    main()

這里告警的方式可以自己定義,可以郵件,也可以通過(guò)webhook調(diào)用im接口告警

實(shí)際上supervisor自帶有監(jiān)控利器——superlance

superlance

superlance是基于supervisor的事件機(jī)制實(shí)現(xiàn)的一系列命令行的工具集,它實(shí)現(xiàn)了許多supervisor本身沒(méi)有實(shí)現(xiàn)的實(shí)用的進(jìn)程監(jiān)控和管理的特性,包括內(nèi)存監(jiān)控,http接口監(jiān)控,郵件和短信通知機(jī)制等。同樣的,superlance本身也是使用python編寫(xiě)的

安裝

由于superlance是一個(gè)python包,安裝起來(lái)十分簡(jiǎn)單,通過(guò)easy_install或者pip就可以簡(jiǎn)單的安裝:

easy_install superlance
pip install superlance

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

python setup.py install

安裝后執(zhí)行以下httpok命令,如果該命令存在,則說(shuō)明superlance已經(jīng)正常安裝了

superlance組件

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

  • httpok 通過(guò)定時(shí)對(duì)一個(gè)HTTP接口進(jìn)行GET請(qǐng)求,根據(jù)請(qǐng)求是否成功來(lái)判定一個(gè)進(jìn)程是否處于正常狀態(tài),如果不正常則對(duì)進(jìn)程進(jìn)行重啟。

  • crashmail 當(dāng)一個(gè)進(jìn)程意外退出時(shí),發(fā)送郵件告警。

  • memmon 當(dāng)一個(gè)進(jìn)程的內(nèi)存占用超過(guò)了設(shè)定閾值時(shí),發(fā)送郵件告警。

  • crashmailbatch 類(lèi)似于crashmail的告警,但是一段時(shí)間內(nèi)的郵件將會(huì)被合成起來(lái)發(fā)送,以避免郵件轟炸。

  • fatalmailbatch 當(dāng)一個(gè)進(jìn)程沒(méi)有成功啟動(dòng)多次后會(huì)進(jìn)入FATAL狀態(tài),此時(shí)發(fā)送郵件告警。與crashmailbatch一樣會(huì)進(jìn)行合成報(bào)警。

  • crashsms 當(dāng)一個(gè)進(jìn)程意外退出時(shí)發(fā)送短信告警,這個(gè)短信也是通過(guò)email網(wǎng)關(guān)來(lái)發(fā)送的

郵件告警

superlance是使用sendmail來(lái)發(fā)送郵件的,所以需要安裝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進(jìn)程啟動(dòng)項(xiàng)目,接著配置了一個(gè)名為redis_monitor的事件監(jiān)聽(tīng)器,它接受來(lái)自supervisor的PROCESS_STATE_EXITED事件,并且會(huì)觸發(fā)crashmail的命令行調(diào)用。

PROCESS_STATE_EXITED是在一個(gè)supervisor的監(jiān)控項(xiàng)對(duì)應(yīng)的進(jìn)程意外退出時(shí)會(huì)觸發(fā)的事件,這就使得一個(gè)進(jìn)程出現(xiàn)意外退出的情況下會(huì)通知到crashmail。

command參數(shù)中-p參數(shù)配置了crashmail只會(huì)對(duì)名為redis的監(jiān)控項(xiàng)作出響應(yīng),而-m參數(shù)中則配置了崩潰郵件會(huì)被發(fā)送到的地址

靈活利用superlance,可以完成各種告警需求,實(shí)現(xiàn)各種進(jìn)程監(jiān)控


我要咨詢
含山县| 冷水江市| 禄劝| 沾益县| 东明县| 柳林县| 大渡口区| 永年县| 巢湖市| 蚌埠市| 山东省| 吉林省| 邳州市| 伊吾县| 美姑县| 姜堰市| 临泉县| 张家口市| 华阴市| 玉山县| 容城县| 农安县| 息烽县| 北票市| 息烽县| 曲沃县| 芜湖市| 宁城县| 永清县| 文安县| 柳林县| 铁力市| 永安市| 汶上县| 商城县| 汕尾市| 武冈市| 温州市| 云安县| 垣曲县| 临西县|