小阿轩yx-案例:Zabbix自定义监控项与触发器

小阿轩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自定义监控项与触发器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值