Python结合Zabbix模板的自动发现功能监控RabbitMQ队列是否正常运行并自动添加触发器

栏目: Python · 发布时间: 6年前

内容简介:项目背景描述:RabbitMQ作为一款非常常用的消息中间件,那么对此的监控也必不可少,对此我也写过一篇文章(连接地址),但项目过于复杂,代码量大,但不得不说监控得非常详细。此项目的部署的过程中也显得不那么容易,因监控项多,项目复杂也会影响到Zabbix的效率。为满足我项目的个性化要求,减少Zabbix的性能开消为此我自己也写了一个简单的项目,主要实现以下功能第一步:

项目背景描述:

RabbitMQ作为一款非常常用的消息中间件,那么对此的监控也必不可少,对此我也写过一篇文章(连接地址),但项目过于复杂,代码量大,但不得不说监控得非常详细。此项目的部署的过程中也显得不那么容易,因监控项多,项目复杂也会影响到Zabbix的效率。为满足我项目的个性化要求,减少Zabbix的性能开消为此我自己也写了一个简单的项目,主要实现以下功能

  1. 队列自动发现(还可以指定vhost)

  2. 自动添加监控,自动添加触发器

第一步:

Zabbix添加UserParameter

UserParameter=rabbitmq[*],/usr/bin/python /usr/local/sbin/rabbitmq.py $1

第二步:

创建脚本脚本内容如下

#!/usr/bin/python
#coding:utf8
 
import requests
import sys
import json

class RabbitMQ:
 
 
    def __init__(self, user='guest', passwd='guest', server_ip='192.168.1.1', server_port=15670, vhost="device"):
 
        self.user = user
        self.password = passwd
        self.server_ip = server_ip
        self.server_port = server_port
        self.vhost = vhost
 
 
    def GetQueues(self):
        # 连接并获取RabbitMQ数据,如果传getallname参数代表获取所有的队列名称,主要用于自动发现,如果不等于,那就是获取指定队列的数据
        if sys.argv[1] != "getallname":
            connections = requests.get("http://{0}:{1}/api/queues/{2}/{3}".format(self.server_ip, self.server_port, self.vhost, sys.argv[1]), auth=(self.user, self.password))
        else:
            connections = requests.get("http://{0}:{1}/api/queues".format(self.server_ip, self.server_port), auth=(self.user, self.password))
        connections = connections.json()
        return connections
 

    def QueuesDataProcessing(self):
        # 判断队列是否正常工作 
        data = self.GetQueues()
        if "message_stats" in data:
            Ack = data["message_stats"]["ack_details"]["rate"]
            Total = data["messages"]
            
            if Total > 2000 and Ack == 0:
                return Total
            else:
                return 0
        else:
            # 当有些队列长时间没有数据传输,会没有任何数据显示,这里也返回0,代表没有问题
            return 0


    def GetAllQueuesName(self):
        # 获取所有队名称,格式化为Zabbix指定的格式,以便自动发现
        list1= []
        result = self.GetQueues()
        for n in range(len(result)):
            list1.append({"{#QUEUES_NAME}": result[n]["name"]})
        return list1
 
 
if __name__ == '__main__':
    mq = RabbitMQ()
    if sys.argv[1] != "getallname":
        result = mq.QueuesDataProcessing()
        print(result)
    else:
        result = mq.GetAllQueuesName()
        names = {"data": result}
        print(json.dumps(names))

简要说明:需要修改的地方主要就是QueuesDataProcessing函数,根据自己的要求去写就可,我这里的简单逻辑就是判断队列内消息总数如果大于2000,并且消息速度为0就认为不正常,基本上为没有正常消费,另外还有一种情况就是队列长久没有数据,那么获取不到任何数据,所以先做了一个判断,如果查询不到数据状态也返回0,非0为不正常

最后一步:

导入模板并关联,模板下载地址(模板默认更新时间为30s,可自行更改设置)

效果展示:

Python结合Zabbix模板的自动发现功能监控RabbitMQ队列是否正常运行并自动添加触发器

Python结合Zabbix模板的自动发现功能监控RabbitMQ队列是否正常运行并自动添加触发器

Python结合Zabbix模板的自动发现功能监控RabbitMQ队列是否正常运行并自动添加触发器


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

应用密码学:协议、算法与C源程序(原书第2版)

应用密码学:协议、算法与C源程序(原书第2版)

(美)Bruce Schneier / 吴世忠、祝世雄、张文政 等 / 机械工业出版社 / 2014-1 / 79.00

......我所读过的关于密码学最好的书......该书是美国国家安全局最不愿意见到出版的书...... —— 《Wired》 ......不朽的......令人着迷的......计算机程序员必读的密码学上决定性的著作...... —— 《Dr.Dobb's Journal》 ......该领域勿庸置疑的一本权威之作。 —— 《PC Magazine》 ..........一起来看看 《应用密码学:协议、算法与C源程序(原书第2版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具