实现celery中出现拥挤队列时,及时发邮件通知

简介: 里面有几个常用的功能,以后值得借鉴。 如获取脚本目录,IP,获取shell返回值,发送邮件等.. 上午写完,中午测试,下午上线~~   #!/usr/bin/env python # -*- coding:utf-8 -*- import smtplib from email.

里面有几个常用的功能,以后值得借鉴。

如获取脚本目录,IP,获取shell返回值,发送邮件等..

上午写完,中午测试,下午上线~~

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import smtplib
from email.mime.text import MIMEText
import socket
import fcntl
import struct
import sys
import os


#######################################
# 实现celery中出现拥挤队列时,及时发邮件通知 #
#             aguncn@163.com          #
#######################################

# 从系统命令中获取返回值
def run_cmd(cmd):  
    try:  
        import subprocess  
    except ImportError:  
        _, result_f, error_f = os.popen3(cmd)  
    else:  
        process = subprocess.Popen(cmd, shell = True,  
        stdout = subprocess.PIPE, stderr = subprocess.PIPE)  
        result_f, error_f = process.stdout, process.stderr  
  
    errors = error_f.read()  
    if errors:
        pass  
    result_str = result_f.read().strip()  
    if result_f:
        result_f.close()  
    if error_f:
        error_f.close()  
  
    return result_str


# 格式化命令,获取脚本绝对脚本,crontab也可执行
def format_cmd(cmd):
    filename = sys.argv[0]
    dirname = os.path.dirname(filename)
    abspath = os.path.abspath(dirname)
    return "python %s/manage_prd.py celery inspect %s -d celeryd@deploy" % (abspath, cmd)

# 获取指定网卡的IP
def get_ip(ifname):  
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
    return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])  


#发送邮件
class PM(object):
    def __init__(self, msg_str=None):
        self.msg_str = msg_str

    def send_email(self, email_list):
        mail_host = "x.x.x.x"
        sender_email = "a@b.c"
        subject = "celery alert"
        msg = MIMEText(self.msg_str.encode('utf8'), _subtype='plain', _charset='utf8')
        msg['From'] = sender_email
        msg['Subject'] = u'%s' % subject
        msg['To'] = ",".join(email_list)

        try:
            s = smtplib.SMTP(mail_host, 25)
            s.sendmail(sender_email, receivers_list, msg.as_string())
            s.close()
        except Exception as e:
            print 'Exception: ', e

            
if __name__ == '__main__':
    active_cmd_str = format_cmd("active")
    revoked_cmd_str = format_cmd("revoked")
    reserved_cmd_str = format_cmd("reserved")
    reserved_return_str = run_cmd(reserved_cmd_str)
    if "empty" not in reserved_return_str:
        receivers_list = ["a@b.c", "a@b.c"]
        ip = get_ip('eth0')
        email_str = "http://%s:8000/" %(ip)
        email_str = email_str + "\n" + "active: " + "\n"
        email_str = email_str + run_cmd(active_cmd_str) + "\n"
        email_str = email_str + "reserved: " + "\n"
        email_str = email_str + run_cmd(reserved_cmd_str) + "\n"
        email_str = email_str + "revoked: " + "\n"
        email_str = email_str + run_cmd(revoked_cmd_str) + "\n"
        email_inst = PM(email_str)
        email_inst.send_email(receivers_list)
        print "send a alert email."
    else:
        print "all ok, no email send."

 

目录
相关文章
|
5月前
|
XML JSON 定位技术
06 公众号开发 - 接收普通消息和被动回复消息
06 公众号开发 - 接收普通消息和被动回复消息
70 0
|
3月前
|
消息中间件
【面试问题】如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?
【1月更文挑战第27天】【面试问题】如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?
|
9月前
RabbmitMQ学习笔记-消费端ACK与重回队列机制
RabbmitMQ学习笔记-消费端ACK与重回队列机制
41 0
|
9月前
|
消息中间件
RabbitMQ队列中unacked消息持续时间很久
今天在使用RTM系统debug测试时,发现程序起来之后unacked就会一直持续。
337 0
|
10月前
|
Java Linux 网络安全
教你如何五分钟捕获女神的芳心之定时邮件任务
教你如何五分钟捕获女神的芳心之定时邮件任务
|
10月前
|
消息中间件 JSON 运维
生产RabbitMQ队列阻塞该如何处理?
那天我和同事一起吃完晚饭回公司加班,然后就群里就有人@我说xxx商户说收不到推送,一开始觉得没啥。我第一反应是不是极光没注册上,就让客服通知商户,重新登录下试试。这边打开极光推送的后台进行检查。后面反应收不到推送的越来越多,我就知道这事情不简单。
|
双11 iOS开发 开发者
消费者需求的不同状态 | 学习笔记
快速学习消费者需求的不同状态。
391 0
消费者需求的不同状态 | 学习笔记
|
消息中间件 RocketMQ 开发者
消息消费方准备工作|学习笔记
快速学习消息消费方准备工作
73 0
消息消费方准备工作|学习笔记
|
消息中间件
|
消息中间件 网络协议 Java
RabbitMQ实战-消费端ACK、NACK及重回队列机制(上)
RabbitMQ实战-消费端ACK、NACK及重回队列机制(上)
815 0
RabbitMQ实战-消费端ACK、NACK及重回队列机制(上)