专栏名称: Python学习交流
每天更新,更新python相关的知识。希望诸君有所收获!
目录
相关文章推荐
Python爱好者社区  ·  英伟达憾失DeepSeek关键人才?美国放走 ... ·  昨天  
Python爱好者社区  ·  离谱!下载DeepSeek最高判刑20年? ·  2 天前  
Python爱好者社区  ·  1885页的Python完全版电子书 ·  3 天前  
Python开发者  ·  o3-mini 碾压 DeepSeek ... ·  5 天前  
Python开发者  ·  请立即拿下软考证书(政策风口) ·  4 天前  
51好读  ›  专栏  ›  Python学习交流

Python自动发现功能监控RabbitMQ队列是否正常运行并自动添触发器

Python学习交流  · 公众号  · Python  · 2018-10-27 19:02

主要观点总结

文章介绍了RabbitMQ消息中间件的监控项目,包括项目背景、复杂性、监控细节以及自定义监控项目的实现。文章还提供了关于如何入门RabbitMQ的建议和资源。

关键观点总结

关键观点1: 项目背景

文章讨论了RabbitMQ作为常用消息中间件的监控需求,指出监控的重要性及其复杂性。

关键观点2: 监控实现细节

文章描述了一个自定义的监控项目,实现了队列自动发现、自动添加监控和自动添加触发器的功能。

关键观点3: 脚本功能

文章中详细解释了脚本的主要功能,包括获取RabbitMQ队列数据、判断队列状态以及获取所有队列名称等。

关键观点4: 自定义要求与修改建议

文章提到了根据实际需求修改QueuesDataProcessing函数的重要性,并给出了判断队列状态的基本逻辑。

关键观点5: 部署与效果展示

文章最后介绍了如何部署监控项目、导入模板并关联,并提供了模板下载地址和设置更新时间的建议。


正文

项目背景描述:

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

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

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

题外话!如果还有在入门阶段的小萌新们的话,就私信我!我送大量的PDF书籍!精心整理的,希望大家能早日入门!进群:548377875

第一步:

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为不正常







请到「今天看啥」查看全文