小阿轩yx-案例:Zabbix自定义监控项与触发器
前言
- 当我们需要获取某台主机上的数据时,直接利用 zabbix 提供的模板可以很方便的获得需要的数据
- 但是有些特别的数据,利用这些现有的模板或监控项是无法实现的
例如
- 网站状态信息的监控、mysql 数据库主从状态等信息。这是就需要自己定义键值和监控项,以满足企业对检测数据的需要。
什么是 zabbix 的 key 值
- Zabbix 中内置了很多监控参数(Key),我们可以通过在客户端配置文件中定义 key,获取监控对象中的系统、CPU、网络、内存、文件系统等信息。
- Key(键)是 zabbix 标记 item 的键,是一种标识符。
- 利用 key 可以定义一个监控对象,那么这个监控对象肯定是采集数据的,但是采集数据的时候可能存在很多节点与 server 交互,那么需要具体采集哪个节点,就可以用 key 进行采集。
获取远程 key 值
获得主机的 key 值
- 监控项(Itens)就是监控指标获取数据的方式、数据类型、更新数据的时间间隔、历史数据保留时间、趋势数据保留时间、监控项的分组等指标。
- 另一个概念是监控指标,用 key 表示,它是构成监控项的一个元素,在一个主机/模板中必须是唯一的。
zabbix agent
- 利用 key 值获取主机监控数据的,在每个 agent 端的监控项上,都可以找到 zabbix客户端对应的许多 key 值。
“数据采集” --> “主机” --> “监控项”,可以看到每台主机的监控项中,为了采集对应的主机信息,都有一个键值,利用这个键值,Zabbix 就可以获取对应的数据。
zabbix_get 命令获取 Agent 数据举例
zabbix_get 获取 cpu 核心数
[root@ZBX ~]# zabbix_get -s 192.168.10.101 -k system.cpu.num
1
获取目标主机系统和内核版本等参数
[root@ZBX ~]# zabbix_get -s 192.168.10.101 -k system.uname
Linux server01 6.8.7-1.el7.elrepo.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2024
x86_64
查看目标主机端口是否开启
[root@ZBX ~]# zabbix_get -s 192.168.10.101 -k net.tcp.port[,22]
1
- 1:为开启
- 0:为关闭
查看进程是否开启
[root@ZBX ~]# zabbix_get -s 192.168.10.101 -k proc.num[sshd]
9
- 如果开启,显示对应的进程数
查看磁盘剩余空间
[root@ZBX ~]# zabbix_get -s 192.168.10.101 -p 10050 -k vfs.fs.size[/,pfree]
97.051317
查看当前网卡流量
[root@ZBX ~]# zabbix_get -s 192.168.10.101 -p 10050 -k net.if.out[ens33,bytes]
796888
- 在不同时间执行两次这个命令,用后面的减去前面的,除以两者之间的时间,得到速率
获取目标主机内存值
[root@ZBX ~]# zabbix_get -s 192.168.10.101 -p 10050 -k vm.memory.szie[total]
3953934336
- 获取目标主机内存值
Zabbix 自定义 key 值
- 使用 zabbix agent 自带的 key 值,已经可以监控到很多数据了,但是仍然有一些数据,是 agent 的 key 值没有的。
- 对于这些特殊的需求,就要求我们自己定义 key 值。
添加 Nginx 模块支持
安装 nginx
[root@server01 ~]# yum -y install nginx
进入 nginx 目录
[root@server01 ~]# cd /etc/nginx
拷贝文件到指定目录下
[root@server01 ~]# cp nginx.conf.default nginx.conf
添加 nginx_status 模块
[root@server01 ~]# vim /etc/nginx/nginx.conf
#编辑如下参数,添加 nginx_status 模块
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
index index.html index.htm;
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.10.0/24;
allow 127.0.0.1;
deny all;
}
}
- location /nginx_status {
- stub_status on;
- access_log off;
- allow 192.168.10.0/24;
- allow 127.0.0.1;
- deny all;
- }
回显一个测试页面
[root@server01 ~]# echo "test"> /usr/share/nginx/html/index.html
启动服务
[root@server01 ~]# systemctl start nginx
测试是否能够获取到 Ngixn 状态
[root@server01 ~]# curl 127.0.0.1/nginx_status
Active connections: 1
server accepts handled requests
1 1 1
Reading: 0 Writing: 1 waiting: 0
- server:
- accepts: Nginx 启动到现在共处理了 16449 个连接。
- handled: Nginx 启动到现在共成功创建 16449 次握手。
- requests: Nginx 总共处理了15422 次请求。
Active connections:Nginx 正处理的活动接数 1 个
Reading:Nginx 读取到客户端的 Header 信息数。
Writing:Nginx 返回给客户端的 Header 信息数。
Waiting:Nginx 已经处理完正在等候下一次请求指令的驻留链接,开启。
添加监控脚本
添加脚本
[root@server01 ~]# vim /etc/zabbix/nginx-status.sh
#/bin/bash
NGINX_PORT=80
NGINX_COMMAND=$1
nginx_active(){
/usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk '/Active/ {print $NF}'
}
nginx_reading(){
/usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk '/Reading/ {print $2}'
}
nginx_writing(){
/usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk '/Writing/ {print $4}'
}
nginx_waiting(){
/usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk '/Waiting/ {print $6}'
}
nginx_accepts(){
/usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk 'NR==3 {print $1}'
}
nginx_handled(){
/usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk 'NR==3 {print $2}'
}
nginx_requests(){
/usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk 'NR==3 {print $3}'
}
case $NGINX_COMMAND in
active)
nginx_active;
;;
reading)
nginx_reading;
;;
writing)
nginx_writing;
;;
waiting)
nginx_waiting;
;;
accepts)
nginx_accepts;
;;
handled)
nginx_handled;
;;
requests)
nginx_requests;
;;
*)
echo $"USAGE:$0 {active|reading|writing|waiting|accepts|handled|requests}"
esac
提升权限
[root@server01 ~]# chmod +x /etc/zabbix/nginx-status.sh
修改 agent 端参数以支持自定义 key 值
[root@server01 ~]# vim /etc/zabbix/zabbix_agent.conf
UnsafeUserParameters=1
UserParameter=nginx_status[*],/etc/zabbix/nginx-status.sh $1
- UnsafeUserParameters=1:启用自定义 key 功能
UserParameter:指定脚本
nginx_status 为 key 值名称。[*]里写脚本参数,没有可以不写。
- /etc/zabbix/nginx-status.sh$1 路径为脚本所在路径。
重启服务
[root@server01 ~]# systemctl restart zabbix-agent
Zabbix_get 测试
[root@server01 ~]# zabbix_get -s 192.168.10.101 -k nginx_status[accepts]
Zabbix Web 端添加监控
添加模板
- “数据采集” --> “模板” --> “创建模板”,创建一个名为 Nginx 状态的模板
为模板添加监控项
- 点击 “数据采集”,再点击 “模板” 选项后,找到刚刚创建名为 Nginx 状态的模板,点击 “监控项” 后,再点击 “创建监控项” 按钮,创建出如下监控项。
添加监控项
- 监控项 nginx active 键值为 nginx status[active]
- 监控项 nginx reading 键值为 nginx status[reading]
- 监控项 nginx writing 键值为 nginx status[writing]
- 监控项 nginx waiting 键值为 nginx status[waiting]
- 监控项 nginx accepts 键值为 nginx status[accepts]
- 监控项 nginx handled 键值为 nginx status[handled]
- 监控项 nginx request 键值为 nginx status[request]
验证自定义监控
为主机关联新创建的模板
- “数据采集” --> “主机”,为该主机关联刚才创建的模板。
为该主机添加新的监控图形
- “数据采集” --> “主机” --> “图形”,创建 nginx active 图形
其他监控项的图形创建方法一样,此处不在列举。
验证自定义监控数据和图形
- “检测” --> “主机”,查看 server01 的检测数据,以及新添加的图形。
为 nginx 监控创建触发器及邮件报警测试
为模板添加触发器
- 点击 “数据采集” 按钮,再点击 “模板” 选项,然后点击 “nginx-status” 模板,选择“触发器选项,点击 “创建触发器” 按钮
- 添加表达式,点击 “添加” 按钮,在弹出界面里监控项选择 nginx 主机 的 “nginx active” 监控项,功能选择 “last-最后(最近)的 T 值,结果大于 N”,N 填写 “5”,再点击 “插入” 按钮。这里的意思是当 Nginx 的活动连接大于 5 时,触发报警。
由于是实验环境,这里 N 可以设置的小一些,便于验证结果,在生产环境中可以根据需求更改。
添加告警动作和操作
- “告警” --> “动作” --> “触发器动作”,点击创建动作按钮
- 添加触发条件,条件选项触发器,并指定上一步中创建的触发器
设置触发器的操作,指定触发后发送报警信息的接收用户
触发报警
- 模拟多个用户访问网站,使得连接数大于前面设定的报警阈值,并观察邮箱的报警邮件
小技巧
- 写个无限访问小脚本,在多台主机上执行此脚本,即可模拟出多个用户的连接。
cat <<EOF>fangwenjiaoben.sh
while true
do
curl 192.168.10.101
done
EOF
监控 MySQL 主从复制
部署 mysql 主从复制
在两台主机(103 和 104)上安装
[root@server01 ~]# yum -y install mariadb-server mysql
主机 103 当 master
[root@server01 ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=11
log-bin=master-bin
- server-id=11
- log-bin=master-bin
启动服务
[root@server01 ~]# systemctl start mariadb
设置数据库用户和密码
[root@server01 ~]# mysqladmin -uroot password 'pwd123'
登录数据库
[root@server01 ~]# mysql -uroot -ppwd123
MariaDB [(none)]> grant replication slave on *.* to root@'%' identified by 'pwd123';
MariaDB [(none)] show master status;
+------------------------------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------------------------------------------------------+
| master-bin.000001 | 385 | | |
+------------------------------------------------------------------+
主机 104 当 slave
[root@server02 ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=22
启动服务
[root@server02 ~]# systemctl start mariadb
设置数据库用户和密码
[root@server02 ~]# mysqladmin -uroot password 'pwd123'
登入数据库
[root@server02 ~]# mysql -uroot -ppwd123
MariaDB [(none)]> change master to
master_host='192.168.10.101',master_user='root',master_password='pwd123',master_log_file='master-bin.000001',master_log_pos=385;
MariaDB [(none)]> start slave;
MariaDB(none)> show slave status\G
************************** 1. row *******************************************
Slave_ID_State: Waiting for master to send event
Master_Host: 192.168.10.102
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log Pos: 411
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 284
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes
Slave_SOL_Running: Yes
Replicate_Do_DB:
Replicate Ignore DB:
Replicate_Do_Table:
eplicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec Master Log Pos: 411
Relay_Log_Space: 461
Until_condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_cert:
Master_SSl_cipher:
Master_SSL Key:
Seconds_Behind_Master: 0
Master_SL_Verify_Server_cert: NoLast Io Errno: 0
Last_IO_Error:
Last_SOL_Errno: 0
Last_SOL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 11
Master_UUID: 167be460-3d4d-11e8-ad42-000c29ae7f64
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SOL_Running_State: Slave has read all relay log; waiting for the slave I/0thread to update it
Master_Retry_count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_crlpath:
Retrieved_Gtid_set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
MySQL-slave 端开启自定义 key 值并设置
[root@server02 ~]# vim /etc/zabbix/zabbix_agent.conf
UnsafeUserParameters=1
UserParameter=mysql.slave[*l,/etc/zabbix/mysql-slave.sh
编写脚本获取数据
[root@server02 ~]# vim /etc/zabbix/mysql-slave.sh
#!/bin/bash
/usr/bin/mysql -uroot -ppwd123 -e 'show slave status\G' |grep -E "Slave_IO_Running|Slave_SQL_Running"|awk '{print $2}'|grep -c Yes
提升权限
[root@server02 ~]# chmod +x /etc/zabbix/mysql-slave.sh
重启服务
[root@server02 ~]# systemctl restart zabbix-agent
Zabbix_get 测试
[root@server02 ~]# zabbix_get -s 192.168.10.102 -k mysql.slave[*]
2
- Slave_IO_Runningt 和 slave_SQL_Running 返回的 yes 值为 2
添加监控模板
- “数据采集” --> “模板”,再点击 “创建模板” 按钮,进行创建模板操作。
为模板添加监控项
- “数据采集” --> “模板”,点击刚才创建的模板,为此模板添加 “监控项” 信息,名称输入“mysql-slave”,键值输入“mysql.slave[*]”,然后点击 “添加” 按钮。
为主机关联模板
- 为 server02 主机关联刚才创建的监控模板
为模板添加触发器
- “数据采集” --> “模板”,找到刚才创建的模板 mysql-slave,点击 “触发器”,再点击 “创建触发器”。
- 在监控项中点击 “选择” 按钮,选择前面创建的 mysql-slave 监控项,在功能处点击下拉菜单,选择 “last-最后(最近)的 T 值”,结果为<N 下面 N 中输入 2,然后点击 “插入” 按钮。
添加告警动作和操作
- “告警” --> “动作” --> “触发器动作”
- 条件选项触发器,并指定上一步中创建的触发器
测试
- 关闭 mysql 从节点的 slave 进程
[root@server02 ~]# mysql -uroot -ppwd123
MariaDB [(none)]> stop slave;
观察报警信息
监控网站关键词
- 监控网站关键词与监控 Nginx 大致相同,都是编写检索字段的脚本,然后 web 端添加监控。
创建测试页面
[root@server01 ~]# vim /usr/share/nginx/html/index.html
<html>
<body>
<p>nihao 黄 nihao</p>
<p>nihao 赌 nihao</p>
<p>nihao 毒 nihao</p>
</body>
</html>
编写检索脚本
[root@server01 ~]# vim /etc/zabbix/gjc.sh
#!/bin/bash
curl -s http://192.168.10.101/index.html | grep -e 黄 -e 赌 -e 毒 | wc -l
提升权限
[root@server01 ~]# chmod +x /etc/zabbix/gjc.sh
开启 Agent 的自定义 key 值
[root@server01 ~]# vim /etc/zabbix/zabbix_agentd.conf
UnsafeUserParameters=1
UserParameter=nginx gjc[*],/etc/zabbix/gjc.sh
重启服务
[root@server01 ~]# systemctl restart zabbix-agent
在管理界面添加模板
- “数据采集” --> “模板”,点击创建模板,在此界面配置 “关键词检索模板”,添加模板相关信息。
为模板添加监控项
- “数据采集” --> “模板”,找到刚才创建的模板,点击它的监控项,并创建监控项,键值为 nginx_gjc。
将模板关联到主机
- “数据采集” --> “主机”,找到 nginx 的服务器,为此主机关联刚才创建的模板。
为模板添加触发器
- “数据采集” --> “模板”,找到此模板,点击它的触发器,为此模板创建触发器
Zabbix_get 测试
[root@zbx ~]# zabbix_get -s 192.168.10.101 -k nginx_gjc[*]
3
添加告警动作和操作
- 告警 --> 动作--> 触发器动作,创建 server01 的告警动作和操作。
查看触发的告警信息
- 如果有告警信息,但是不发送邮件,可以先把 nginx 关掉,再打开,重新触发。
小阿轩yx-案例:Zabbix自定义监控项与触发器