自定义监控项流程

1.自定义监控项的表现形式是(命令、脚本),只要能获取到值,就可以通过zabbix展示
​
完全流程
1. 写命令、脚本
2. 编写zabbix的自定义监控项的配置文件
3. 重启zabbix-agent
4. 试试zabbix-get能拿到数据吗
5.  去zabbix-ui 添加监控项

采集TCP连接状态(实战项目)

精确分析tcp连接状态,可以精准得知服务器的链接情况,确保web服务器的健康
​
1. 命令获取tcp的状态
[root@web-7 ~]#
# -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
35
​
# 有5个tcp已经确认建立了连接
[root@web-7 ~]#netstat -ant |grep -c LISTEN
5
​
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@zabbix-server-71 ~]#zabbix_get -s 10.0.0.7 -k LISTEN
5
[root@zabbix-server-71 ~]#zabbix_get -s 10.0.0.7 -k TIME_WAIT
35
[root@zabbix-server-71 ~]#zabbix_get -s 10.0.0.7 -k ESTABLISHED
2
​
#但是建议用如下优化写法,
#否则你的配置文件就得写11行,有点搓。
#zabbix配置文件,支持传参的用法。↓↓↓↓
​
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
​
测试
[root@zabbix-server-71 ~]#zabbix_get -s 10.0.0.7 -k tcp_status[TIME_WAIT]
37
[root@zabbix-server-71 ~]#zabbix_get -s 10.0.0.7 -k tcp_status[LISTEN]
5
[root@zabbix-server-71 ~]#zabbix_get -s 10.0.0.7 -k tcp_status[ESTABLISHED]
2
[root@zabbix-server-71 ~]#zabbix_get -s 10.0.0.7 -k tcp_status[QWE]
0

zabbix-UI添加

1. 配置选项卡
2. 主机
3. 给web7添加TCP状态的监控项

创建监控项

创建监控项

自定义监控项的属性

image-20241001152915624

创建图形

image-20241001153659436

image-20241001153839947

查看最新的web7监控数据

image-20241001153322556

image-20241001154018553

监控项克隆

现在要求你将TCP的11种连接状态全部监控上,怎么玩?

TCP所有的连接状态

1.CLOSED: 表示初始状态。
​
2.LISTEN: 表示服务器端的某个SOCKET处于监听状态,可以接受连接。
​
3.SYN_SENT:在服务端监听后,客户端SOCKET执行CONNECT连接时,客户端发送SYN报文,此时客户端就进入
SYN_SENT状态,等待服务端的确认
​
4.SYN_RCVD: 表示服务端接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三
次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一
个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的
ACK报文后,它会进入到ESTABLISHED状态。
​
5.ESTABLISHED:表示连接已经建立了。
​
6.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看到。
​
7.FIN_WAIT_2:实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对
方,我暂时还有点数据需要传送给你,稍后再关闭连接。
​
8.TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果
FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须
经过FIN_WAIT_2状态。
​
9.CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给
自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真
正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发
送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
​
10.CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你
发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状
态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此
种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现
了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
​
11.LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。
当收到ACK报文后,也即可以进入到CLOSED可用状态了。

克隆监控

克隆监控项

添加图形

这里就不演示了,方法和上面zabbix-UI添加栏里的步骤一样。

最终效果

image-20241001160102707

image-20241001160334840

进行压力测试试试效果

1. 给web7发1000个请求试试,1000个tcp状态
[root@zabbix-server-71 ~]#ab -c 10 -n 1000 http://10.0.0.7/    
#记得要在对方进去里安装apache
[root@web-7 ~]#yum install httpd -y
​
2. 查看图形数据5分钟内的变化

image-20241001161811242

设置触发器

经过前面一顿操作,自定义的TCP连接状态数据已经被抓到了,并且作了图像展示;

但是搭建监控的意义在于,某些值超过了我们设定的阈值,就得报警了;

因此设置一个触发器(zabbix判断什么时候报警的一个条件)

自定义触发器

针对 TCP的四次挥手、TIME_WAIT链接数,超过500个就触发报警;

配置 > 主机 > 触发器 > 创建触发器

image-20241001162147494

创建触发器详细规则、表达式等

image-20241001192631892

压测,查看报警

[root@zabbix-server-71 ~]#ab -c 10 -n 1000 http://10.0.0.7/  

image-20241001193241896

关闭问题

如果要关闭问题,需要
​
0. 服务器故障被修复,自动关闭
1. 触发器允许手动关闭
2. 如果默认的模板关闭不了,那是默认的触发器不允许手动关闭。

报警媒介

既然机器已经报警了,图示也出来了
但是我如果没盯着监控大屏看,我咋知道机器故障了啊?
报警啊!!
咋报警啊?
邮件、微信、钉钉搞起来呀。
666
得设定一个报警的条件,场景
1. tcp状态监控 (time_wait 超过xxx数量) (自定义监控项+触发器的玩法)
2.报警的动作,几个条件
1. 发给谁?
2. 标题是什么?
3. 消息正文是什么?
​
【判断当前机器登录的用户数量,超过3个】就【发邮件通知运维】,【报警信息的正文:登录服务器的root用户太多,有点危险,快速看看。】

