zabbix 可以通过常见的手段监控到各种服务,通过编写脚本来获取返回值并将获取到的值通过图形来展现出来,包括(系统、服务、业务)层面。可是有些时候在一些不固定的场合监控一些不固定的服务就比较麻烦。例如,服务器运行三台 redis,端口分别是 7000 7001 7002,那么这时候如果需要监控则需要建立三个模板,分别对应不同的模板又要设置不同的 Shell Script 及 UserParameter 来监控不同端口的服务。 zabbix 有 LLD 特性(low level discovery),属于自动发现的范畴(该自动发现属于多服务的监控,是系统层面的),你会发现有很多要监控的对象大部分都是不固定的,到处都是LLD。换句话说,我们要监控的对象如果是固定的,那直接添加一个item就可以了,但是如果不是固定的,那就需要用LLD。
举几个栗子:
1、如果要监控CPU(s)使用率,这在Linux里是一个固定的值,添加一个item就可以。
如果要监控每个cpu的使用率,这就需要LLD了,因为每个机器的cpu个数都不一样,我们需要先发现cpu个数,在监控每个cpu的使用率。
2、每个机器的分区也不一样,需要用到LLD
3、每个交换机的网口个数也不一样,需要用到LLD
Zabbix官方其实早就想到了这点,为我们做好了6个自动发现功能,真贴心
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; (discovery[{#MACRO1}, oid1, {#MACRO2}, oid2, …,])
discovery using ODBC SQL queries; (db.odbc.discovery[,])
discovery of Windows services. (service.discovery)
这几个自动发现已经满足我们一些基本需求了,但是我们的需求是无穷无尽的,所以我们还需要自己构建一些自动发现。
下面来讲一下 zabbix 针对 多台 redis 的自动发现。
实验环境
redis_host redis_port redis_pass
10.1.0.55 7000 yunjee0515
10.1.0.55 7001 yunjee0515
10.1.0.55 7002 yunjee0515
redis-7000 主要配置
daemonize yes
port 7000
bind 10.1.0.55
requirepass yunjee0515
redis-7001 主要配置
daemonize yes
port 7001
bind 10.1.0.55
requirepass yunjee0515
redis-7002 主要配置
daemonize yes
port 7002
bind 10.1.0.55
requirepass yunjee0515
zabbix redis low_level_discovery 实现过程
一、编写 zabbix redis_low_discovery.sh 脚本(zabbix shell 脚本)
#!/bin/bash
# Fucation: redis low-level discovery
# Script_name redis_low_discovery.sh
redis() {
port=($(sudo netstat -tpln | awk -F "[ :]+" ‘/redis/ && /0.0.0.0/ {print $5}‘))
printf ‘{\n‘
printf ‘\t"data":[\n‘
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F ‘=‘ ‘{print $10}‘|cut -d ‘ ‘ -f 1`
printf ‘\t {\n‘
printf "\t\t\t\"{#REDISPORT}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F ‘=‘ ‘{print $10}‘|cut -d ‘ ‘ -f 1`
printf ‘\t {\n‘
printf "\t\t\t\"{#REDISPORT}\":\"${port[${key}]}\"}\n"
fi
done
printf ‘\t ]\n‘
printf ‘}\n‘
}
$1
二、编写 zabibx redis_low_discovery_key 文件(zabbix U、userparameter )
UserParameter=zabbix_low_discovery[*],/bin/bash /usr/local/zabbix/shell/redis_low_discovery.sh $1
UserParameter=redis_stats[*],/usr/local/redis/src/redis-cli -h 10.1.0.55 -p $1 -a yunjee0515 info|grep $2|cut -d : -f2
三、安全相关设置
允许 zabbix 用户无密码运行 netstat 及 Disable requiretty
echo "zabbix ALL=(root) NOPASSWD:/bin/netstat">>/etc/sudoers
sed -i ‘s/^Defaults.*.requiretty/#Defaults requiretty/‘ /etc/sudoers
四、重启 zabbix_agentd 并尝试获取值
如果能够正常获取到 redis 的信息,那么在服务器端操作已经完成
五、导入 redis discovery 模板
六、设置正则表达式及匹配 low_level_discovery 过滤器
打开 zabbix 页面,选择管理 —> 一般 —> 正则表达式 —> 添加新的正则表达式
接着打开 redis discovery 模板,点击过滤器,查看过滤器匹配的正则表达式是否和前面命名的一致,如果一致,则证明成功匹配。
七、通过 zabbix 里面的动作来自动注册主机或者手动链接模板
八、重启 zabbix_agentd
在重启之后可以将自动发现的时间改小以便用于验证,我这边改为 60s 一发现
下图中可以看到图形已经展示出来
如下是效果展示图:
1、Redis Port Connections
2、Redis Port key
3、Redis Port Last_save_time
4、Redis Port Status
5、Redis Port Uptime_in_seconds
6、Redis Port Used memory