Zabbix自定义监控项 & 企业微信报警
一、zabbix自定义监控
zabbix-agent 获取数据,然后定义,交给zabbix-server端
1.指定监控的内容
#监控服务器登录用户的数量
[root@web01 ~]# w | awk 'NR==1 {print $(NF-6)}'
1
2.客户端配置监控项
1)客户端配置文件
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.conf
2)定义监控项语法
#语法:
Format:
UserParameter=<key>,<shell command>
#官方示例
[root@web01 ~]# tail -n 2 /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
3)设置自定义监控项
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.d/login_user.conf
UserParameter=login_usernumber,w | awk 'NR==1 {print $(NF-6)}'
4)重启客户端
[root@web01 ~]# systemctl restart zabbix-agent.service
3.客户端验证
[root@web01 ~]# zabbix_agentd -t login_usernumber # 针对客户端文件中的key来验证
login_usernumber [t|4]
[root@web01 ~]# zabbix_agentd -p | grep login_usernumber
login_usernumber [t|4]
#得到的结果,前面的字母含义
d #带小数部分的数字
m #不支持,只有在这种模式下,查询日志才可能是活动的(如日志监视项或需要多个收集值的项)引起的。权限问题或不正确的用户参数可能
s #文本。最大长度不受限制。
t #文本。最大长度不受限制。
u #无符号整数
4.服务端获取值
[root@zabbix ~]# rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-get-4.0.1-1.el7.x86_64.rpm
#zabbix_get语法
zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] -k item-key
-s #主机名或者IP地址
-p #端口
-I #IP地址
-k #监控项的key名称
# 在服务端检测客户端的key结果
[root@zabbix ~]# zabbix_get -s 172.16.1.7 -p 10050 -k login_usernumber
4
5.web页面添加监控项
-
针对主机配置监控项
-
点击创建监控项
-
这里的键值一定要写为自定义监控文件中的key(也就是agent文件中的key名)
二、zabbix自定义阈值(触发器)
- 根据监控项配置触发器
-
点击创建触发器
-
选择添加表达式,和监控项进行绑定
-
选择之前创建的监控
-
继续选择功能,这里实验针对登录用户数量,针对登录用户超过4个进行触发
-
也可以选择点击表达式构造器进行测试
-
点击测试
-
设置值为6,也就超过了之前设置的阈值4,超过为触发成功,也就为true
-
最终触发器界面,最后点击添加
- 到此为止,已经在服务端进行对客户端的自定义监控,并且已经进行了触发器配置,但触发结果仅在web页面显示,并未配置邮件或微信等媒介报警
三、自定义告警
1.邮件方式
#### 这里为大概的流程,距离操作参考下方图片
1.配置---动作---启用里面的动作
2.点击动作---操作
·自定义报警内容参考博客:https://www.zabbix.com/documentation/4.0/zh/manual/appendix/macros/supported_by_location
#默认标题:
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
#消息内容:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
3.点击动作---恢复操作
#默认标题:
恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
#消息内容:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
4.更新
5.管理---报警媒介类型---mail
smtp.qq.com
465
qq.com
1240206455@qq.com
SSL/TLS
勾选
用户名和密码
1240206455@qq.com
QQ邮箱授权码
6.更新
7.配置收件人
头像---报警媒介---添加
填写收件人
根据职位设置接收告警的级别
1) 配置邮件告警之前,需要将此动作开启,并且对此进行动作配置
2)设置动作,当触发动作时的操作(也就是报警信息),这里的标题和消息内容为此文章上方书写文件,当然也可以自行百度,网上大把的模板参考。然后点击新的,设置发送人员
3)设置报警收到报警人员,然后点击添加
4)当警告解除时,同样发送邮件,这里为配置警告解除,发送邮件模板(同样这里的标题,和消息内容可从上文中复制,或直接从网上拷贝)
5)这里的更新操作默认不需要修改,直接点击更新即可
6)选择报警媒介类型,并且进行创建
7)这里的密码需要在qq邮箱的POP3/SMTP中进行获取,然后点击更新即可
8)选择报警媒介,也就是当达到触发值后的告警信息,通过邮件进行告警
2.微信方式
1)注册企业微信
2)配置脚本
#1.查看脚本存放位置
[root@zabbix ~]# grep 'script' /etc/zabbix/zabbix_server.conf
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts
#2.上传脚本
[root@zabbix ~]# cd /usr/lib/zabbix/alertscripts
[root@zabbix alertscripts]# ll
total 4
-rw-r--r-- 1 root root 1231 Sep 9 16:41 weixin.py
[root@zabbix-server ~]# cat /usr/lib/zabbix/alertscripts/weixin.sh
#!/bin/bash
CropID='wwe81f9f79dde15536' #企业ID
Secret='u_SJG43-SAgG3fQKFeY23lVVGzmBMAltfInpUP_AuwU' #企业号中的应用Secret
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
function body() {
local int AppID=1000002 #企业号中的应用id
local UserID=$1 #部门成员id,zabbix中定义的微信接收者
local PartyID=2 #部门id,定义了范围,组内成员都可接收到消息
local Msg=$(echo "$@" | cut -d" " -f3-) #过滤出zabbix中传递的第三个参数
printf '{\n'
printf '\t"touser": "'"$User"\"",\n"
printf '\t"toparty": "'"$PartyID"\"",\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'" $AppID "\"",\n"
printf '\t"text": {\n'
printf '\t\t"content": "'"$Msg"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}
/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL
#3.授权
[root@zabbix alertscripts]# chmod +x weixin.py
#4.修改脚本
[root@zabbix alertscripts]# vim weixin.py
#企业ID
corpid='ww69b7626c5e711bdf'
#应用的secret
appsecret='TchtAn_azm8DGT5gpVgPNffzOn8BeuVhT1jHQlbRHzs'
#应用的agentid
agentid=1000002
#5.测试脚本
yum -y install epel-release
yum install python-pip
pip install requests
pip install --upgrade requests
[root@zabbix alertscripts]# ./weixin.py LinHaoDa 2 hello
3)添加报警媒介
{ALERT.SENDTO} #发送的⽤户
{ALERT.SUBJECT} #发送的主题
{ALERT.MESSAGE} #发送的内容
-
web参考流程
1)配置发件人
2)配置收件人
3)登录企业微信公众号添加账户,登录后在企业号上新建应用
4)上传logo,填写应用名称,应用介绍等
5)查看启动应用(同时会生成应用的Agent以及Secret,这个后面步骤会有用)
6)调用接口测试
注意:这里的corpid为公司的ID
Corpecret就是刚才应用生成的Secrt,确认没有问题填写进去然后进行下一步
如果没有问题会显示200状态码
7)成员添加
8)公众号关注
9 )查看自己的账户
10)修改脚本里的信息
11)发信息进行测试
12)微信号上查看
四、zabbix深入自定义监控项
1.自定义监控项-ssh端口
2.自定义监控项-TCP11种状态
1)了解11种状态
LISTEN - 侦听来自远方TCP端口的连接请求;
SYN_SENT -在发送连接请求后等待匹配的连接请求;
SYN_RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
FIN_WAIT_1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN_WAIT_2 - 从远程TCP等待连接中断请求;
CLOSE_WAIT - 等待从本地用户发来的连接中断请求;
CLOSING -等待远程TCP对连接中断的确认;
LAST_ACK - 等待原来发向远程TCP的连接中断请求的确认;
TIME_WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED - 没有任何连接状态;
客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。
服务端独有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。
共有的:(1)CLOSED (2)ESTABLISHED 。
2)配置监控项
注意:以下两种方式都是对TCP的11种状态进行监控,只是使用的方法一的*为匹配所有,$1可以理解成sed的后项引用前项,所以这里定义了一个*号比方式二更为简单。
######################### 方式一:##########################################
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.d/tcp_state.conf
UserParameter=tcp_state[*],netstat -ant | grep -c $1
######################### 方式二:##########################################
[root@web01 /etc/zabbix/zabbix_agentd.d]# cat zbx_tcp.conf
UserParameter=ESTABLISHED,netstat -ant|grep -c 'ESTABLISHED'
UserParameter=SYN_SENT,netstat -ant|grep -c 'SYN_SENT'
UserParameter=SYN_RECV,netstat -ant|grep -c 'SYN_RECV'
UserParameter=FIN_WAIT1,netstat -ant|grep -c 'FIN_WAIT1'
UserParameter=FIN_WAIT2,netstat -ant|grep -c 'FIN_WAIT2'
UserParameter=TIME_WAIT,netstat -ant|grep -c 'TIME_WAIT'
UserParameter=CLOSE,netstat -ant|grep -c 'CLOSE'
UserParameter=CLOSE_WAIT,netstat -ant|grep -c 'CLOSE_WAIT'
UserParameter=LAST_ACK,netstat -ant|grep -c 'LAST_ACK'
UserParameter=LISTEN,netstat -ant|grep -c 'LISTEN'
UserParameter=CLOSING,netstat -ant|grep -c 'CLOSING
# 重启zabbix-agent
[root@web01 ~]# systemctl restart zabbix-agent.service
3)验证
# zabbix-agent检测自定义监控是否正常
[root@web01 ~]# zabbix_agentd -t tcp_state[TIME_WAIT]
tcp_state[TIME_WAIT] [t|47]
[root@web01 ~]# netstat -ant | grep -c TIME_WAIT
47
# zabbix-server检测服务端配置是否正常
[root@zabbix alertscripts]# yum install zabbix-get.x86_64 -y
[root@zabbix alertscripts]# zabbix_get -s 10.0.1.7 -k tcp_state[TIME_WAIT]
4)web配置
1.继续针对主机创建监控项
2.创建
3.这里仅针对time_wite进行演示,注意:这里的键值也必须是,对应文件中的key名称
4.查看数据
5.同样和其他流程一样,配置触发器
6.验证,查收到报警
五、自定义监控项(合并监控项)
1.配置内存自定义监控项
#监控内存命令
[root@web01 ~]# free -m|awk '/^Mem/{print $NF/$2}'
0.664609
[root@web01 ~]# free -m|awk '/^Mem/{print $NF/$2*100}'
66.358
#定义监控项
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.d/mem_free.conf
UserParameter=mem_pfree,free -m|awk '/^Mem/{print $NF/$2*100}'
2.测试监控项
#客户端测试
[root@web01 ~]# zabbix_agentd -t mem_pfree
mem_free [t|66.2551]
[root@web01 ~]# systemctl restart zabbix-agent.service
#服务端测试
[root@zabbix ~]# zabbix_get -s 172.16.1.7 -k mem_pfree
66.358
3.配置监控项
4.配置触发器
5.测试告警
[root@web01 ~]# dd if=/dev/zero of=/dev/null bs=2000M count=1000
2.配置swap空间自定义监控项
#获取值
[root@web01 ~]# free -m|awk '/^Swap/{print $3/$2*100}'
15.0538
#自定义监控项
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.d/swap_used.conf
UserParameter=swap_pused,free -m|awk '/^Swap/{print $3/$2*100}'
7.测试监控项
#客户端
[root@web01 ~]# systemctl restart zabbix-agent.service
[root@web01 ~]# zabbix_agentd -t swap_pused
swap_used [t|14.6628]
#服务端
[root@zabbix ~]# zabbix_get -s 172.16.1.7 -k swap_pused
14.6628
8.配置监控项
9.配置触发器
10.触发器常用表达式
and #并且
or #或者
last() #比对最新的值
avg() #平均值
diff() #比对上一次文件的内容
nodata() #收不不到数据进行报警nodata(5m)
(5m) #表示最近5分钟得到值
(#5) #表示最近5次得到的值