群里今天有个哥们可能对low-level discovery 理解有点偏差,导致出了个小问题很久没排查出来。个人觉得这个需求接下来,肯定更多人会去使用,避免大家走些弯路。特此玛下文档,文字功底不好,请原谅!!
需求:
基于中小型公司,成本原因,很可能一台机器上部署多个同一个应用,但是不同端口的应用。比如在一台机器上部署5 个memcached.但是端口不尽相同,这样在zabbix 监控时,有点不好办,有可能需要写多个不同端口的脚本去监控,也有可能通过宏定义来解决,但是太麻烦了!!!
解决:
Zabbix 有个功能是low-level discovery,自己写个JSON 格式的小脚本,输出本机不同端口同一应用。然后弄个模板,结合JSON 脚本,就能实现不同端口同一应用监控。
案例:
这里列举我生产案例当中的memcached,而redis 也是一样,只是利用zabbix 用户做的时候,有点小麻烦!!!
1.准备json 脚本,我这里是shell
cat memcached.sh
#!/bin/bash discovery(){ #netstat -nlput|awk -F":" '/memcached/ {print $0}' |grep -v udp |awk -F: '{print $2}'|awk '{print$1}' >/tmp/memcached.log ps -ef | grep memcached | grep -v grep | awk '{print $17}' > /tmp/memcached.log port=($(cat /tmp/memcached.log)) printf '{\n' printf '\t"data":[\n' for((i=0;i<${#port[@]};i++)) { num=$(echo $((${#port[@]}-1))) if [ "$i" != ${num} ]; then printf "\t\t{ \n" printf "\t\t\t\"{#MEMCACHEDPORT}\":\"${port[$i]}\"},\n" else printf "\t\t{ \n" printf "\t\t\t\"{#MEMCACHEDPORT}\":\"${port[$num]}\"}]}\n" fi } } case "$1" in discovery) discovery ;; esac
2.客户端zabbix_agentd.conf 文件中调用
UnsafeUserParameters=1 UserParameter=redis.discovery,/usr/local/zabbix/bin/redis.sh discovery
3.服务端测试,是否能发现客户端的memcached 不同端口
4.上述如果都没问题,那么可以操作WEB 页面了。
选择Administration --> General
右上角选择正则表达式(Regular expressions)
创建正则表达式
5.强烈建议,做个模板,然后在里面配discovery 规则,以及items、trigger、graph
创建模板我就不演示了,偷个懒!! 直接选择Discovery rules 创建规则,如下!!
这里Macro {#MEMCACHEDPORT},就是我们脚本传来"{#MEMCACHEPORT}",而Regexp是我们刚刚定义的正则表达式名字。
规则创建好了,我们就可以添加items,trgger,graph 了。
注:一定是在我们的模板Memcached 的Discovery 里面添加item
这里面唯一要注意的,画红线的地方。这里使用的key 末尾{#MEMCACHEDPORT}是我刚才定义的macro。而这里面key,memcached[accepting_conns,*] 是我定义的采集数据的脚本。这个大家可以根据自己的实际情况进行编写,偷懒的话,网上也有模板,动动手谷歌下就来了。!!!
Trigger
Graph
通过上述做法,你就可以定义了一个memcached low-level discovery 模板,然后就可以就装 有memcached 主机与这个模板link 上就OK 啦。
这样在Monitoring--> Latest data 中就可以看到数据啦。只不过我这里是没连接,所以没数据!
基于这些步骤,大致可以完成你的需求,其他的你就照葫芦画瓢。。然后你也可以配个discovery,只要是memcached 机器全部link 这个Memcached low-level discovery 模板。就又
可以偷点懒了。
如果有参照这个,大家细心点,其实照着itnihao 共享的手册其实已经可以完成这个了。!!
只是大家可能没仔细看吧!!!
写的马马虎虎,见谅!!!