自定义监控项流程
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状态的监控项
创建监控项
自定义监控项的属性
创建图形
查看最新的web7监控数据
监控项克隆
现在要求你将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添加栏里的步骤一样。
最终效果
进行压力测试试试效果
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分钟内的变化
设置触发器
经过前面一顿操作,自定义的TCP连接状态数据已经被抓到了,并且作了图像展示;
但是搭建监控的意义在于,某些值超过了我们设定的阈值,就得报警了;
因此设置一个触发器(zabbix判断什么时候报警的一个条件)
自定义触发器
针对 TCP的四次挥手、TIME_WAIT链接数,超过500个就触发报警;
配置 > 主机 > 触发器 > 创建触发器
创建触发器详细规则、表达式等
压测,查看报警
[root@zabbix-server-71 ~]#ab -c 10 -n 1000 http://10.0.0.7/
关闭问题
如果要关闭问题,需要
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" > 添加
关联模版
查看监控数据
配置触发器
配置 > 模版 > 找到Template login user模板 > 触发器 > 创建触发器 > 名称"当前登录用户超过3个" > 严重性"警告" > 表达式{Template login user:login.user.last()}>3 > 勾选允许手动关闭 > 添加
邮件配置
开启QQ邮箱的SMTP和POP3服务,打开授权码。
163:端口号25,SMTP服务器:smtp.qq.com,生成授权码:**********
QQ:端口号465,SMTP服务器:smtp.qq.com,生成授权码:**********
报警媒介类型设置
收件人配置
设置发信息动作
点击开启,激活发邮件功能。
测试报警发邮件动作
压测web7的TCP报警
恢复后的邮件
自定义报警内容
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}
配置告警通知
配置告警修复通知
压测查看结果
报警硬件
恢复邮件