一、lld(low level discovery)概述

什么是lld ?即低水平自动发现,使用它可以自动创建项目、触发器及被监控主机上的实体图。如zabbix 可以自动监控主机上的文件系统和网络拉口,而不需要为每个监控项创建items 。此处,其也可以实现被监控项目的自动删除 。上面的话不是我的总结,是我从官方文档上翻译过来的话。

之前我有写过利用zabbix监控redis 的一篇博文 ,本篇就结合lld 实现单机多redis实例在不知道目前所用端口中的情况下自动发现 。

二、创建模板

由于创建模板不是本篇的重点,就不提创建模板的过程了 。这里重点提下如何在模板中创建自动发现规则。

1、创建自动发现规则

步骤为:Configuration —-> Templates ——> 选中之前创建好的模板名—–>Create discovery rule

discovery-rule

注意,regexp正则部分不能使用”d+” 这种标准的正则语句,只能使用类似 ^(6379|6378)$ 这种格式,平时基本留空。如果填写了内容,表示对上报结果的二次处理。

还需要注意的是,上面的时间默认使用的是3600秒。为什么要使用3600秒?原因是如果设置时间过短,比如你设置60s,一个是服务器的压力大,一个是如果你检测的端口突然当掉了,还没有来的急报警,主机通过json获取不到这个信息(关于json部分,后面会提到),就认为没有这个端口,模板里会自动关闭这个监控项的内容(默认保留30天,然后自动删除),这样报警功能就基本没有了,所以还是发现的间隔时间长一些比较好。

2、创建item prototype

创建好auto discovery rule后,可以通过Configuration —-> Templates —-> Template Redis Auto Discovery(假设模板名为该名称)—-> Discovery rules —-> Item prototypes —-> Create item prototype 创建新的item 。

itemprototype

redis_auto_discovery的模板文件同样我已上传到github上,地址为:https://github.com/361way/zabbix/blob/master/redis/redis_Auto_Discovery.xml

三、客户端配置

1、端口数据json化

端口数据json化 ,这里可以通过python实现:

 1361way@ubuntu:/etc/zabbix$ cat redis_port.py
 2#!/usr/bin/env python
 3import os
 4import json
 5t=os.popen("""netstat -natp|awk -F: '/redis-server/&&/LISTEN/{print $2}'|awk '{print $1}' """)
 6ports = []
 7for port in  t.readlines():
 8        r = os.path.basename(port.strip())
 9        ports += [{'{#REDISPORT}':r}]
10print json.dumps({'data':ports},sort_keys=True,indent=4,separators=(',',':'))

上面代码运行的结果为:

 1361way@ubuntu:/etc/zabbix$ python redis_port.py
 2{
 3    "data":[
 4        {
 5            "{#REDISPORT}":"6376"
 6        },
 7        {
 8            "{#REDISPORT}":"6378"
 9        },
10        {
11            "{#REDISPORT}":"6379"
12        }
13    ]
14}

2、zabbix_agentd.conf配置

在/etc/zabbix/zabbix_agentd.conf末尾加入如下内容:

1UserParameter=redis.discovery,/etc/zabbix/redis_port.py
2UserParameter=redis_stats[*],redis-cli -h 127.0.0.1 -p $1 info|grep $2|cut -d : -f2

注:在一些不规范的维护人员的环境中,其可能把redis-cli 藏到了/opt/redis/bin这样的目录下又未在环境变量中配置,这时候zabbix就会找到redis-cli 程序。也可以把最后一句改为如下的语句,增加其适应性:

1UserParameter=redis_stats[*],(echo info; sleep 1) | telnet 127.0.0.1 $1 2>&1 |grep $2|cut -d : -f 2

上面的telnet 也可以换成nc提交,思路是一样的。配置完成后,通过sudo /etc/init.d/zabbix-agent restart 重启服务,使配置生效 。

四、服务端端配置及验证

服务端上通过configuration ——> hosts ——-> 增加主机的方式完成主机增加后(这里的篇幅省略),并不会立即自动发现主机,在本篇开始Create discovery rule 时,设置的时间是3600秒,也即在一个小时内能发现主机上的多个redis实例都是正常的。如果你着急看到结果,可以将该值调小,验证了再改回去。也可以通过zabbix_get进行验证:

1[root@361way zabbix_agentd.d]# zabbix_get -s 172.20.0.214 -k redis_stats[6378,used_memory:]
2808272
3[root@361way zabbix_agentd.d]# zabbix_get -s 172.20.0.214 -k redis_stats[6378,blocked_clients]
40

经验证是可以正常取得数据的。

五、其他问题

第三步里的 json脚本中调用netstat命令中的-p参数,很多网友遇到zabbix无法运行使用的情况 。针对该问题,默认如果使用apt源安装的话,会发现zabbix的用户shell指的是/bin/false ,而其启动脚本是以deamon的方式运行的 。这里相当于是由root用户发起的一组进程请求,是可以直接运行netstat -p参数的。如果是通过源码包或者真遇到了无法使用-p参数的情况,可以通过下面两种方法解决:

方法一:通过sudo 赋予权限

在/etc/sudoers中增加如下一行

1zabbix ALL=(root) NOPASSWD:/bin/netstat

同时修改其中的一行

1sed -i 's/^Defaults.*.requiretty/#Defaults    requiretty/' /etc/sudoers

方法二:s 权位法

在linux有一种权限们叫s ,可以通过下面的命令为netstat命令增加 s 权位,不过这样所有的用户都拥有了使用netstat -p参数的权限 。

1chmod +s /bin/netstat

**最后:**给一下多实例redis low level discovery下的监控出图截图

redis-zabbix-lld