- Zabbix添加UserParameter,内容如下:
UserParameter=rabbitmq[*],/usr/bin/python /usr/local/sbin/rabbitmq.py $1
- 创建rabbitmq.py脚本,内容如下
#!/usr/bin/python
#coding:utf8
import requests
import sys
import json
class RabbitMQ:
def __init__(self, user='zabbix', passwd='zabbix123', server_ip='172.21.2.5', server_port=15672, vhost="/"):
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))
重启zabbix客户端服务:systemctl restart zabbix-agent
zabbix web界面导入Zabbix模板rabbitmq.xml并关联至指定的主机(模板名称RabbitMQ-Queues)
在rabbitmq主机添加可以远程连接的用户,并设置权限:
#创建用户 rabbitmqctl add_user 用户名 密码
rabbitmqctl add_user zabbix zabbix123
#设置用户权限 rabbitmqctl set_permissions -p “/” 用户名 “.” “.” “."
rabbitmqctl set_permissions -p “/” zabbix “.” “.” ".”
#设置用户角色 rabbitmqctl set_user_tags 用户名 administrator
rabbitmqctl set_user_tags zabbix administrator
Rabbitmq进程监控:
ps -ef|grep rabbitmq找到进程名称,在模板中添加监控项,键值proc.num[beam.smp]
键值来源于键值选择中,将进程名添加即可,也可选择使用端口进行监控,自己选择。
添加触发器:
#cat rabbitmq.xml
3.4 2018-10-25T08:47:54Z Templates RabbitMQ-Queues RabbitMQ-Queues Templates RabbitMQ 队列监控 0 rabbitmq[getallname] 30s 0 0 0 0 0 0 {#QUEUES_NAME} 8 A 30d RabbitMQ 队列 {#QUEUES_NAME} 0 rabbitmq[{#QUEUES_NAME}] 30s 90d 365d 0 3 0 0 0 0 0 {RabbitMQ-Queues:rabbitmq[{#QUEUES_NAME}].last()}<>0 0 RabbitMQ 队列 {#QUEUES_NAME} 发现问题 0 0 4 0 0



