項目背景描述:
RabbitMQ作爲一款非常常用的消息中間件,那麼對此的監控也必不可少,對此我也寫過一篇文章(連接地址),但項目過於複雜,代碼量大,但不得不說監控得非常詳細。此項目的部署的過程中也顯得不那麼容易,因監控項多,項目複雜也會影響到Zabbix的效率。爲滿足我項目的個性化要求,減少Zabbix的性能開消爲此我自己也寫了一個簡單的項目,主要實現以下功能
隊列自動發現(還可以指定vhost)
自動添加監控,自動添加觸發器
第一步:
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,可自行更改設置)
效果展示: