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

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

如获取脚本目录,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."

 

时间: 2024-10-03 06:14:21

实现celery中出现拥挤队列时,及时发邮件通知的相关文章

yii2 log配置-yii2当log为error时自动发邮件该如何配置呢

问题描述 yii2当log为error时自动发邮件该如何配置呢 当log为error时自动发邮件该如何配置呢,当log为error时自动发邮件该如何配置呢,

双KeepAlived+Mysql切换Vip时发邮件通知

解决问题的基本思路是在备机切换为主机时,发送邮件提醒. 具体方式: 在keepalived配置中可以做如下配置: vrrp_instance VI_1 {     state MASTER     interface eth0     virtual_router_id 13     priority 100     advert_int 1     authentication {         auth_type PASS         auth_pass 6d02896810d4424

怎样解决发邮件时等待的时间?

问题描述 怎样解决发邮件时等待的时间?我是想如果有人提交订单后同时发送邮件给指定管理员,不要等邮件发送完成后才弹出提交成功对话框ajax异步吗,感觉很麻烦,还要另外写个发邮件的方法,有没有其他方法 解决方案 解决方案二:你先表述下怎么样的过程对你来说是属于不麻烦的?解决方案三:引用1楼shingoscar的回复: 你先表述下怎么样的过程对你来说是属于不麻烦的? 用ajax的话,这样会多一个请求啊.解决方案四:不要等邮件发送完成后才弹出提交成功对话框,那你可以弹出提交成功对话框再发送邮件解决方案五

linux中编写并发队列类

 这篇文章主要介绍了linux中编写并发队列类,功能有:并发阻塞队列.有超时限制.有大小限制 设计并发队列   代码如下: #include <pthread.h> #include <list> using namespace std;   template <typename T> class Queue  {  public:      Queue( )      {          pthread_mutex_init(&_lock, NULL); 

OSSIM中分布式消息队列应用

 OSSIM中分布式消息队列应用   1. 消息队列处理 企业日志数量正在以指数级形式高速增长,日志数据的具有海量.多样.异构等特点,基于传统的单一节点混合式安装的OSSIM平台(指OSSIM 4.4及以下系统),无法满足海量日志分析要求.在OSSIM 4.4以后的系统中增加了中间件RabbitMQ,可通过RabbitMQ将系统中各组件解除耦合,避免了系统中运行模块的影响(例如MySQL的写操作等),这样设计可实现分布式日志分析平台的要求. OSSIM中使用RabbitMQ后,可以利用消息队列耦

当设计消息队列时我们关心什么

应用消息队列可以对系统进行解耦,流量削峰,在分布式系统设计中,消息队列是重要的组件之一. 在开发中应用过ActiveMQ,kafka等mq,不过对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现特别重要, 比如对一致性等实现的关注,可以帮助我们在开发中避免踩坑,规避问题的出现.这篇文章简单探讨下当设计和实现一个消息队列时,我们需要关心哪些地方.   消息队列功能和特性 一个传统意义上的消息队列,需要支持消息的发送,接受和消息暂存的功能. 在实际应用中,对消息队列的要求远不止于此,在不同

解析Java中PriorityQueue优先级队列结构的源码及用法_java

一.PriorityQueue的数据结构 JDK7中PriorityQueue(优先级队列)的数据结构是二叉堆.准确的说是一个最小堆. 二叉堆是一个特殊的堆, 它近似完全二叉树.二叉堆满足特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆. 当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆. 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆. 下图是一个最大堆 priorityQueue队头就是给定顺序的最小元素. prio

深入浅析C语言中堆栈和队列_C 语言

1.堆和栈 (1)数据结构的堆和栈 堆栈是两种数据结构. 栈(栈像装数据的桶或箱子):是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同要取出放在箱子里面底下的东西(放入的比较早的物体),首先要移开压在它上面的物体(放入的比较晚的物体). 堆(堆像一棵倒过来的树):是一种经过排序的树形数据结构,每个结点都有一个值.通常所说的堆的数据结构,是指二叉堆.堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆.由于堆的这个特性,常用来实现优先队列,堆的存取是随意,

Java中的阻塞队列详细介绍_java

Java中的阻塞队列 1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是: 在队列为空时,获取元素的线程会等待队列变为非空. 当队列满时,存储元素的线程会等待队列可用. 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程.阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素. 2.Java里的阻塞队列 JDK中提供了七个阻塞队列: ArrayBlockingQueue :一个由数组结