以redis为例,我已经对redis做了简单的监控。但是redis的db如果有多个,就需要自动的进行发现下
首先,需要明白要提取的主要键是什么,在这里redis主要拿的就是db几。那么,编写一个脚本发现有多少个db。如下:
#!/usr/bin/env python
#-*- encoding: utf-8 -*-
#########################################################################
# File Name: dbname.py
# Author: www.linuxea.com
# Email: [email protected]
# https://github.com/marksugar/zabbix-complete-works
#########################################################################
import os
import json
t=os.popen(""" /usr/bin/redis-cli -a mima info Keyspace|grep db|awk -F: '{print $1}' """)
redis_db_name = []
for dname in t.readlines():
r = os.path.basename(dname.strip())
redis_db_name += [{'{#REDIS_DB}':r}]
print json.dumps({'data':redis_db_name},sort_keys=True,indent=4,separators=(',',':'))
当运行之后的json格式如下
[root@DT_Node-172_30_199_2 /etc/zabbix/scripts]# python redis_discovery.py
{
"data":[
{
"{#REDIS_DB}":"db1"
}
]
}
这里只显示了一个db1。
- 这里较为关键的是key:value映射关系
"{#REDIS_DB}":"db1"
,{#REDIS_DB}
将会在模板中被引用
上面的发现脚本放在/etc/zabbix/scripts下。并且/etc/zabbix/zabbix_agentd.d/下创建redis.conf 。如下:
UserParameter=redis_db.discovery,/etc/zabbix/scripts/redis_discovery.py
redis_db.discovery是作为key。在模板中引用
而后在模板中的 Discovery中,如下图
而后点击create discovery rule。在key中填写redis_db.discovery
引入。如下
name : redis:{#REDIS_DB}: avg_ttl
key : redis.discovery.db.avg_ttl[{#REDIS_DB}]
如下图:
同时,我们在zabbix_agent的redis.conf中在添加三个item
#avg_ttl
UserParameter=redis.discovery.db.avg_ttl[*],redis-cli -a mima info Keyspace| awk -F= '/$1/{print $$4}'
什么意思呢?
上面的items中redis.discovery.db.avg_ttl[{#REDIS_DB}]
,[{#REDIS_DB}]
就是自动发现中的db1,而在redis.conf中UserParameter=redis.discovery.db.avg_ttl[*]
变成了*,*此刻就是db1
顺序:
redis_db.discovery 发现到value,也就是db1 传递到zabbix-server,zabbix接收到后在将value传到redis.discovery.db.avg_ttl[*]
完成获取
其他的在如法炮制
UserParameter=redis_db.discovery,/etc/zabbix/scripts/redis_discovery.py
#keys
UserParameter=redis.discovery.db.keys[*],redis-cli -a mima info Keyspace| awk -F= '/$1/{print $$2}'|awk -F, '{print $$1}'
#expires
UserParameter=redis.discovery.db.expires[*],redis-cli -a mima info Keyspace| awk -F= '/$1/{print $$3}'|awk -F, '{print $$1}'
#avg_ttl
UserParameter=redis.discovery.db.avg_ttl[*],redis-cli -a mima info Keyspace| awk -F= '/$1/{print $$4}'
那么如果有多个参数呢。以ActiveMQ为例。模板中的key如下
activemq.status[{#QUEUES_NAME},consumerCount]
#QUEUES_NAME
作为发现Queues_name的参数,consumerCount
作为实际传递的参数。这两个参数最终传递zabbix_agentd.d下的ActiveMQ.conf中。如下
UserParameter=discovery.activemq.queues,/etc/zabbix/scripts/Queues_Name.py
UserParameter=activemq.status[*],curl -s -uadmin:admin http://127.0.0.1:8161/admin/xml/queues.jsp |grep -v "^$"| grep -A 5 """<queue name=\"$1\">"""|awk -F \" '/$2/{print $$2}'
activemq.status[*]
: *表示可以接收多个参数$1
: $1就是{#QUEUES_NAME}
的值$2
:$2就是consumerCount$$2
: 如果不是传递参数,使用$$,如: $$2