1 zabbix的low level discovery的作用(官网):
Low-level discovery provides a way to automatically create items, triggers, and graphs for different entities on a computer. For instance, Zabbix can automatically start monitoring file systems or network interfaces on your machine, without the need to create items for each file system or network interface manually. Additionally it is possible to configure Zabbix to remove unneeded entities automatically based on actual results of periodically performed discovery.
我不知道怎么翻译这个low level discovery,不过这个和configuration下面的discovery rules肯定不一样,那个是主机层次的,这个low level我就暂且理解为基于主机的细节层次的自动发现,不是发现主机,而是发现主机的特殊元素了,然后server根据从agent获得的数据,自动添加这些items。目前zabbix已经友好地为我们添加了大概如下的自动LLD,网络接口,CPU核心,SNMP OID和盘的容量,官网写的如下:
discovery of file systems;(vfs.fs.discovery)
discovery of network interfaces;(net.if.discovery)
discovery of CPUs and CPU cores;(system.cpu.discovery)
discovery of SNMP OIDs.
2 简单介绍下个人理解的原理
原理有点像key,首先zabbix客户端和服务端平常交互都是通过JSON式的格式传输数据,而且服务端可以认识这些夹杂着变量的数据。以tomcat为例,我们的目的是想让zabbix的web主动添加那些监听端口而不是我们在模板指定的端口,这个端口是根据agent的特殊情况而决定的。所以我们zabbix的agent通过key的方式发送JSON格式的数据,包含LLD需要的这些变量及其数据,server会根据web的discovery的设置对应到discovery的item,并和其他item一样类似地监控。下面来看看我的步骤,再自己理解下吧。
3 第一步,想办法输出你要捕获的东西,比如tomcat的端口
# 这一步就是我取出的listener的port的
cat $server_xml|grep "\<Connector port"|awk -F"\"" '{print $2}'
4 第二步,把这些内容输出为JSON格式,这里说下,脚本可能会写错或有问题,所以建议有问题的时候sh -x SCRIPT来检测错误,整体的脚本为
# tomcat.sh #!/bin/sh # lld about tomcat7.0.53 ports by liuliancao at 2015/12/23 Wed. # where is your tomcat server.conf server_xml="/opt/tomcat/conf/server.xml" # print json style output for server tomcat_discovery(){ # try to catch the port cat $server_xml|grep "\<Connector port"|awk -F"\"" '{print $2}' > /tmp/tomcat_discovery.out if [ -s /tmp/tomcat_discovery.out ];then item=($(cat /tmp/tomcat_discovery.out)) printf "{\n" printf "\t\"data\":[\n" for((i=0;i<${#item[@]};i++)) { num=$(echo $((${#item[@]}-1))) if [ "$i" != ${num} ];then printf "\t\t{\n" printf "\t\t\t\"{#TOMCATPORT}\":\"${item[$i]}\"},\n" else printf "\t\t{\n" printf "\t\t\t\"{#TOMCATPORT}\":\"${item[$num]}\"}\n\t]\n}\n" fi } else echo "check port listened in your server.xml!" fi } case "$1" in discovery) tomcat_discovery;; esac
5 把刚刚的脚本做成一个key,然后你懂的
[root@Zabbix-Server ~]# cat /etc/zabbix/zabbix_agentd.conf.d/tomcat.conf
UserParameter=tomcat.discovery,/bin/sh /etc/zabbix/scripts/tomcat.sh discovery
[root@Zabbix-Server ~]# service zabbix_agentd restart
# 必须满足下面的类似输出结果才行,保证key可用
[root@Zabbix-Server ~]# zabbix_get -s localhost -k tomcat.discovery
{
"data":[
{
"{#TOMCATPORT}":"18080"},
{
"{#TOMCATPORT}":"8443"},
{
"{#TOMCATPORT}":"8009"}
]
}
6 上面的内容做出来下面就是web的添加了,和item差不多,不过我们要选择模板的discovery
然后
这个时候也就是我们做到了把客户端的JSON数据拿到了,下面就是添加item了,但这个怎么自动呢,在哪儿添加呢?
7 添加万itemtype,我们看到,是一排
按照自己想要的添加就行了,就像平常一样,这里我举个例子
添加的itemtypes
最终绑定host后出现了下面的
如果你的item对应的key是对的,那么就会出现数据。
我的18080和8443都没监听,而且8009模板中已经有了,所以就没有这个添加的item,不过通过这个例子,相信大家已经知道怎么做了吧。
8 总结下:把想要自定义的数据做成key,key返回JSON格式数据,在web上的模板中添加discovery,在discovery中的itemtypes等添加自己的item(带你的自定义的参数的),最终去host看是否有这个item,看latest data是否有数据。