• 使用superlance插件增强supervisor的监控能力


    supervisor与superlance简介

    supervisor是一款用python编写的进程监控、进程守护和进程管理的工具,可以工作在各种UNIX-like的操作系统上,通过简单的配置就可以启动、监控和管理大量的进程,并且可以守护这些进程的运行,同时其还提供了一套自带的事件机制与XML-RPC API,可以很方便的在其之上扩展各种功能满足各类需要。 
    而superlance就是基于supervisor的事件机制实现的一系列命令行的工具集,它实现了许多supervisor本身没有实现的实用的进程监控和管理的特性,包括内存监控,http接口监控,邮件和短信通知机制等。同样的,superlance本身也是使用python编写的。

    superlance的安装

    由于本文主要介绍superlance插件,对supervisor本身的介绍不予以赘述。 
    由于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实战

    在实际配置supervisor使用superlance之前,首先要安装sendmail,superlance使用这个命令行工具来发送email,利用各种包管理工具都可以简单的安装:

    sudo apt-get install sendmail

    (1)crashmail 
    supervisor的配置内容如下:

    [program:top]
    command=top -b
    process_name=%(program_name)s
    numprocs=1
    directory=/tmp
    umask=022
    priority=999
    autostart=false
    autorestart=false
    startsecs=10
    startretries=3
    exitcodes=0,2
    stopsignal=TERM
    stopwaitsecs=10
    redirect_stderr=true
    
    [eventlistener:crashmail]
    command=crashmail -p top -m xmxjq01@gmail.com
    events=PROCESS_STATE_EXITED
    redirect_stderr=true

    首先配置了一个名为top的进程监控项,其内容就是很简单的重复执行top -b,持续地输出当前系统的进程信息。 
    随后配置了一个名为crashmail的事件监听器,它接受来自supervisor的PROCESS_STATE_EXITED事件,并且会触发crashmail的命令行调用。 
    PROCESS_STATE_EXITED事件是在一个supervisor的监控项对应的进程意外退出时会触发的事件,这就使得一个进程出现意外退出的情况下会通知到crashmail。 
    而在command参数中-p参数配置了crashmail只会对名为top的监控项作出响应,而-m参数中则配置了崩溃邮件会被发送到的地址。

    上线了这些配置,就可以在supervisor的web端看到配置的两条内容,一条是top监控项,另外一条则是事件监听器crashmail: 
    这里写图片描述

    启动top,可以看到正常的top输出: 
    这里写图片描述

    通过shell的ps指令找到top对应的进程id,使用kill -9的方式强行结束进程,这使得supervisor可以判定top进程异常退出: 
    这里写图片描述

    最后收到了崩溃报警的邮件: 
    这里写图片描述

    通过这样的配置,就可以以邮件的方式来提醒你一个需要长期跑的进程挂掉的事实了。

    (2)memmon 
    与crashmail类似,只不过memmon监控的不是进程是否还活着而是监控进程的内存占用情况,这里首先先给出一段测试脚本:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Filename : memoryleak.py
    import time
    
    class LeakTest(object):
        def __init__(self):
            print 'Object with id %d born here.' % id(self)
    
        def __del__(self):
            print 'Object with id %d dead here.' % id(self)
    
    def doLeak():
        A = LeakTest()
        B = LeakTest()
        A.b = B
        B.a = A
    
    if __name__ == '__main__':
        while True:
            for i in range(1, 10000):
                doLeak()
            time.sleep(5)

    这段脚本在执行的过程中会出现内存泄露的情况,导致内存占用越来越大,直至无法系统无法再分配内存导致程序异常退出,利用这段脚本我们可以配置一个memmon的事件监听来发出内存泄露的告警。 
    supervisor的配置如下:

    [program:memoryleak]
    command=python /home/xmxjq/supervisord/samples/memoryleak.py
    process_name=%(program_name)s
    numprocs=1
    directory=/tmp
    umask=022
    priority=999
    autostart=false
    autorestart=false
    startsecs=10
    startretries=3
    exitcodes=0,2
    stopsignal=TERM
    stopwaitsecs=10
    redirect_stderr=true
    
    [eventlistener:memmon]
    command=memmon -p memoryleak=1MB -m xmxjq01@gmail.com
    events=TICK_60
    redirect_stderr=true

    这里memmon事件监听器监听的是TICK_60事件,也就是每60秒间隔触发一次的事件,这使得memmon会每60秒检测一次对应的监控项的占用内存情况,这里设置的是监控memoryleak监控项,如果其内存占用超过1MB,则会重启进程,并发送邮件进行告警。 
    同样地上线这些配置,并启用memoryleak进程: 
    这里写图片描述

    运行60s后,memoryleak进程的内存占用已经达到了21M,超过了1MB的告警值,可以看到邮箱中收到了告警邮件: 
    这里写图片描述

    同时memoryleak的uptime也重置了,说明该进程已经被重启了,使得该进程可以保持正常运行,同时也达到了内存泄露告警的目的。

    利用superlance插件提供的其他工具也可以完成各种各样的告警需求,扩展了supervisor的功能,这些工具的具体使用方法可以参考官方文档:https://superlance.readthedocs.org/en/latest/index.html

  • 相关阅读:
    OSI 和 TCP/IP 网络分层
    java 类加载器
    操作系统 内存管理
    基础线程机制
    java 互斥同步
    数据库引擎
    java 内存分配与回收策略
    Redis基础
    二进制
    node版本管理nvm科学用法
  • 原文地址:https://www.cnblogs.com/felixzh/p/9317290.html
Copyright © 2020-2023  润新知