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

2018-10-2808:36:15后端程序开发Comments3,399 views字数 1877阅读模式

项目背景描述:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

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

  1. 队列自动发现(还可以指定vhost)
  2. 自动添加监控,自动添加触发器

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

第一步:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

Zabbix添加UserParameter文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

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

第二步:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

创建脚本脚本内容如下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

#!/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为不正常文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

最后一步:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

导入模板并关联,模板下载地址(模板默认更新时间为30s,可自行更改设置)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

效果展示:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

Python开发:发现功能监控RabbitMQ队列是否正常运行并自动添触发器文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

Python开发:发现功能监控RabbitMQ队列是否正常运行并自动添触发器文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

Python开发:发现功能监控RabbitMQ队列是否正常运行并自动添触发器文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/7366.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/7366.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定