Zabbix监控ActiveMQ
当我们在线上使用了ActiveMQ
后,我们需要对一些参数进行监控,比如 消息是否有阻塞,哪个消息队列阻塞了,总的消息数是多少等等。下面我们就通过 Zabbix
结合 Python
脚本来实现对 ActiveMQ
的监控。
一、创建 Activemq Python 监控脚本
因为 CentOS
系统默认安装的是 Python2.7
,为了避免麻烦,我们这里的脚本也是对应的 Python2
Python2 监控脚本
# -*- coding: utf-8 -*-
# @Time : 2019/6/25 9:26
# @Author : djx
# @Email : [email protected]
# @File : mointer_mq_python2.py
# @Software: PyCharm
# @Python_version: python2.7
import base64
import urllib2
import json
import logging
import sys
def activemq_mointer(userinfo_encode):
# 总的消息阻塞数
pending_queue_sum = 0
# 阻塞消息的队列名称
pending_queue_lists = ''
# 总的消息数
mq_sum = 0
headers = {
'Authorization': 'Basic {}'.format(userinfo_encode),
'ua': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36'
}
url = 'http://' + ip + ':' + port + \
'/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/Queues/'
request = urllib2.Request(url=url, headers=headers)
try:
response = urllib2.urlopen(request)
except Exception as e:
logging.error(e)
return {'pending_queue_sum': 110, 'pending_queue_lists': '110', 'mq_sum': 0} # 当服务不可用时,返回预警数字,用于预警。
activemq_info = response.read()
activemq_info_json = json.loads(activemq_info)
activemq_queues = activemq_info_json['value']
for i in activemq_queues:
queue_url = 'http://' + ip + ':' + port + \
'/api/jolokia/read/' + i['objectName']
queue_request = urllib2.Request(url=queue_url, headers=headers)
try:
queue_response = urllib2.urlopen(queue_request)
except Exception as e:
logging.error(e)
return {'pending_queue_sum': 110, 'pending_queue_lists': '110', 'mq_sum': 0}
queue_info = queue_response.read()
info_dict = json.loads(queue_info)
mq_sum += info_dict['value']['EnqueueCount']
if int(info_dict['value']['QueueSize']
) > 0: # 取值 QueueSize ,就是未消费的消息数量
pending_queue_sum += info_dict['value']['QueueSize']
pending_queue_lists += info_dict['value']['Name']
pending_queue_lists += ' and '
logging.info(
"消息队列--{}--有阻塞消息--{} 条".format(
info_dict['value']['Name'],
info_dict['value']['QueueSize']))
return {'pending_queue_sum': pending_queue_sum, 'pending_queue_lists': pending_queue_lists, 'mq_sum': mq_sum}
if __name__ == '__main__':
# ActiveMQ 服务器信息
username = 'admin'
password = 'admin'
ip = '127.0.0.1'
port = '8161'
userinfo = username + ':' + password
userinfo_encode = base64.b64encode(userinfo.encode('utf8'))
# 日志配置,注意下面日志文件的路径是采用绝对路径的。
logging.basicConfig(
filename="/var/log/activemq_mointer.log",
filemode="a",
format="%(asctime)s %(name)s:%(levelname)s:%(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
level=logging.DEBUG)
if len(sys.argv) == 2:
mointer_argv = sys.argv[1]
if mointer_argv in ('pending', 'pending_lists', 'queue_sum'):
mq_re = activemq_mointer(userinfo_encode)
if mointer_argv == 'pending':
print(mq_re['pending_queue_sum'])
elif mointer_argv == 'pending_lists':
print(mq_re['pending_queue_lists'])
else:
print(mq_re['mq_sum'])
else:
# 错误提示
print("Please enter the correct parameters pending|pending_lists|queue_sum")
else:
# 错误提示
print("Please enter the correct parameters pending|pending_lists|queue_sum")
使用该脚本注意事项:
传入参数只能一个 ,而且只能是
pending
,pending_lists
,queue_sum
,分别代表阻塞消息数、阻塞消息队列名称、总的消息数。脚本有日志记录和异常记录,注意设置 日志文件路径,假设脚本路径位于
/opt/scripts/
,我们在该目录下进行执行脚本的话,activemq_mointer.log
日志文件也就会产生在当前目录下。我们可以在路径中通过绝对路径来指定文件夹 形如/var/log/activemq_mointer.log
该脚本是由
zabbix agent
进行使用 ,所以我们需要设置该 脚本的权限,以及保证该脚本的用户有创建日志文件的权限(或者我们先前创建好对应权限日志文件)sudo chown zabbix:zabbix mointer_mq_python2.py sudo chmod 744 mointer_mq_python2.py sudo touch /var/log/activemq_mointer.log sudo chown zabbix:zabbix /var/log/activemq_mointer.log
二 、设置 zabbix agent
设置 zabbix agent
# 将监控项配置写入配置文件
sudo echo "UserParameter=activemq.mointer[*],python /opt/scripts/mointer_mq_python2.py \$1 " >> /opt/zabbix-agent/etc/zabbix_agentd.conf
# 重启zabbix agent
sudo systemctl restart zabbix-agent
三、导入监控项:
监控模板 xml 文件。(该监控模板包含三个监控项,一个触发器)
4.0
2019-06-26T03:49:47Z
AWS-1688
Fy-hbg
Template App ActiveMQ
Template App ActiveMQ
AWS-1688
Fy-hbg
ActiveMQ
-
activemq pending amount
0
activemq.mointer[pending]
1m
90d
365d
0
3
条
0
0
0
0
0
ActiveMQ
3s
200
1
0
0
0
0
0
0
0
-
activemq pending queue name
0
activemq.mointer[pending_lists]
1m
90d
0
0
1
0
0
0
0
0
ActiveMQ
3s
200
1
0
0
0
0
0
0
0
-
Total number of activemq msg
0
activemq.mointer[queue_sum]
1m
90d
365d
0
3
条
0
0
0
0
0
ActiveMQ
3s
200
1
0
0
0
0
0
0
0
{Template App ActiveMQ:activemq.mointer[pending].avg(10m)}>=5
1
{Template App ActiveMQ:activemq.mointer[pending].avg(5m)}=0
activemq queue pending on {HOST.NAME}
0
0
3
activemq 消息发生阻塞,10分钟内平均阻塞消息数超过5条
0
0
将该监控模板链接到对应的主机。
我们可以看到我们监控的数据了。
至此,ActiveMQ 的监控项都已经配置好了。