Python結合Zabbix模板的自動發現功能監控RabbitMQ佇列是否正常執行並自動新增觸發器...
阿新 • • 發佈:2020-10-09
專案背景描述:
RabbitMQ作為一款非常常用的訊息中介軟體,那麼對此的監控也必不可少,對此我也寫過一篇文章(連線地址),但專案過於複雜,程式碼量大,但不得不說監控得非常詳細。此專案的部署的過程中也顯得不那麼容易,因監控項多,專案複雜也會影響到Zabbix的效率。為滿足我專案的個性化要求,減少Zabbix的效能開消為此我自己也寫了一個簡單的專案,主要實現以下功能
佇列自動發現(還可以指定vhost)
自動新增監控,自動新增觸發器
第一步:
Zabbix新增UserParameter
UserParameter=rabbitmq[*],/usr/bin/python/usr/local/sbin/rabbitmq.py$1
第二步:
建立指令碼指令碼內容如下
#!/usr/bin/python #coding:utf8 importrequests importsys importjson classRabbitMQ: 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 defGetQueues(self): #連線並獲取RabbitMQ資料,如果傳getallname引數代表獲取所有的佇列名稱,主要用於自動發現,如果不等於,那就是獲取指定佇列的資料 ifsys.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() returnconnections defQueuesDataProcessing(self): #判斷佇列是否正常工作 data=self.GetQueues() if"message_stats"indata: Ack=data["message_stats"]["ack_details"]["rate"] Total=data["messages"] ifTotal>2000andAck==0: returnTotal else: return0 else: #當有些佇列長時間沒有資料傳輸,會沒有任何資料顯示,這裡也返回0,代表沒有問題 return0 defGetAllQueuesName(self): #獲取所有隊名稱,格式化為Zabbix指定的格式,以便自動發現 list1=[] result=self.GetQueues() forninrange(len(result)): list1.append({"{#QUEUES_NAME}":result[n]["name"]}) returnlist1 if__name__=='__main__': mq=RabbitMQ() ifsys.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,可自行更改設定)
效果展示:
轉載於:https://blog.51cto.com/270142877/2308929