Zabbix提供了大量丰富的监控指标,但是在日常工作中,根据不同的需求,还需要开发一些自定义的监控指标。Zabbix提供了响应的自定义监控指标的功能。Zabbix agent的UserParameter参数允许用户自定义监控项,并通过Zabbix agent执行费Zabbix原生指令来实现监控。自定义的监控项的配置参数保存于Zabbix agent的配置文件中
自定义监控项的配置参数:
Include=/etc/zabbix/zabbix_agentd.d/*.conf --自定监控路径 UnsafeUserParameters=1 --改为1为开启自定义监控功能,默认该功能为关闭状态UserParameter= --自定义监控项自定义监控格式如下 UserParameter = <key>,<shell command> 格式中的key代表监控项名称,不能使用中文,中间没有空格,在单台主机上是唯一的,此key与Zabbix在web界面上的监控项名称必须保持一致 因为自定义监控项可接受传参,所以还又一种更为灵活的自定义监控项格式: UserParameter = <key[*]>,<shell command>格式中的key[*]代表监控项名称,与key类似。在Zabbix Web界面上设置监控项时,配置中的*代表要穿计的参数,数量不能超过9个,参数与参数之间用逗号分隔,一般与自动发现规则配合使用,如下图所示
key[*]在上图中代表network_bandwidth[{#IFNAME}],{#IFNAME}在Zabbix Web中代表josn格式多网络接口的名称,在Zabbix agent配置文件中,定义了该自定义顶监控在配置文件中修改监控项: vim / etc / zabbix / zabbix_agentd.conf UserParameter = network_bandwidth[*],ethtool $1 | grep -oP "(?>=Speed:\s)[0-9]+"
这样,一个监控网卡带宽的自定义监控就做好了,下面将进入实战
在默认情况下,不允许用户在自定义监控项中使用特殊符号,如果传递的参数中包含特殊字符,则需要在配置文件中将UnsafeUserParameters参数设置为1,如下图
vim /etc/zabbix/zabbix_agentd.conf
在执行自定义监控项脚本的时,也需要注意执行时间超市的时间,如果超过设置的超时时间,那么该命令的进程将被终止,Zabbix默认的超时时间时3s,可以通过修改配置文件中的Timeout的参数来设置不同的值(注意:此参数的值最大为30s)
vim /etc/zabbix/zabbix_agentd.conf
首先,部署LNMP架构,这里就不赘述了,按照步骤来
部署PHP(在客户端操作)
yum install mariadb mariadb-server php php-fpm php-mysql php-gd -y vim /etc/my.cnf [mysqld] character-set-server=utf8 --手动添加 #启动服务并设置服务随机自启 systemctl start mariadb && systemctl enable mariadb 修改/etc/php-fpm.d/www.conf配置文件指定用户与组,并开启状态页面用于监控服务状态。 vim /etc/php-fpm.d/www.conf ... 39 user = nginx 41 group = nginx 121 pm.status_path = /php_status --取消注释(默认被注释)并改名为/php_status 修改配置/etc/php.ini 指定php时区 vim /etc/php.ini ... date.timezone ="Asia/shanghai" --指定时区
vim /etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true #安装nginx yum -y install --setopt=obsoletes=0 nginx-1.22.0-1.el7.ngx.x86_64vim /etc/nginx/conf.d/default.confserver { listen 80; server_name localhost; #开启nginx状态页面 location = /status { stub_status; } location / { root /usr/share/nginx/html; index index.php index.html index.htm; #增加index.php索引页 } #连接php-fpm location ~ \.php$ { root /usr/share/nginx/html; #网页根目录需要绝对路径 fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #连接php_status页面 location /php_status { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; } }#启动服务&设置服务随机自启 systemctl restart nginx && systemctl enable nginx #启动php-fpm systemctl start php-fpm && systemctl enable php-fpm
测试 访问nginx状态页面:http://server_ip/status 访问php-fpm状态页面:http://server_ip/php_status 测试nginx和php协同 vim /usr/share/nginx/html/phpinfo.php <?php phpinfo(); ?>
自定义Nginx监控(在客户端操作)
自定义nginx访问量的监控项,首先要通过脚本将各种状态的值取出来,然后通过zabbix监控。 mkdir /etc/zabbix/script/ cd /etc/zabbix/script chmod + x ngx_status.sh # 脚本内容主要是利用函数定义nginx状态页面的各个字段,然后结合awk进行取值,最后在通过case语句控制脚本输出 cat /etc/zabbix/script/ngx_status.sh # 定义Nginx status页面 ngx_status = "http://127.0.0.1/status" # 判断status页面是否存活 ngx_status_code() { http_code = `curl - o / dev / null - s - w % {http_code} ${ngx_status} ` if [ ${http_code} == "200"];then return 1 else echo "Nginx status is not running." fi } # 获取当前活动用户的连接数量 active() { ngx_status_code | | curl - s ${ngx_status} | grep "Active" | awk '{print $NF}' } # 获取接受的客户端连接数量 accepts() { ngx_status_code | | curl - s ${ngx_status} | awk NR == 3 | awk '{print $1}' } # 获取处理的连接总数量 handled() { ngx_status_code | | curl - s ${ngx_status} | awk NR == 3 | awk '{print $2}' } # 获取客户端请求的总数量 requests() { ngx_status_code | | curl - s ${ngx_status} | awk NR == 3 | awk '{print $3}' } # 获取正在读取请求标头的当前连接数量 reading() { ngx_status_code | | curl - s ${ngx_status} | grep "Reading" | awk '{print $2}' } # 获取正在将响应写回到客户端的当前连接数量 writing() { ngx_status_code | | curl - s ${ngx_status} | grep "Writing" | awk '{print $2}' } # 获取当前正在等待响应的客户端连接数量 waiting() { ngx_status_code | | curl - s ${ngx_status} | grep "Waiting" | awk '{print $2}' } # 使用位置变量控制脚本输出 case $1 in active) active;; accepts) accepts;; handled) handled;; requests) requests;; reading) reading;; writing) writing;; waiting) waiting;; * ) echo "Unknown options" esac
#修改zabbix agent配置文件,开启自定义监控功能 vim /etc/zabbix/zabbix_agentd.conf ... 311 Include=/etc/zabbix/zabbix_agentd.d/*.conf --自定监控路径 330 UnsafeUserParameters=1 --改为1为开启自定义监控功能,默认该功能为关闭状态 #进入自定义监控路径 cd /etc/zabbix/zabbix_agentd.d/ #创建自定义监控文件(文件名要求以 .conf结尾) vim custom_nginx_status.conf UserParameter=nginx.active,bash /etc/zabbix/script/ngx_status.sh active UserParameter=nginx.accepts,bash /etc/zabbix/script/ngx_status.sh accepts UserParameter=nginx.handled,bash /etc/zabbix/script/ngx_status.sh handled UserParameter=nginx.requests,bash /etc/zabbix/script/ngx_status.sh requests UserParameter=nginx.reading,bash /etc/zabbix/script/ngx_status.sh reading UserParameter=nginx.writing,bash /etc/zabbix/script/ngx_status.sh writing UserParameter=nginx.waiting,bash /etc/zabbix/script/ngx_status.sh waiting #解释 UserParameter= #自定义监控固定格式 nginx.active #监控项名称 #重启zabbix-agent服务 systemctl restart zabbix-agent
获取监控数据(服务端)
yum -y install zabbix-get #获取客户端监控项值 zabbix_get -s 192.168.0.15 -k nginx.active --当前活动用户的连接数量 zabbix_get -s 192.168.0.15 -k nginx.accepts --接受的客户端连接总数量 zabbix_get -s 192.168.0.15 -k nginx.handled --处理的连接总数量 zabbix_get -s 192.168.0.15 -k nginx.requests --客户端请求的总数量 zabbix_get -s 192.168.0.15 -k nginx.reading --正在读取请求标头的当前连接数 zabbix_get -s 192.168.0.15 -k nginx.writing --将响应写回客户端的当前连接数 zabbix_get -s 192.168.0.15 -k nginx.waiting --当前客户端正在等待服务器的响应数量
接下来创建监控模板,应用集以及监控项
点击配置-模板 创建新的模板,这里笔者已经创建好了 模板是 nginx_status
然后创建监控项
键值就是上面服务端测试键值
然后绑定模板,转到配置-主机,找到你的主机,把模板绑定到主机
然后点击更新
自定义php-fpm监控
#查看php-fpm配置文件确保已经开启状态页面功能(搜索:status) vim /etc/php-fpm.d/www.conf ... 121 pm.status_path = /php_status
#查看nginx配置文件确保可以访问php_status页面 vim /etc/nginx/conf.d/default.conf ... location /php_status { #php状态页面 root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; }
访问php状态页面:http://server_ip/php_status
监控项名称详解:
pool:fpm池子名称,大多数为www process manager:进程管理方式,值:static,dynamic or ondemand start time:启动日期,如果reload了php-fpm,时间会更新 start since:运行时长 accepted conn:当前池子接受的请求数 listen queue:请求等待队列,如果这个值不为0,那么要增加FPM的进程数量 max listen queue:请求等待队列最高的数量 listen queue len:socket等待队列长度 idle processes:空闲进程数量 active processes:活跃进程数量 total processes:总进程数量 max active processes:最大的活跃进程数量(FPM启动开始算) max children reached:进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,需要设置大点 slow requests 当启用了php-fpm slow-log功能时,如果出现php-fpm慢请求这个计数器会增加,一般不当的Mysql查询会触发这个值
监控方法与nginx类似
#上传脚本到/etc/zabbix/script路径并添加执行权限 chmod +x phpfpm_status.sh cat phpfpm_status.sh#!/bin/bash PHPFPM_COMMAND=$1 #根据监听不同端口进行调整 PHPFPM_PORT=80 start_since(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^start since:/ {print $NF}' } accepted_conn(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^accepted conn:/ {print $NF}' } listen_queue(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^listen queue:/ {print $NF}' } max_listen_queue(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^max listen queue:/ {print $NF}' } listen_queue_len(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^listen queue len:/ {print $NF}' } idle_processes(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^idle processes:/ {print $NF}' } active_processes(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^active processes:/ {print $NF}' } total_processes(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^total processes:/ {print $NF}' } max_active_processes(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^max active processes:/ {print $NF}' } max_children_reached(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^max children reached:/ {print $NF}' } slow_requests(){ /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^slow requests:/ {print $NF}' }case $PHPFPM_COMMAND in start_since) start_since; ;; accepted_conn) accepted_conn; ;; listen_queue) listen_queue; ;; max_listen_queue) max_listen_queue; ;; listen_queue_len) listen_queue_len; ;; idle_processes) idle_processes; ;; active_processes) active_processes; ;; total_processes) total_processes; ;; max_active_processes) max_active_processes; ;; max_children_reached) max_children_reached; ;; slow_requests) slow_requests; ;; *) echo $"USAGE:$0 {start_since|accepted_conn|listen_queue|max_listen_queue|listen_queue_len|idle_processes|active_processes|total_processes|max_active_processes|max_children_reached}" esac#创建自定义监控项文件 vim /etc/zabbix/zabbix_agentd.d/phpfpm_status.conf UserParameter=phpfpm_status[*],/bin/bash /etc/zabbix/script/phpfpm_status.sh "$1" #重启zabbix agent服务 systemctl restart zabbix-agent
zabbix server获取监控项数据
zabbix_get -s 192.168.0.15 -k phpfpm_status[start_since] --php-fpm运行时长 zabbix_get -s 192.168.0.15 -k phpfpm_status[accepted_conn] --当前接收的连接数 zabbix_get -s 192.168.0.15 -k phpfpm_status[listen_queue] --等待连接的请求数 zabbix_get -s 192.168.0.15 -k phpfpm_status[max_listen_queue] --请求等待队列最高的数量 zabbix_get -s 192.168.0.15 -k phpfpm_status[listen_queue_len] --socket等待队列长度 zabbix_get -s 192.168.0.15 -k phpfpm_status[idle_processes] --空闲进程数量 zabbix_get -s 192.168.0.15 -k phpfpm_status[active_processes] --活跃进程数量 zabbix_get -s 192.168.0.15 -k phpfpm_status[total_processes] --总进程数量 zabbix_get -s 192.168.0.15 -k phpfpm_status[max_active_processes] --最大的活跃进程数量 zabbix_get -s 192.168.0.15 -k phpfpm_status[max_children_reached] --进程最大数量限制的次数 zabbix_get -s 192.168.0.15 -k phpfpm_status[slow_requests] --php-fpm慢请求
接下来就是创建模板、应用集、监控项、绑定模板、与前面nginx一样,至此,配置完成,最后效果图