群里今天有个哥们可能对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 不同端口

Low-level Discovery 来实现动态监控同一应用不同端口_第1张图片


4.上述如果都没问题,那么可以操作WEB 页面了。

选择Administration --> General

wKioL1MxLZzA5048AABv7vwEIUY434.jpg

右上角选择正则表达式(Regular expressions)

Low-level Discovery 来实现动态监控同一应用不同端口_第2张图片

创建正则表达式

Low-level Discovery 来实现动态监控同一应用不同端口_第3张图片


5.强烈建议,做个模板,然后在里面配discovery 规则,以及items、trigger、graph

创建模板我就不演示了,偷个懒!! 直接选择Discovery rules 创建规则,如下!!

Low-level Discovery 来实现动态监控同一应用不同端口_第4张图片


这里Macro {#MEMCACHEDPORT},就是我们脚本传来"{#MEMCACHEPORT}",而Regexp是我们刚刚定义的正则表达式名字。


规则创建好了,我们就可以添加items,trgger,graph 了。

注:一定是在我们的模板Memcached 的Discovery 里面添加item

Low-level Discovery 来实现动态监控同一应用不同端口_第5张图片

这里面唯一要注意的,画红线的地方。这里使用的key 末尾{#MEMCACHEDPORT}是我刚才定义的macro。而这里面key,memcached[accepting_conns,*] 是我定义的采集数据的脚本。这个大家可以根据自己的实际情况进行编写,偷懒的话,网上也有模板,动动手谷歌下就来了。!!!


Trigger

Low-level Discovery 来实现动态监控同一应用不同端口_第6张图片


Graph

Low-level Discovery 来实现动态监控同一应用不同端口_第7张图片

通过上述做法,你就可以定义了一个memcached low-level discovery 模板,然后就可以就装   有memcached 主机与这个模板link 上就OK 啦。


这样在Monitoring--> Latest data 中就可以看到数据啦。只不过我这里是没连接,所以没数据!

wKioL1MxLmWgHh_YAAEJ6s0umT4352.jpg


基于这些步骤,大致可以完成你的需求,其他的你就照葫芦画瓢。。然后你也可以配个discovery,只要是memcached 机器全部link 这个Memcached low-level discovery 模板。就又

可以偷点懒了。

如果有参照这个,大家细心点,其实照着itnihao 共享的手册其实已经可以完成这个了。!!

只是大家可能没仔细看吧!!!

写的马马虎虎,见谅!!!