zabbix server:
hostname=Zabbix server
ip:192.168.100.7
zabbix agent:
hostname=host3
ip:192.168.100.3
目前状态如下,使用的全是zabbix自带的监控插件,在某些情况下,我们自己的一些应用,或者系统上的一些值无法被zabbix监控,这时,需要自定义一些监控项,监控项可以直接使用shell命令,bash脚本,开发语言来生成,最终结果是需要返回一个值,交给zabbix进行监控,然后进行一系列操作,下面,跟随本文开始配置。
自定义监控:
#在zabbix agent端通过某种手段取得值,然后zabbix_agent把值传给server端,或者server端自己来取,server端通过这个值,进行分析判断,建立图表,根据值的变化做报警等。
情况1:服务器上存在nginx服务(如下),监听端口8219,zabbix不提供此端口监控,需要自定义一个监控项来监控此端口的可用性。
[root@host3 [17:49:02]~]#netstat -antp |grep nginx tcp 0 0 0.0.0.0:8219 0.0.0.0:* LISTEN 15246/nginx
新建如下脚本
#echo $? 必须存在,显示的结果就是这个脚本返回的结果。
[root@host3 [17:52:29]~]#cat /shell/nginx_status.sh
curl -'I' localhost:8219/abc --connect-timeout 2 &>/dev/null
echo $?
执行此脚本测试
#返回的值是0代表本地的8219端口是可以正常连接的。
[root@host3 [17:52:31]~]#bash /shell/nginx_status.sh 0
编辑zabbix_agentd.conf 配置文件,增加下方配置。
#关键词 UserParameter 定义一个key=nginx_status ,values=(key后方命令的结果`echo $?`)
#key
#定义完毕后,重启zabbix_agentd 服务,才可生效
[root@host3 [17:58:08]~]#cat /usr/local/zabbix/etc/zabbix_agentd.conf |grep nginx UserParameter=nginx_status,bash /shell/nginx_status.sh
Server端可用命令连接Agent端来获取这个值,看是否可以正常获取到数据,这个步骤正常进行后,再添加到网页端上,进行监控。
#-s 指定agent端地址,-k指定key
[root@Centos7 bin]# ./zabbix_get -s 192.168.100.3 -k nginx_status 0
server端可以正常获取值后,在网页端上添加针对这个值的监控。
根据监控项查看是否获取到了对应的结果。
情况2 : 记录mysql的连接数信息,后根据此图做图表。
编辑agent配置文件,并重启agentd端
#Threads 代表连接数
[root@host3 [20:55:12]~]#mysqladmin -uroot -pnihao123! status
Uptime: 86 Threads: 1 Questions: 12 Slow queries: 0 Opens: 15 Flush tables: 1 Open tables: 8 Queries per second avg: 0.139
[root@host3 [20:57:08]~]#cat /usr/local/zabbix/etc/zabbix_agentd.conf | grep mysql UserParameter=mysql_Threads,mysqladmin -uroot -pnihao123! status |awk '{print $4}'
#使用zabbix_get命令来检查key是否设置成功,看是否有values,这一步建议是必须做的,且这个例子下,你可以自己完成,熟悉下命令。
添加监控项
情况3 : 监控系统的tcp连接条数,记录TIME_WAIT ,ESTABLISHED等连接状态的连接数。
编辑获取连接数脚本
# 2>/dev/null 默认启动zabbix agentd进程的不是root用户,导致执行netstat命令时,是看不到进程名称的,会报一个权限不足,但是还是会把我们有权限看的给打印出来,我们只需要看状态码,所以把权限不足错误给关闭。
#根据$1 传入的位置变量来过滤连接状态,总结并返回行数,代表有多少条这样的连接
#如果$1为空,就返回0,不执行查询操作
[root@host3 [20:16:17]/shell]#cat /shell/tcp.sh
#!/bin/bash
if [ ! $1 ];
then
echo 0
exit
fi
netstat -'antp' 2>/dev/null |awk '{print $6}'| grep $1 |wc -l
编辑agentd端配置文件,并重启agentd端。
# key[*] 获取key时可附带参数,将作为获取values时传入的位置参数,从而被脚本读取
[root@host3 [19:58:21]/usr/local/zabbix/etc]#cat zabbix_agentd.conf |grep tcp UserParameter=tcp_status[*],bash /shell/tcp.sh $1
server端,获取key 测试.
[root@Centos7 bin]# ./zabbix_get -s 192.168.100.3 -k "tcp_status[ESTABLISHED]" 3 [root@Centos7 bin]# ./zabbix_get -s 192.168.100.3 -k "tcp_status[TIME_WAIT]" 33
在网页端添加监控项
查看获取到的values
#values 是0因为我们没有传入任何位置参数给脚本,脚本判断没有位置参数就返回一个0,那么怎么定义位置参数传入脚本呢-在看完此例子后接着阅读下方的自定义图表。
自定义图表:
1.通过mysql连接数来制作第一个图表。
查看图表
2.创建监控多种连接状态的图表。
#调整之前的connect_status(tcp_status) 监控
原有:
现有:
#传入位置参数:ESTABLISHED ,代表,查询ESTABLISHED的连接数。
#ESTABLISHED是一种连接状态,如果要获取更多的连接状态的条数,再创建一个一样的监控项,只需要改传入的参数。
添加监控项:
#同时添加2个监控
查看监控
这里还有一些个小知识点:
1.你可以看到上图中的connect_status[ESTABLISHED] 现在的值是9,代表有9个ESTABLISHED(已建立的)连接,但是系统中,实际看一下已建立连接,一直是少一个的。
[root@host3 [21:51:15]/shell]#netstat -antp |grep ESTABLISHED |wc -l 8
因为目前已建立的连接是8个,当zabbix-server请求获取数据时,会向agent建立连接,建立连接后,server端执行此命令后会看到9个已建立连接(把自己跟agent端建立的连接也计算在内),计算机计算速度很快,当你去agent上去手动查看有多少连接时,这个连接已经是TIME_OUT状态了。
2.上图中的connect_status[TIME_WAIT]值最大的时候是12,但是突然一下就降为2以下。
在主动模式中,server端会频繁的向agent端请求数据,每次都是开启一个新的连接,而且是一直在请求,那么这种情况,你可能会想到通过设置长连接来保持连接就行了,但是,很抱歉,zabbix不支持长连接~
无奈,软件不支持长连接,只能让我们的系统来延长连接时间了。
net.ipv4.tcp_keepalive_time = 1800 #tcp连接时间保持1800秒
net.ipv4.tcp_tw_recycle = 1 #回收TIME_WAIT占用的连接
[root@host3 [22:06:14]/shell]#tail -2 /etc/sysctl.conf net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_tw_recycle = 1 [root@host3 [21:40:57]/shell]#sysctl -p net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_tw_recycle = 1