使用不同命令解决问题的思路

测试网站是否是200 OK的玩法
[root@zabbix-server-71 ~]#curl -s -I www.haloyang.top | awk '/^HTTP/{print $2}'
200
[root@zabbix-server-71 ~]#curl -I -s   -w %{http_code}   -o /dev/null  www.haloyang.top
200

配置监控登录用户数量的自定义key

判断当前机器登录的用户数量,超过3个就报警。

1. 想好,你这个需求,如何用命令采集,构造出结果
who|wc -l

2. 写zabbix-agent的配置文件
[root@zabbix-server-71 /etc/zabbix/zabbix_agentd.d]#cp userparameter_mysql.conf userparameter_login_user.conf

cat > userparameter_login_user.conf << EOF
UserParameter=login.user,who|wc -l
EOF

[root@zabbix-server-71 /etc/zabbix/zabbix_agentd.d]#cat userparameter_login_user.conf 
UserParameter=login.user,who|wc -l

3. 重启agent
systemctl restart zabbix-agent.service 

4.去zabbix-ui界面,创建监控项(所有机器都好使),让这个监控项,和模板绑定,模板再给主机去用

- 给现有的模板添加监控项  template os linux (目前监控的主机,都以及和它关联了,登录用户数量检测的key,就立即可以生效了)
- 新创建模板,添加监控项(和主机关联这个模板)

步骤:
配置 > 模版 > 创建模板 > 模版名称"Template login user" > 群组"Linux servers" ==> 找到刚创建的模板 > 监控项 > 创建监控项 > 名称"登录用户数量监测"  > 键值"login.user" > 应用集(可选)"long user" > 添加
    
5. 给某个主机,关联这个模板,使用这个自定义key
步骤:
配置 > 主机 > web-7 > 模板 > 链接指示器 > 添加"Template login user" > 更新

6. 通过最新数据,看看监控项拿到数据了吗?通过最新数据,查看web7是否拿到了登录用户数量(注意坑)
给web7,设置这个"userparameter_login_user.conf"自定义key的配置文件,创建配置文件。

[root@web-7 /etc/zabbix/zabbix_agentd.d]#cat userparameter_login_user.conf 
UserParameter=login.user,who|wc -l

7.重启,看最新数据即可
[root@web-7 ~]#systemctl restart zabbix-agent.service 

8.web-7机器关联"Template login user"模板

9.设置触发器(只要机器登录的用户超过3个,就提示告警级别的信息),web7,server-71 两个机器生效
模板的配置,给多个主机去用
去哪添加触发器?给自定义的模板设置了

创建模板

配置 > 模版 > 创建模板 > 模版名称"Template login user" > 群组"Linux servers"

==> 找到刚创建的模板 > 监控项 > 创建监控项 > 名称"登录用户数量监测" > 键值"login.user" > 应用集(可选)"long user" > 添加

image-20241001212942367

image-20241001213043939

image-20241001213135117

关联模版

image-20241001213336550

查看监控数据

image-20241001212637813

配置触发器

配置 > 模版 > 找到Template login user模板 > 触发器 > 创建触发器 > 名称"当前登录用户超过3个" > 严重性"警告" > 表达式{Template login user:login.user.last()}>3 > 勾选允许手动关闭 > 添加

image-20241001214602461

邮件配置

开启QQ邮箱的SMTP和POP3服务,打开授权码。

img

163:端口号25,SMTP服务器:smtp.qq.com,生成授权码:**********

QQ:端口号465,SMTP服务器:smtp.qq.com,生成授权码:**********

报警媒介类型设置

image-20241001195442259

收件人配置

image-20241001220522777

设置发信息动作

image-20241001220828195

点击开启,激活发邮件功能。

测试报警发邮件动作

压测web7的TCP报警

image-20241001223429858

image-20241001223643741

恢复后的邮件

image-20241001224052989

自定义报警内容

zabbix默认的报警内容,不够友好,自定义一波,更清晰。

https://www.zabbix.com/documentation/4.0/zh/manual/appendix/macros/supported_by_location

官网资料
以及可以自定义设置如下监控内容
报警邮件标题可以使用默认信息,亦可使用如下中文报警内容
你可以自由根据zabbix提供的宏,选择要报警的数据内容。
----------------------------------------------------------------------
默认标题:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!

Author: www.haloyang.com
告警主机:{HOSTNAME1} {HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}  
----------------------------------------------------------------------
恢复标题:恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!

恢复信息:
Author: www.haloyang.com
告警主机:{HOSTNAME1} {HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}

配置告警通知

image-20241002095827437

配置告警修复通知

image-20241002142610512

压测查看结果

报警硬件

image-20241002143129272

恢复邮件

image-20241002143351485