自定义监控项

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

 

 
posted @ 2023-12-18 15:16  Mrterrific  阅读(50)  评论(1编辑  收藏  举报