04-自定义监控项
1.为什么要自定义监控项
模板里面提供了大量的监控项,为何还要自定义?
这不废话么,,那肯定是有些你想监控的内容,模板里没有么。。
当然,zabbix支持你自定义的监控项,所以才那么流行,就是这么牛!
2.自定义监控项流程
1.自定义监控项的表现形式是(命令、脚本),只要能获取到值,就可以通过zabbix展示
完全流程
1. 写命令、脚本
2. 编写zabbix的自定义监控项的配置文件
3. 重启zabbix-agent
4. 试试zabbix-get能拿到数据吗
5. 去zabbix-ui 添加监控项
3.采集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
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
# nice,就这么简单,可以用了。
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监控数据
练习1
把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状态的监控项),然后就可以复用了。
添加图形
默认在web7机器的
配置
主机
图形 选项里没有关于TCP监控项的图形,可以自主添加
测试tcp链接图示
设置触发器
经过前面超哥一顿操作,自定义的TCP连接状态数据已经被抓到了,并且作了图像展示;
但是搭建监控的意义在于,某些值超过了我们设定的阈值,就得报警了;
因此设置一个触发器(zabbix判断什么时候报警的一个条件)
自定义触发器
针对 TCP的四次挥手、TIME_WAIT链接数,超过500个就触发报警;
配置 > 主机 > 触发器
配置 > 主机 > 触发器 > 创建触发器
创建触发器详细规则、表达式等
1.在监控项里找到具体的 监控项,然后设置判断条件。
2. 还有一个是否允许手动关闭问题的选项。
只有在触发器选项中启用允许手动关闭选项,问题事件才可以被手动关闭。
查看触发器报警
压测,查看报警
[root@m-61 ~]#ab -c 100 -n 1000 http://10.0.0.7/
关闭问题
如果要关闭问题,需要
0. 服务器故障被修复,自动关闭
1. 触发器允许手动关闭
2. 如果默认的模板关闭不了,那是默认的触发器不允许手动关闭。
4.报警媒介
既然机器已经报警了,图示也出来了
但是我如果没盯着监控大屏看,我咋知道机器故障了啊?
报警啊!!
咋报警啊?
邮件、微信、钉钉搞起来呀。
666
4.1 邮件配置
开启QQ邮箱的SMTP和POP3服务,打开授权码。
生成授权码、保存授权码
报警媒介类型设置
收件人配置
设置发信息动作
点击开启,激活发邮件功能。
测试报警发邮件动作
压测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.yuchaoit.cn
告警主机:{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.yuchaoit.cn
告警主机:{HOSTNAME1} {HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
自定义恢复内容
自定义报警结果
恢复邮件
4.2 微信报警
1.微信报警原理流程
注册微信企业号,通过企业号提供的信息ID、以及获取微信的API接口,就可以将服务器的报警数据,发给API,发给微信,发给关注这个公众号的所有用户、
2.注册企业微信
https://work.weixin.qq.com/wework_admin/frame
3.修改通讯录组名
4.创建自定义zabbix应用
5.查看企业ID
6.微信报警架构图逻辑图
7.添加通信群组成员
想让其他人也加入到这个组,便于接收消息,因此需要邀请加入组。
扫码加入企业
加入监控小分队即可。
8.关注监控公众号(无须下载企业微信了)
9.推送报警信息(python)
#!/usr/bin/env python3
# Author: www.yuchaoit.cn
import requests
import sys
import os
import json
import logging
# 日志格式构造
logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt = '%a, %d %b %Y %H:%M:%S',
filename = os.path.join('/tmp','weixin_python.log'),
filemode = 'a')
# 企业ID
corpid='ww76b67c7e3bea'
# 应用秘钥
appsecret='Z2LpWY2H15svWZXuXAzyxqCuGUWrDPKhhHvvnY'
# 应用id
agentid=1000002
# 获取身份令牌,用于和微信通信的认证
# 参考企业微信API文档https://developer.work.weixin.qq.com/document/path/90487
token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid +'&corpsecret=' + appsecret
req=requests.get(token_url)
accesstoken=req.json()['access_token']
msgsend_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken
# 构造消息体
#touser=sys.argv[1]
toparty=sys.argv[1]
subject=sys.argv[2]
# 发送微信消息的数据格式
message=sys.argv[2] + "\n\n" +sys.argv[3]
params={
#"touser": touser,
"toparty": toparty,
"msgtype": "text",
"agentid": agentid,
"text": {
"content": message
},
"safe":0
}
# 最终发请求
req=requests.post(msgsend_url, data=json.dumps(params))
# 调试请求发送结果
print(req.content)
# 记录日志
logging.info('sendto:' + toparty + ';;subject:' + subject + ';;message:' + message)
测试发微信(python)
# 参数1是发给哪个部门
# 参数2是主题
# 参数3是消息正文
# 装好所需模块
[root@m-61 ~]#yum install python3 python3-devel python3-pip
[root@m-61 ~]#pip3 install requests
# 发给部门消息
[root@m-61 ~]#python3 weixin_zabbix.py 2 "zabbix微信报警测试" "当前使用python脚本发送,发送人www.yuchaoit.cn"
[root@m-61 ~]#
坑记录,添加ip白名单
# 踩坑了,tmd,需要加入自建应用的ip白名单
# https://open.work.weixin.qq.com/devtool/query?e=60020
python3版本的坑
#!/usr/bin/env python3
别忘记,修改脚本的python解释器!!
10.推送报警信息(bash)
cat > weixin.sh << 'EOF'
#!/bin/bash
# Authror: www.yuchaoit.cn
#需要将下列信息修改为自己注册的企业微信信息 #应用ID
agentid='1000002'
#secretID
corpsecret='Z2LpWYv2tswSWZXuXAzyxqCuGUWrDPKhhHvvnY'
#企业ID
corpid='ww76b673e3bea'
#接受者的账户,由zabbix传入
#user=$1
#报警邮件标题,由zabbix传入
title=$2
#报警邮件内容,由zabbix传入
message=$3
# 接收信息的组
group=$1
#获取token信息,需要在链接里带入ID
token=$(curl -s -X GET "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${corpsecret}"|awk -F \" '{print $10}')
#构造语句执行发送动作,发送http请求
curl -s -H "Content-Type: application/json" -X POST "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}" -d' {
"toparty" : "'"${group}"'",
"msgtype" : "text",
"agentid" : '"${agentid}"',
"text" : {
"content" : "'"${title}\n\n${message}"'"
},
"safe":0
}' >> /tmp/weixin_bash.log
#将报警信息写入日志文件
echo -e "\n报警时间:$(date +%F-%H:%M)\n报警标题:${title}\n报警内容:${message}" >> /tmp/weixin_bash.log
EOF
bash发报警
[root@m-61 ~]#bash weixin.sh 2 "bash还是不如python美丽啊" "bash发送报警了!!"
[root@m-61 ~]#
11.最终微信效果
12.zabbix页面配置微信报警
脚本发送报警信息,调试通过后,最终还是希望zabbix实现报警触发。
添加报警媒介类型
添加报警参数,参考zabbix官网文档
https://www.zabbix.com/documentation/3.4/zh/manual/config/notifications/media/script
宏参数查询
https://www.zabbix.com/documentation/3.4/zh/manual/appendix/macros/supported_by_location
zabbix配置文件设置目录
需要告诉zabbix,你自定义的脚本在什么目录
[root@m-61 ~]#grep '^AlertScriptsPath' /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts
[root@m-61 /usr/lib/zabbix/alertscripts]#ls
weixin.sh weixin_zabbix.py
于超老师提醒,少一步都是坑,哈哈哈,辛酸
[root@m-61 /usr/lib/zabbix/alertscripts]#chmod +x weixin_zabbix.py
用户设置报警媒介
请注意,这里的收件人,是指微信的组,或者微信的联系人!
传入的参数,超哥这里是传入的2,是zabbix监控小组的id。
13.完结收工(测测微信有报警吗)
[root@m-61 /usr/lib/zabbix/alertscripts]#ab -c 100 -n 100000 http://10.0.0.7/
可以检测日志
tail -f /tmp/weixin.log
Sat, 02 Jul 2022 22:16:45, connectionpool.py, DEBUG, Starting new HTTPS connection (1): qyapi.weixin.qq.com:443
Sat, 02 Jul 2022 22:16:45, connectionpool.py, DEBUG, https://qyapi.weixin.qq.com:443 "GET /cgi-bin/gettoken?corpid=ww76b67c7a9e3e3bea&corpsecret=Z2LpWY2H15sv2tswSWZXuXAzyxqCuGUWrDPKhhHvvnY HTTP/1.1" 200 277
Sat, 02 Jul 2022 22:16:45, connectionpool.py, DEBUG, Starting new HTTPS connection (1): qyapi.weixin.qq.com:443
Sat, 02 Jul 2022 22:16:46, connectionpool.py, DEBUG, https://qyapi.weixin.qq.com:443 "POST /cgi-bin/message/send?access_token=_tIBkDweSW5UD0RoNnkuNQp0hmBe8ILlEUb6l3gdZuLVOArculwDJRiXy02chWt7VgQNHi6KFhU7Vu16lwwMqnEvRYL0n-ttIy33PmUt0ohiV5tUXc6rBOWCT1ZKH6TDHZAlospAUzVtVCdmcGxahiNLherauix-wX4K8gLYnsWdu50QxMA-ksViff-qDI4nc0ISrSxBgOa_338Pf_Ss_A HTTP/1.1" 200 124
Sat, 02 Jul 2022 22:16:46, weixin_zabbix.py, INFO, sendto:2;;subject:恢复OK, 服务器:web7: TIME_WAIT连接数太多已恢复!;;message:恢复OK, 服务器:web7: TIME_WAIT连接数太多已恢复!
Author: www.yuchaoit.cn
告警主机:web7
告警时间:2022.07.02 22:15:42
告警等级:Warning
告警信息: TIME_WAIT连接数太多
告警项目:tcp_status[TIME_WAIT]
问题详情:TIME_WAIT监控:64
当前状态:OK:64
事件ID:94