Zabbix虽然有了众多的基础item配置监控,但是很多item并不能满足我们的需要。此时,我们需要借助Zabbix的用户自定义参数UserParameter来自定义我们的Item。
UserParameter语法说明
UserParameter=,
用户自定义参数包含一个key和一个命令,key必须整个系统唯一,配置好之后,重启客户端。 然后配置item,在key的位置填上我们自定义的key即可。
Zabbix-agent配置文件
自定义Key的配置文件需要放在指定的目录下,这个目录由zabbix-agent配置文件来指定。
[root@node2 ~]# vim /etc/zabbix/zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf
添加配置文件
[root@node2 zabbix_agentd.d]# vim /etc/zabbix/zabbix_agentd.d/os.conf
UserParameter=os.memory.used,free -m|awk '/^Mem/ {print $3}'
添加配置文件后需要重启服务才能生效
[root@node2 zabbix_agentd.d]# systemctl restart zabbix-agent
Zabbix程序测试
我们已经通过上面的配置,定义好了一个key(os.memory.used
),接下来我们可以使用zabbix-agent来手动测试是否能获取到我们定义的key.
服务端使用程序zabbix-get
[root@node1 ~]# zabbix_get -s 192.168.1.74 -k os.memory.used
107
Zabbix web页面配置
我们已经通过测试,并且能够娶到响应的值了,接下来需要在zabbix web页面下进行配置,添加此key。
添加新的监控项
找到我们的目标host,添加一个新的监控项,手动填写我们的key值os.memory.used
定义完之后,我们就可以在Latest Data 查看其Graph
UserParameter参数高级用法
UserParameter中的参数能接收参数的方法,是的添加Item更加方便。
语法
UserParameter=key[*],
高级用法示例
我们通过写脚本来自定义,监控TCP状态的连接数
各种状态的说明:
- LISTEN - 侦听来自远方TCP端口的连接请求;
- SYN-SENT -在发送连接请求后等待匹配的连接求;
- SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
- ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
- FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
- FIN-WAIT-2 - 从远程TCP等待连接中断请求;
- CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
- CLOSING -等待远程TCP对连接中断的确认;
- LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
- TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
- CLOSED - 没有任何连接状态
使用命令获取TCP连接的状态
要想监控TCP的连接数目,我们需要通过编写脚本获取各个TCP连接的状态,这是一个基础。
[root@node2 ~]# netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S)print a,S[a]}'
LISTEN 7
ESTABLISHED 2
TIME_WAIT 4096
1.提供配置文件
在zabbix-agent端指定的目录下提供配置文件status.conf
[root@node2 ~]# vim /etc/zabbix/zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf
[root@node2 zabbix_agentd.d]# vim /etc/zabbix/zabbix_agentd.d/*.conf/status.conf
UserParameter=linux.status[*],/etc/zabbix/zabbix_agentd.d/tcp_conn.sh "$1" "$2"
2.编写获取tcp状态的脚本
[root@node2 ~]# vim /etc/zabbix/zabbix_agentd.d/tcp_conn.sh
#!/bin/bash
tcp_conn_status(){
TCP_STAT=$1
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt
TCP_STAT_VALUE=$(grep "$TCP_STAT" /tmp/tcp_conn.txt | cut -d ' ' -f2)
if [ -z $TCP_STAT_VALUE ];then
TCP_STAT_VALUE=0
fi
echo $TCP_STAT_VALUE
}
main(){
case $1 in
tcp_status)
tcp_conn_status $2;
;;
*)
echo "$0 + tcp_status + SYN-RECV | LISTEN | CLOSE-WAIT | ESTAB | FIN-WAIT-1 | TIME-WAIT | SYN-SENT "
esac
}
main $1 $2
[root@node2 zabbix_agentd.d]# chmod +x tcp_conn.sh
3.修改完后,我们需要重启zabbix-agent
[root@node2 ~]# systemctl restart zabbix-agent
4.测试脚本
运行脚本
/etc/zabbix/zabbix_agentd.d/tcp_conn.sh + tcp_status + SYN-RECV | LISTEN | CLOSE-WAIT | ESTAB | FIN-WAIT-1 | TIME-WAIT | SYN-SENT
[root@node2 ~]# /etc/zabbix/zabbix_agentd.d/tcp_conn.sh tcp_status SYN-RECV
0
[root@node2 ~]# /etc/zabbix/zabbix_agentd.d/tcp_conn.sh tcp_status LISTEN
7
因为脚本执行后产生的文件/tmp/tcp_conn.txt在/tmp下,所以我们需要让zabbix对这个文件有读写权限
[root@node2 zabbix_agentd.d]# chown zabbix.zabbix /tmp/tcp_conn.txt
[root@node2 ~]# cat /tmp/tcp_conn.txt
SYN-RECV 154
LISTEN 7
CLOSE-WAIT 1
ESTAB 927
FIN-WAIT-1 15
TIME-WAIT 4061
SYN-SENT 318
5.使用程序手动获取数据
我们写好脚本之后,但是不确定是否能取到数据,我们就是用zabbix的命令行工具手动去获取数据,看看是否能取到我们想要的参数。
获取参数的语法需要结合脚本跟脚本执行生成的conn.txt文件去使用
[root@node1 ~]# zabbix_get -s 192.168.1.74 -k linux.status[tcp_status,SYN-RECV]
256
[root@node1 ~]# zabbix_get -s 192.168.1.74 -k linux.status[tcp_status,LISTEN]
7
[root@node1 ~]# zabbix_get -s 192.168.1.74 -k linux.status[tcp_status,CLOSE-WAIT]
208
[root@node1 ~]# zabbix_get -s 192.168.1.74 -k linux.status[tcp_status,ESTAB]
1018
[root@node1 ~]# zabbix_get -s 192.168.1.74 -k linux.status[tcp_status,FIN-WAIT-1]
61
[root@node1 ~]# zabbix_get -s 192.168.1.74 -k linux.status[tcp_status,TIME-WAIT]
4083
[root@node1 ~]# zabbix_get -s 192.168.1.74 -k linux.status[tcp_status,SYN-SENT]
190
6.在web界面添加这些key值
我们已经能取到tcp状态的key值了,接下来我们将这些key配置到对应主机的Item中
其他几个跟上面一样添加,添加完之后,我们需要自定义Graph才能看到对应的图像
7.添加图形
这里我们将这些key都定义到一个图像中
创建Graphs
添加items
8.查看图形