Python結合Zabbix模板的自動發現功能監控RabbitMQ隊列是否正常運行並自動添加觸發器

項目背景描述:

RabbitMQ作爲一款非常常用的消息中間件,那麼對此的監控也必不可少,對此我也寫過一篇文章(連接地址),但項目過於複雜,代碼量大,但不得不說監控得非常詳細。此項目的部署的過程中也顯得不那麼容易,因監控項多,項目複雜也會影響到Zabbix的效率。爲滿足我項目的個性化要求,減少Zabbix的性能開消爲此我自己也寫了一個簡單的項目,主要實現以下功能

  1. 隊列自動發現(還可以指定vhost)

  2. 自動添加監控,自動添加觸發器

第一步:

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,可自行更改設置)


效果展示:

1.png


2.png

3.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章