Day02-zabbix自定义监控详解
- 十、弥补监控死角-自定义监控
- 10.1 概述
- 10.2 自定义监控全流程
- 1)客户端
- a)通过命令、脚本取出对应的值
- b)创建键值与重启
- 2)服务端
- a)服务端手动测试
- b) web页面:创建监控项
- c)web页面:触发器
- d)web页面:添加图形
- 3)自定义监控小结
- 10.3 常用键值与触发器函数
- 1)键值
- 2)触发器函数
- 3)触发器依赖
- 10.4 自定义监控-参数案例
- 1)客户端
- 2)服务端
- 3)小结
- 10.5 使用模板
- 1)创建模板
- 2)添加自定义监控项
- 3)复制触发器与图形
- 4)模板关联主机
- 5)配置linux客户端键值
- 6)调试
- 7)小结
- 11、监控告警那点事
- 11.1 告警分类
- 11.2 邮件报警
- 1)全流程
- 2)个人邮箱准备(略)
- 3)配置发件人
- 4)配置收件人
- 5)什么条件下给用户发送邮件?(条件/动作)
- 6)邮箱告警小结
- 11.3 微信报警
- 1) 全流程
- 2)准备环境 1-3
- 3)配置发件人
- 4)配置收件人
- 5)整体测试
- 6)小结
- 今日总结
十、弥补监控死角-自定义监控
10.1 概述
-
我们通过zbx客户端+各种模板实现监控。
-
linux zabbix agent模板
- cpu
- 磁盘
- 内存,swap
- 网络,网卡
- 系统负载
- 进程数量
- 用户登录数量
- 系统运行时长
-
自定义监控应用场景:
- 模板中没有我们所要的监控项
- 默认的模板中监控项过多。
-
web01 监控80端口是否存在? 自定义监控
10.2 自定义监控全流程
-
客户端:书写命令或脚本,修改配置文件。
-
服务端:测试,web页面操作。
步骤 | 流程 | ||
---|---|---|---|
客户端 | linux:通过命令、脚本取出对应的值 | ✔ | |
linux:根据zbx要求按照格式,书写配置文件,创建键值 | ✔ | 键值key用于获取客户端数据 | |
linux:重启客户端客户端测试键值是否可用 | zabbix_agent2 -t | ||
服务端 | linux:服务端测试键值是否可用 | ✔ | zabbix_get |
web页面:键值与监控项关联 | |||
web页面:测试 | |||
web页面:图形 | |||
web页面:触发器(报警) | 是否发出警告 需要根据情况决定是否设置 |
1)客户端
a)通过命令、脚本取出对应的值
- 监控80端口是否存在? 自定义监控
b)创建键值与重启
[root@lb01 ~]# grep -i include /etc/zabbix/zabbix_agent2.conf
### Option: Include
# You may include individual files or all files in a directory in the configuration file.
# Installing Zabbix will create include directory in /usr/local/etc, unless modified during the compile time.
# Include=
Include=/etc/zabbix/zabbix_agent2.d/*.conf
# Include=/usr/local/etc/zabbix_agent2.userparams.conf
# Include=/usr/local/etc/zabbix_agent2.conf.d/
# Include=/usr/local/etc/zabbix_agent2.conf.d/*.conf
# Include configuration files for plugins
Include=./zabbix_agent2.d/plugins.d/*.conf# 1. 写入自定义key(键值)
[root@lb01 ~]# cat /etc/zabbix/zabbix_agent2.d/web.conf
#自定义监控的格式
#UserParameter=起个名字,命令或脚本
#命名最好就是 单词+"." (点)
UserParameter=ngx.port,ss -lntup |grep -w 80|wc -l
# 2. 重启客户端
[root@lb01 ~]# systemctl restart zabbix-agent2.service
# 3. 客户端本地测试键值
[root@lb01 ~]# zabbix_agent2 -t ngx.port
ngx.port [s|1]
# s表示类型 文字
# 1表示结果 键值的结果
温馨提示:zabbix_agent2.conf里面有
Include=/etc/zabbix/zabbix_agent2.d/*.conf
修改后记得重启zbx客户端
2)服务端
a)服务端手动测试
[root@m02-zbx-server ~]# yum install zabbix-get -y
# zabbix_get 向客户端要指定键值的数据。
zabbix_get命令 | |
---|---|
-s | 客户端ip地址 |
-p | 客户端端口号(默认是10050) |
-k | 指定键值 |
[root@m02-zbx-server ~]# zabbix_get -s 172.16.1.5 -k ngx.port
1
[root@m02-zbx-server ~]# zabbix_get -s 172.16.1.5 -k ngx.port
0
b) web页面:创建监控项
- 把客户端创建的键值与zbx服务端监控项关联起来。
- 创建监控项
- 配置监控项名字,填写:键值
- 信息类型:这里键值结果都是数字,选择数字(无正负即可),如果有小数选择浮点类型,如果是字符,选择字符串。
- 更新间隔:这里调整为5s秒,生产环境非必须尽量增长间隔比如1m,10m,1h等等
- 历史数据与趋势数据
历史数据与趋势数据 | 说明 | 推荐配置 |
---|---|---|
历史数据(history)保留时长: | 每个更新间隔获取到的数据 | 推荐空间不乐观 可以设置为30d |
趋势数据(trend)保留时长: | 记录数据变化的趋势,占用空间较少 | 推荐保留更长时间 3650d |
- 监控项配置信息汇总
- 进行监控项测试
- 温馨提示:处处有测试,保证数据可用。
- 测试结果
-
添加监控项完成,查看添加的监控项
-
这里的图形是zbx替我们根据数据自动创建的。
c)web页面:触发器
-
根据监控项获取的数值(内容),决定是否要告警、是否要提示异常。
-
trigger扳机
-
创建触发器
- 配置触发器名字,严重程度和表达式
- 表达式配置详情
- 添加完成后的触发器配置
- 出现故障后的提示
d)web页面:添加图形
- 添加图形
- 配置图形名字与添加监控项
- 查看图形的预览(监控项要已经获取到数据才行)
- 检查图形
3)自定义监控小结
-
用一句话形容自定义监控:只要能通过命令、脚本取出来的东西就可以自定义监控。
-
自定义监控流程:
- 客户端 通过命令/脚本取出想要内容,UserParameter创建键值key,写入配置文件,客户端检测(zabbix_agent)
- 服务端 命令测试键值(zabbix_get) ,web页面: 添加监控项 ,添加触发器,添加图形
- web调试
10.3 常用键值与触发器函数
1)键值
- 在监控项中使用,键值用于获取数据
常用键值 | 说明 |
---|---|
agent.hostname | 主机名 获取的是客户端配置文件中指定的主机名 |
system.hostname | 主机名 系统的主机名 类似于hostname |
agent.ping | 服务端与客户端是否通畅 通1 不通非1 |
net.if.in[if,<mode>] | 网络接口上传(进入)流量统计。返回 整数 if表示网卡名字 可以忽略。 |
net.if.out[if,<mode>] | 流出流量统计。返回整数 |
proc.num[<name>,<user>,<state>,<cmdline>,<zone>] | 进程数。返回整数 name进程名字 user用户 state进程状态 cmdline进程对应的命令 |
net.tcp.port[,port] | 检查是否能建立 TCP 连接到指定端口。 返回 0 - 不能连接;1 - 可以连接 |
- 案例过滤僵尸进程数量
state 写为 zomb
zabbix_get -s 172.16.1.7 -p 10050 -k proc.num[,,zomb]
zabbix_get -s 172.16.1.7 -k net.if.in[eth0,]
zabbix_get -s 172.16.1.7 -k proc.num[nginx]
zabbix_get -s 172.16.1.7 -k net.tcp.port[,80]
zbx客户端键值
链接: https://www.zabbix.com/documentation/6.0/zh/manual/config/items/itemtypes/zabbix_agent
2)触发器函数
- 写在触发器表达式中.用于设置报警条件.
- 触发器函数要结合键值(监控项).
功能(函数) | 说明 |
---|---|
对比与比较 | |
last() | 最近值 (最新的值),取出最近一些值 |
nodata() | 是否有数据 |
diff() | 是否发生变化 一般配合md5check() |
进行计算 | |
avg() | 平均值 |
min() | 最小值 |
max() | 最大值 |
- 分析案例: 目的是用来检查/etc/passwd的变化情况,间接检查是否有用户增加或删除
#倒数第1个 /etc/passwd 的md5值
last(/lb01/vfs.file.cksum[/etc/passwd,sha256],#1)
<>
#倒数第2个 /etc/passwd 的md5值
last(/lb01/vfs.file.cksum[/etc/passwd,sha256],#2)# 倒数第1个md5的值和倒数第2个md5的是 如果不相等了,则报警.
# 目的是用来检查/etc/passwd的变化情况,间接检查是否有用户增加或删除.
- 书写触发器案例 swap
- 条件1:swap总大小大于0(系统有swap)
- #条件2:swap当前使用的大小大于0(没有直接可以使用的监控项,这里调整为当前swap空闲率小于100)
#1. 找出满足要求的键值
system.swap.size[,total]) #取出swap总数
last(/web01/system.swap.size[,used]) #swap使用大小#条件swap总大小大于0
last(/web01/system.swap.size[,total])>0#条件swap当前使用的大小大于0(没有直接可以使用的监控项,这里调整为当前swap空闲率小于100)
last(/web01/system.swap.size[,pfree])<100#表示并且
-a ==> and
-o ==> or#2.完整的表达式
last(/web01/system.swap.size[,total])>0 and last(/web01/system.swap.size[,used])>0
max(/Zabbix server/vm.memory.size[available],5m)<{$MEMORY.AVAILABLE.MIN} and last(/Zabbix server/vm.memory.size[total])>0 # 最近5分钟可用内存小于 指定的值
max(/Zabbix server/vm.memory.size[available],5m) < {$MEMORY.AVAILABLE.MIN}
# and 并且
# 内存大小大于0
last(/Zabbix server/vm.memory.size[total])>0
3)触发器依赖
-
内存不足
-
开始占用swap
-
…
-
网络断开
-
ping
-
port
https://www.zabbix.com/documentation/6.0/zh/manual/config/triggers/dependencies
10.4 自定义监控-参数案例
-
目标:检查指定用户是否存在异地登录。
-
最简单想法:检查指定用户登录的ip地址。进行对比
-
选择命令:
-
w who只能显示当前此时此刻,登录情况。
-
lastlog 实现
-
键值:实现取出指定用户的登录的ip地址。
-
服务端:web页面触发器做对比。
1)客户端
- 使用命令
lastlog |grep root |awk '{print $3}'
# root未来可能是其他用户.
- 书写键值key
[root@lb01 ~]# cat /etc/zabbix/zabbix_agent2.d/web.conf
#自定义监控的格式
#UserParameter=起个名字,命令或脚本
UserParameter=ngx.port,ss -lntup |grep -w 80|wc -l
UserParameter=user.login[*],lastlog -u "$1"|awk 'NR==2{print $3}'[root@lb01 ~]# systemctl restart zabbix-agent2.service
[root@m02-zbx-server ~]# zabbix_get -s 172.16.1.5 -k user.login[root]
root pts/1 10.0.0.1 一 5月 6 12:30:07 +0800 2024[root@lb01 ~]# cat /etc/zabbix/zabbix_agent2.d/web.conf
#自定义监控的格式
#UserParameter=起个名字,命令或脚本
UserParameter=ngx.port,ss -lntup |grep -w 80|wc -l
UserParameter=user.login[*],lastlog -u "$1"|awk 'NR==2{print $$3}' # 两个$$符号
-
如果使用自定义键值传参,awk取列的时候要使用$$列。
-
如果没有传参,awk正常使用即可。
-
理解自定义键值的传参
2)服务端
[root@m02-zbx-server ~]# zabbix_get -s 172.16.1.5 -k user.login[root]
10.0.0.1
- web 添加监控项
- web 触发器
最近1个值和上一个值是否一致(不一致)
last(/lb01/user.login[root],#1) <> last(/lb01/user.login[root],#2)
- 查看
3)小结
- 自定义监控,带参数。
- 带参数+awk取列。($$取列)
- 优先使用zbx内置key和模板中监控项。
- 多看看模板中的监控项和触发器规则。{$XXXX}
10.5 使用模板
- 通过创建自定义模板实现,监控项,触发器,图形批量使用。
- 步骤
- 创建模板
- 添加自定义监控项
- 添加触发器
- 添加图形
- 模板关联主机
- 客户端配置自定义键值
1)创建模板
- 创建模板(模板名字要是英文的)
- 检查模板信息
2)添加自定义监控项
-
进入主机中复制即可
-
选择要复制的监控项,选择复制即可(可批量多选)
- 选择复制到模板中
- 检查模板中监控项部分:多了2个监控项
3)复制触发器与图形
- 主机–>触发器
- 复制
- 检查模板
- 复制图形与复制触发器与监控项一致
4)模板关联主机
- 进入主机中,批量选择要添加模板的主机,批量更新
- 添加模板关联主机成功
-
错误提示:
-
unkown metric xxxx 未知的键值(监控项)
-
原因:客户端没有对应的自定义的键值.
-
解决:复制过去对应的键值即可.
5)配置linux客户端键值
- 分发键值配置文件到db01和nfs01
- 重启zbx客户端
6)调试
- 给监控项设置标记,方便分类
- 温馨提示: zbx 5.x 及之前 应用集,zbx 6.x 叫标记。都是用于分类
7)小结
- 找到1台主机进行测试标记,监控项,触发器,图形。。。
- 然后创建模板,把对应的内容复制到模板中。
- 模板关联主机
- 键值的配置文件发过去
11、监控告警那点事
11.1 告警分类
报警方式 | 企业应用场景 | |
---|---|---|
发邮件 | 个人邮箱 | 企业邮箱,免费使用 |
企业微信-告警应用(机器人) | 需要使用企业微信,免费 | |
OA系统( 钉钉,飞鸽,…) | 与阿里云,免费 | |
短信 | 0.045元/条左右 (阿里云短信服务) 收费 | |
电话 | 收费 | |
第三方报警工具/平台: onealert (省事) | 只需要配置onealert的平台信息,免费使用(限制),收费 |
11.2 邮件报警
1)全流程
- 个人邮箱/企业邮箱
- 开启个人邮箱 smtp功能 获取授权码
- 发件人:配置zabbix 报警媒介类型
- 收件人:配置 用户 接收报警
- 发件条件:配置动作
2)个人邮箱准备(略)
- 配置个人邮箱
3)配置发件人
- a:配置发件人-报警媒介
-
告警邮件内容: Messages template
-
故障告警信息
-
故障恢复告警信息
- 添加完成
#信息类型是: 问题( 发生故障 )
主题: 故障名称: {EVENT.NAME}
消息:
故障始于 时间: {EVENT.TIME} 日期: {EVENT.DATE}
故障名称: {EVENT.NAME}
故障主机: {HOST.NAME}
严重程度: {EVENT.SEVERITY}
额外信息: {EVENT.OPDATA}
故障ID: {EVENT.ID}
触发器地址: {TRIGGER.URL}#信息类型是: Problem recov 故障解决的时候主题: 故障解决 in {EVENT.DURATION}: {EVENT.NAME}消息:
故障已经解决 时间: {EVENT.RECOVERY.TIME} 日期: {EVENT.RECOVERY.DATE}
故障名称: {EVENT.NAME}
故障持续时间: {EVENT.DURATION}
故障主机: {HOST.NAME}
故障级别: {EVENT.SEVERITY}
故障ID: {EVENT.ID}
{TRIGGER.URL}
- 进行测试
-
提示发送成功
-
检查邮箱内容
4)配置收件人
-
本质:zbx的用户、用户组。
-
对所有人员进行分组
- 运维组 : lidao@qq.com
- 开发组: lidaokaifa@qq.com
- 老大组: lidaoboss@qq.com
-
b:收件人
-
添加收件人信息
- 配置收件人
- 配置完成
5)什么条件下给用户发送邮件?(条件/动作)
- c:动作–启用
- 触发器动作
- 启动即可
- 已启用
- 制造故障检查仪表盘
- 检查邮件
6)邮箱告警小结
- 分组,用户
- 配置发件人: 报警媒介类型
- 配置收件人: 个人用户配置中添加报警媒介
- 配置动作:(触发器动作)
- 发送故障的提示
- 发送故障恢复的提示
11.3 微信报警
1) 全流程
-
微信报警,短信,电话,钉钉 自定义脚本报警
-
通过脚本(py,shell),调用对方api接口(输入接口需要的信息,访问与使用api接口)
-
企业微信
-
企业微信id和告警机器人id和secret
-
使用脚本(shell/python)调用企业微信api接口: python 输入收件人 信息
-
发件人: 报警媒介(告警机器人)
-
收件人: 个人 媒体类型
-
动作: 已经完成
2)准备环境 1-3
#1.企业微信 id号
企业ID
ww6ac68d5d41044330#2.创建1个报警机器人(应用)
##机器人的id(应用id)
AgentId
1000005##应用密码
Ss7VFx8Mkzm8XABMNqVRp31zxNnxhbJ_rJzz8sPDgk4
#修改微信报警的脚本
vim /usr/local/share/zabbix/alertscripts/wechat.py#!/usr/bin/env python
#-*- coding: utf-8 -*-
#author: oldboy-linux
#date: 2021
#description: Zabbix Wechat Alerts Scripts
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','wechat.log'),filemode = 'a')#id和secret需要修改
corpid='wxd074861951c67ba6'
appsecret='QtraZrI936DZ0jZ3aSWTZ-lFVheAMgLmq3toM4B9U1A'
agentid=1
#获取accesstoken
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]
#toparty='3|4|5|6'
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))# 书写日志/tmp/wechat.log
logging.info('sendto:' + toparty + ';;subject:' + subject + ';;message:' + message)chmod +x /usr/lib/zabbix/alertscripts/wechat.py#安装python环境
yum install -y python3 python3-pip
通过pip3 命令安装requests依赖.
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests#测试
python3 wechat.py 用户的id或组id 标题 内容 '下雨了' '打雷下雨收衣服'
Traceback (most recent call last):
File "/usr/lib/zabbix/alertscripts/wechat.py", line 7, in <module>import requests
ImportError: No module named requests
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
pip install requests#web页面 发件人:报警媒介类型
{ALERT.SENDTO} #发给谁
{ALERT.SUBJECT} #报警标题
{ALERT.MESSAGE} #报警内容故障目前已经解决时间: {EVENT.RECOVERY.TIME} 日期
{EVENT.RECOVERY.DATE}
故障名称: {EVENT.NAME}
故障经历多久: {EVENT.DURATION}
故障主机: {HOST.NAME}
故障级别: {EVENT.SEVERITY}
故障ID: {EVENT.ID}
{TRIGGER.URL}
#web页面 收件人:接收用户
#Web页面 配置-->动作
- 需要去企业微信后台,开通白名单
- 错误提示:
故障提示:
python3 wechat-v2-lidao996.py lidao996 "webisdown" "nginx is down"
Traceback (most recent call last):File "wechat-v2-lidao996.py", line 7, in <module>import requests
ModuleNotFoundError: No module named 'requests'
故障解决:
pip3 install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
新的安装方法:
python3 -m pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
3)配置发件人
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
- 添加报警媒介类型
- 添加报警内容模板
- 测试发件人
4)配置收件人
5)整体测试
- 制造新的故障
6)小结
-
企业微信
-
企业微信id和告警机器人id和secret
-
使用脚本(shell/python3)调用企业微信api接口: python 输入收件人 信息
-
发件人: 报警媒介类型
-
收件人: 个人 媒体类型
-
动作: 已经完成
-
补充:通过微信脚本,发送到指定用户。
今日总结
链接: https://www.processon.com/view/link/62a6fb42e401fd5a4d63d3bc