自定义Zabbix监控项
1.为什么要自定义监控项
模板里面提供了大量的监控项,为何还要自定义?
那肯定是有些你想监控的内容,模板里没有
当然,zabbix支持你自定义的监控项,所以才那么流行!
2.自定义监控项流程
1.自定义监控项的表现形式是(命令、脚本),只要能获取到值,就可以通过zabbix展示
完全流程
1. 写命令、脚本
2. 编写zabbix的自定义监控项的配置文件
3. 重启zabbix-agent
4. 试试zabbix-get能拿到数据吗
5. 去zabbix-ui 添加监控项
3.实战项目
① 采集TCP连接状态
精确分析tcp连接状态,可以精准得知服务器的链接情况,确保web服务器的健康
1. 命令获取tcp的状态
# -a 显示所有socket、-t显示tcp协议连接 -n 只显示ip
[root@web-7 ~]#netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.7:10050 10.0.0.61:59054 TIME_WAIT
tcp 0 0 10.0.0.7:10050 10.0.0.61:58996 TIME_WAIT
2.提取精准的状态数据
# -c 统计行数
[root@web-7 ~]#netstat -ant |grep -c TIME_WAIT
34
# 有6个tcp已经确认建立了连接
[root@web-7 ~]#netstat -ant |grep -c LISTEN
6
3. 修改自定义监控项的配置文件,按照zabbix-agent的规则,参考写一个。
[root@web-7 ~]#cat /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
使用参数,自定义监控的命令
UserParameter=mysql.version,mysql -V
UserParameter=监控项名称,监控项获取值的命令
因此写法如下,这里采集LISTEN、TIME_WAIT、ESTABLISHED几个状态
cat >/etc/zabbix/zabbix_agentd.d/tcp_status.conf <<'EOF'
UserParameter=LISTEN,netstat -ant|grep -c LISTEN
UserParameter=TIME_WAIT,netstat -ant|grep -c TIME_WAIT
UserParameter=ESTABLISHED,netstat -ant|grep -c ESTABLISHED
EOF
重启agent
[root@web-7 ~]#systemctl restart zabbix-agent
4.测试自定义的监控项是否可用
[root@m-61 ~]#zabbix_get -s 10.0.0.7 -k LISTEN
6
[root@m-61 ~]#zabbix_get -s 10.0.0.7 -k TIME_WAIT
38
[root@m-61 ~]#zabbix_get -s 10.0.0.7 -k ESTABLISHED
2
5.上述的配置文件,也支持高级写法,以传参的形式动态采集值
cat > /etc/zabbix/zabbix_agentd.d/tcp_status.conf <<'EOF'
UserParameter=tcp_status[*],netstat -ant|grep -c $1
EOF
[root@web-7 ~]#systemctl restart zabbix-agent
② zabbix-UI添加
1. 配置选项卡
2. 主机
3. 给web7机器添加监控项
选择监控项
创建监控项
自定义监控项的属性
查看最新的web7监控数据
把TIME_WAIT和LISTEN都加上
图形化数据
③ 监控项克隆
现在要求你将TCP的11种连接状态全部监控上,怎么玩?
TCP所有的连接状态:
CLOSED: 表示初始状态。
LISTEN: 表示服务器端的某个SOCKET处于监听状态,可以接受连接。
SYN_SENT:在服务端监听后,客户端SOCKET执行CONNECT连接时,客户端发送SYN报文,此时客户端就进入
SYN_SENT状态,等待服务端的确认
SYN_RCVD: 表示服务端接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三
次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一
个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的
ACK报文后,它会进入到ESTABLISHED状态。
ESTABLISHED:表示连接已经建立了。
FIN_WAIT_1: 这个是已经建立连接之后,其中一方请求终止连接,等待对方的FIN报文。FIN_WAIT_1状态是当
SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1
状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下
,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用
netstat看到。
FIN_WAIT_2:实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对
方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果
FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须
经过FIN_WAIT_2状态。
CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你
发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状
态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此
种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现
了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给
自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真
正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发
送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。
当收到ACK报文后,也即可以进入到CLOSED可用状态了。
最终效果
这里的11个tcp监控项,还是属于web7机器的。
你可以给某个模板,添加这个TCP的监控应用集(11个TCP状态的监控项),然后就可以复用了。
④ 添加图形
配置
主机
图形 选项里没有关于TCP监控项的图形,可以自主添加
测试tcp链接图示
⑤ 设置触发器
经过前面的一顿操作,自定义的TCP连接状态数据已经被抓到了,并且作了图像展示;
但是搭建监控的意义在于,某些值超过了我们设定的阈值,就得报警了;
因此设置一个触发器(zabbix判断什么时候报警的一个条件)
自定义触发器
针对 TCP的四次挥手、TIME_WAIT链接数,超过500个就触发报警;
创建触发器详细规则、表达式等
1.在监控项里找到具体的 监控项,然后设置判断条件。
2. 还有一个是否允许手动关闭问题的选项。
只有在触发器选项中启用允许手动关闭选项,问题事件才可以被手动关闭。
查看触发器报警
压测,查看报警
[root@m-61 ~]#ab -c 100 -n 1000 http://10.0.0.7/
关闭问题
如果要关闭问题,需要
1. 服务器故障被修复,自动关闭
2. 触发器允许手动关闭
3. 如果默认的模板关闭不了,那是默认的触发器不允许手动关闭。
标签:状态,自定义,报文,zabbix,Zabbix,监控,FIN,WAIT
From: https://www.cnblogs.com/chunjeh/p/17732003.html