通过编写脚本来获取tcp的各种状态,添加tcp状态模板,触发器,图形,完整实现通过脚本自定义监控的整体流程
[root@localhost ~]# mkdir /etc/zabbix/scripts
[root@localhost ~]# chown zabbix.zabbix /etc/zabbix/scripts/
创建获取tcp状态的脚本,内容如下所示
#!/bin/bash
#this script is used to get tcp and udp connetion status
#tcp status
metric=$1
tmp_file=/tmp/tcp_status.txt
/bin/netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' > $tmp_file
case $metric in
closed)
output=$(awk '/CLOSED/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
listen)
output=$(awk '/LISTEN/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
synrecv)
output=$(awk '/SYN_RECV/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
synsent)
output=$(awk '/SYN_SENT/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
established)
output=$(awk '/ESTABLISHED/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
timewait)
output=$(awk '/TIME_WAIT/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
closing)
output=$(awk '/CLOSING/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
closewait)
output=$(awk '/CLOSE_WAIT/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
lastack)
output=$(awk '/LAST_ACK/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
finwait1)
output=$(awk '/FIN_WAIT1/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
finwait2)
output=$(awk '/FIN_WAIT2/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
*)
echo -e "\e[033mUsage: sh $0 [closed|closing|closewait|synrecv|synsent|finwait1|finwait2|listen|established|lastack|timewait]\e[0m"
esac
执行自定义脚本获取数据,需要在配置文件中打开相应选项,如果已经开启可以跳过此步骤
[root@localhost ~]# egrep -v "(^#|^$)" /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=1
EnableRemoteCommands=1 #允许在本地执行远程命令
Server=c2600217k6.wicp.vip
ListenPort=10050
ListenIP=0.0.0.0
StartAgents=3
Hostname=47.96.226.49
UnsafeUserParameters=1 #启用用户自定义监控脚本
Include=/etc/zabbix/zabbix_agentd.d/*.conf
Timeout=8
[root@localhost ~]# cat /etc/zabbix/zabbix_agentd.d/tcp-status-params.conf
UserParameter=tcp.status[*],/etc/zabbix/scripts/tcp_conn_status.sh $1
说明:此处的tcp.status就是监控项名,后面的$1是对应的参数
例如closewait的状态就是tcp.status[closewait]
[root@localhost ~]# systemctl restart zabbix-agent.service
通过server端的zabbix_get测试是否能获取自定义监控的数据
[root@localhost ~]# zabbix_get -s ip -p 10050 -k “tcp.status[listen]”
13
[root@localhost ~]# zabbix_get -s ip -p 10050 -k "tcp.status[listen]"
13
有数据没有问题
注意:这命令是在zabbix的server端执行,不是在agent端执行
如果没有zabbix_get命令,安装zabbix_get
[root@localhost ~]# yum -y install zabbix-get
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 zabbix-get-4.0.12-1.el7.x86_64 已安装并且是最新版本无须任何处理
在agent端配置完成后还需要在zabbix server web上创建对应的模板,其他主机可以套用模板来获取自定义数据
在配置–>模板–>创建新模板
模板名称"TCP_CONN_STATUS" 群组放到Templates,配置如下图所示
在创建好模板后,创建监控项,应该先创建应用集的,不过在创建监控项的时候可以直接创建应用集,所以跳过了创建应用集这项。
在配置–>模板–>TCP_CONN_STATUS 找到刚创建的模板–>监控项–>创建监控项
在监控项中我们定义名称TCP_CONN_LISTEN用来监控tcp中LISTEN数,键值是我们前面在自定义key中定义的tcp.status[listen],然后在应用集处选择新的应用集TCP_CONN_STATUS,点击添加,如下图所示:
通过以上步骤依次创建tcp其他的状态如TCP_CONN_CLOSED,TCP_CONN_FIN-WAIT-1、TCP_CONN_LAST-ACK、TCP_CONN_SYN-RECV、TCP_CONN_TIME-WAIT等
最终监控项如下图所示:
在配置–>模板–>TCP_CONN_STATUS 找到刚创建的模板–>触发器–>创建触发器,如下图所示:
创建名称为Too Many Tcp Closewait的触发器,设置closewait数量大于多少就报警,我设置的是500,表达式为{TCP_CONN_STATUS:tcp.status[closed].last()}>500,具体配置如下图所示:
表达式那里点添加,在监控项中选择closewait的监控项,将结果选成>500点击插入就好了,如下图所示:
配置–>模块–>TCP_CONN_STATUS -->图形 -->创建图形 -->名称 “TCP_CONN_STATUS_Graph” -->选择之前的监控项 -->添加 如图:
到这里一个自定义的监控模板定义完成
将我们刚建立的模板关联到我们的主机上,让模板生效
在配置–>主机–>选择要监控的主机–>点击模板–>在链接指示器上选择我们刚创建好的模板点击添加–>点击更新,此模板就被添加上了,如下图所示:
我们可以在检测–>最新数据–>选择刚刚添加模板的主机–>选择应用集(TCP_CONN_STATUS)可以看到有最新数据生成,说明我们模板配置成功,如下图所示:
也可以在图形中选择我们前面创建的TCP_CONN_STATUS_Graph可以看到有图形生成,如下图所示:
小知识:
在我们创建好模板后,可以选择将模板导出,方便我们分享和重复使用
在配置–>模板–>找到我们创建的模板–>勾选上模板–>点击导出
将导出的文件保存下来,就可以在其他主机上使用了,注意模板和agent的配置要保持一致