• 利用Superlance监控Supervisor运行状态并实现报警


    Superlance是基于supervisor的事件机制实现的一系列命令行的工具集,它实现了许多supervisor本身没有实现的实用的进程监控和管理的特性,包括内存监控,http接口监控,邮件和短信通知机制等。同样的,superlance本身也是使用python编写的。

    官网资料:http://supervisord.org/index.html   https://superlance.readthedocs.io/en/latest/index.html

    superlance的安装

    由于superlance是一个python包,安装起来十分简单,通过easy_install或者pip就可以简单的安装:

    easy_install superlance
    pip install superlance

    当然也可以到github上获得最新的源码(https://github.com/Supervisor/superlance)并通过以下方式安装

    python setup.py install

     安装后执行以下crashmail命令,如果该命令存在,则说明superlance已经正常安装了。

    superlance的组件

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

      • httpok 
        通过定时对一个HTTP接口进行GET请求,根据请求是否成功来判定一个进程是否处于正常状态,如果不正常则对进程进行重启。
      • crashmail 
        当一个进程意外退出时,发送邮件告警。
      • memmory 
        当一个进程的内存占用超过了设定阈值时,发送邮件告警。
      • crashmailbatch 
        类似于crashmail的告警,但是一段时间内的邮件将会被合成起来发送,以避免邮件轰炸
      • fatalmailbatch 
        当一个进程没有成功启动多次后会进入FATAL状态,此时发送邮件告警。与crashmailbatch一样会进行合成报警。
      • crashsms 
        当一个进程意外退出时发送短信告警,这个短信也是通过email网关来发送的。

    superlance是基于supervisor的,所以要利用Supervisord进行进程监控和报警需要利用Supervisord的Event特性,编写一个listener,监控进程状态的改变,然后执行指定的代码。event的发起方是supervisord进程,接收方是一个叫listener的东西。listener和program一样,都是supervisord的子进程。两者的在配置上,很多选项也都一样。

    1.当supervisord启动的时候,如果我们的listener配置为autostart=true的话,listener就会作为supervisor的子进程被启动。
    2.listener被启动之后,会向自己的stdout写一个"READY"的消息,此时父进程也就是supervisord读取到这条消息后,会认为listener处于就绪状态。
    3.listener处于就绪状态后,当supervisord产生的event在listener的配置的可接受的events中时,supervisord就会把该event发送给该listener。
    4.listener接收到event后,我们就可以根据event的head,body里面的数据,做一系列的处理了。我们根据event的内容,判断,提取,报警等等操作。
    5.该干的活都干完之后,listener需要向自己的stdout写一个消息"RESULTnOK",supervisord接受到这条消息后。就知道listener处理event完毕了。

    Supervisord支持的Event

    参考:http://supervisord.org/events.html

    PROCESS_STATE           进程状态发生改变
    PROCESS_STATE_STARTING  进程状态从其他状态转换为正在启动 (Supervisord的配置项中有startsecs配置项,是指程序启动时需要程序至少稳定运行x秒才认为程序运行正常,在这x秒中程序状态为正在启动)
    PROCESS_STATE_RUNNING   进程状态由正在启动转换为正在运行
    PROCESS_STATE_BACKOFF   进程状态由正在启动转换为失败
    PROCESS_STATE_STOPPING  进程状态由正在运行转换为正在停止
    PROCESS_STATE_EXITED    进程状态由正在运行转换为退出
    PROCESS_STATE_STOPPED   进程状态由正在停止转换为已经停止(exited和stopped的区别是exited是程序自行退出,而stopped为人为控制其退出)
    PROCESS_STATE_FATAL     进程状态由正在运行转换为失败
    PROCESS_STATE_UNKNOWN   未知的进程状态
    REMOTE_COMMUNICATION    使用Supervisord的RPC接口与Supervisord进行通信
    PROCESS_LOG             进程产生日志输出,包括标准输出和标准错误输出
    PROCESS_LOG_STDOUT   进程产生标准输出
    PROCESS_LOG_STDERR   进程产生标准错误输出
    PROCESS_COMMUNICATION   进程的日志输出包含 和
    PROCESS_COMMUNICATION_STDOUT  进程的标准输出包含 和
    PROCESS_COMMUNICATION_STDERR  进程的标准错误输出包含 和
    SUPERVISOR_STATE_CHANGE_RUNNING Supervisord   启动
    SUPERVISOR_STATE_CHANGE_STOPPING Supervisord  停止
    TICK_5    每隔5秒触发
    TICK_60   每隔60秒触发
    TICK_3600 每隔3600触发
    PROCESS_GROUP  Supervisord的进程组发生变化
    PROCESS_GROUP_ADDED   新增了Supervisord的进程组
    PROCESS_GROUP_REMOVED 删除了Supervisord的进程组

    Superlance监听配置

    1、配置邮件发送(如果使用之前文章中提到的mail命令发送邮件的话可忽略此步)

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

    # yum install sendemail -y

    默认的时候crashmail使用的是linux系统的sendmail,发送出去的邮件很容易隐藏自己的信息,所以一般邮件服务商针对这些邮件会报错,大概是DSN, service unavailable, 貌似是你的ip地址和dns反解析不一致导致,所以无法发送邮件。所以本文采用的实际上是sendemail,一个非常强大的使用perl语言写的支持附件发送等诸多功能的脚本。

    官网地址:http://caspian.dotconf.net/menu/Software/SendEmail/

    # sendemail -f 发件人邮箱 -t 收件人邮箱 -s 发件人邮箱smtp服务器 -u "MyAlarmEmail" -m "wjoyxt" -xu 发件人用户名 -xp 发件人邮箱密码  
      -f 发件人
      -t 收件人
      -s 发件人smtp服务器
      -u 主题
      -o message-content-type=html   邮件内容的格式,html表示它是html格式,默认是text,可选 <auto|text|html>
      -o message-charset=utf8        邮件内容编码,中文支持
      -m 内容 
    -xu 发件人用户名
    -xp 发件人密码

    例如:echo "this is wjoyxt" | sendemail -f dataalarm@wjoyxt.com -t wang@wjoyxt.com -s smtp.mxhichina.com -u '进程警报'  -o message-charset=utf8 -xu dataalarm@wjoyxt.com -xp Bigdata@2019@ -m >/dev/null 2>&1

     2、配置事件监听器

    [eventlistener:crashmail]
    command=crashmail -a -s "sendemail -f dataalarm@wjoyxt.com -t alarm@wjoyxt.com -s smtp.mxhichina.com -u 'Process is crashed' -xu dataalarm@wjoyxt.com -xp Bigdata@2019@ -m >/dev/null 2>&1" -m alarm@wjoyxt.com
    events=PROCESS_STATE_EXITED
    redirect_stderr=false

    [eventlistener:crashmail]
    command=crashmail -a -s "mail -s 'Process is crashed' alarm@wjoyxt.com" -m alarm@wjoyxt.com
    events=PROCESS_STATE_EXITED
    redirect_stderr=false

    command参数中 -p 参数配置了crashmail只会对名为redis的监控项作出响应,而 -m 参数中则配置了崩溃邮件会被发送到的地址,-a 监控所有项

    crashmail是一个主管“事件监听器”,用于订阅PROCESS_STATE_EXITED事件。当crashmail 收到该事件并且转换是"意外的(not expected)"时,crashmail 会将电子邮件通知发送到已配置的地址

    events=PROCESS_STATE_EXITED,PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL,PROCESS_LOG_STDERR 多个事件时,用逗号隔开

    PROCESS_STATE_EXITED是在一个supervisor的监控项对应的进程意外退出时会触发的事件,这就使得一个进程出现意外退出的情况下会通知到crashmail。 

    测试实例:

    [program:tail]
    command=tail -f /home/hottopic/test.log
    user=root
    autostart=true
    autorestart=true
    startretries=3

    # kill -9 tail 手动触发报警测试

  • 相关阅读:
    Android 中的code sign
    iOS 中的Certificate,Provisioning Profile 的一些注意 (不断完善中)
    xcode 和 android studio中在Mac系统下的自动对齐快捷键
    iOS block 声明时和定义时的不同格式
    iOS 和 Android 中的后台运行问题
    Android 阅读Tasks and Back Stack文章后的重点摘抄
    Android 中PendingIntent---附带解决AlarmManager重复加入问题
    Android 中获得notification的发出时间
    iOS 关于Layer的疑问
    iOS的 context 和Android 中的 canvas
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/11900299.html
Copyright © 2020-2023  润新知