zabbix自定义监控


zabbix的监控流程

服务端:配置模板 --->  创建监控项 --->创建监控项,监控  ---->主机添加模板
客户端:配置key

用户数量的监控

客户端配置
# 1.了解监控需求,获取监控数据
## 零宽断言
[root@web02 ~]# ifconfig eth0|grep -Po '[1-9][0-9]*\.\d+\.\d+\.\d+(?= netmask)'
[root@web02 ~]# uptime|grep -Po '\d+(?= user)'

# 2.修改zabbix-agent的配置文件(使用zabbix-agent配置文件中的 UserParameter= 定义监控项)
语法:
Format: UserParameter=<key>,<shell command>
Format: UserParameter=监控项名字,shell命令
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=user_count,uptime|grep -Po '\d+(?= user)'

# 3.重启zabbix-agent
[root@web01 ~]# systemctl restart zabbix-agent

# 4.在zabbix-server上(zabbix-get)测试,是否可以接收到zabbix-agent获取的数据
[root@zabbix5-server ~]# rpm -ivh
https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-get-5.0.42-1.el7.x86_64.rpm
[root@zabbix5-server ~]# zabbix_get -s 172.16.1.7 -k user_count
3
[root@zabbix5-server ~]# zabbix_get -s 172.16.1.7 -k user_count
5

# 5.优化监控项的保存配置
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.d/user.conf
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/user.conf
UserParameter=user_count,uptime|grep -Po '\d+(?= user)'
服务端配置
创建一个用户检测模板

image-20240802142731080

image-20240802142929067

在模板中添加监控项

image-20240802143031030

image-20240802143211022

image-20240802143411936

为主机添加模板

image-20240802143609166

image-20240802143719854

image-20240802143918921

为监控项添加图形

image-20240802144048696

image-20240802144112532

image-20240802144211117

image-20240802144333057

为模板中的监控添加触发器

image-20240802144438618

image-20240802144512753

image-20240802144806659

image-20240802145217087

参数化定义监控项

 ### 传入参数 调取参数
vim /etc/zabbix/zabbix_agentd.d/port.conf
UserParameter=tcp.port[*],ss -lnt|grep -wc "$1"

[root@web01 ~]# systemctl restart zabbix-agent

image-20240802151717790

image-20240802151807287

监控TCP的十一种状态 ---(传递参数)

LISTEN - 侦听来自远方TCP端口的连接请求;
SYN-SENT -在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2 - 从远程TCP等待连接中断请求;
CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
CLOSING -等待远程TCP对连接中断的确认;
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED - 没有任何连接状态;
客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT
。
服务端独有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。
共有的:(1)CLOSED (2)ESTABLISHED 。
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.d/tcp_status.conf
UserParameter=tcp.status[*],ss -lnt|grep -ic "$1"

image-20240802152306391

监控nginx - php 状态页监控

image-20240802153605450

image-20240802153754134

image-20240802153548233

#### 状态页面对应解释 #####
# nginx
Active connections – 活跃的连接数量
server accepts handled requests — 总共处理了7个连接 , 成功创建7次握手, 总共处理了36个请求。
reading — 读取客户端的连接数。
writing — 响应数据到客户端的数量。
waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

#PHP-FPM状态解释:
pool #fpm池名称,大多数为www
process manager #进程管理方式dynamic或者static
start time #启动日志,如果reload了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,那说明你的最大进程数量过小,可以适当调整。
vim /etc/nginx/conf.d/webapp.conf
server{
	listen 80;
	server_name _;
	location / {
		root /code/webapp;
		index index.html;
	}
	location /status {
	stub_status on;
	}
	location ~ ^/(php_status)$ {
		include fastcgi_params;
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_param SCRIPT_FILENAME
		$document_root$fastcgi_script_name;
	}
}

http://10.0.0.7/status
##### nginx 监控脚本呢 #####
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.d/scripts/nginx_status.sh
#!/bin/bash
NGINX_PORT=80 #如果端口不同仅需要修改脚本即可,否则修改xml很麻烦
NGINX_URL=http://172.16.1.7/status
nginx_active(){
	/usr/bin/curl -s "${NGINX_URL}" |awk '/Active/ {print $NF}'
}
nginx_reading(){
	/usr/bin/curl -s "${NGINX_URL}" |awk '/Reading/ {print $2}'
}
nginx_writing(){
	/usr/bin/curl -s "${NGINX_URL}" |awk '/Writing/ {print $4}'
}
nginx_waiting(){
	/usr/bin/curl -s "${NGINX_URL}" |awk '/Waiting/ {print $6}'
}
nginx_accepts(){
	/usr/bin/curl -s "${NGINX_URL}" |awk 'NR==3 {print $1}'
}
nginx_handled(){
	/usr/bin/curl -s "${NGINX_URL}" |awk 'NR==3 {print $2}'
}
nginx_requests(){
	/usr/bin/curl -s "${NGINX_URL}" |awk 'NR==3 {print $3}'
}

case $1 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@web01 ~]# chmod +x /etc/zabbix/zabbix_agentd.d/scripts/nginx_status.sh


####### php 监控脚本  
[root@web01 scripts]# cat php_status.sh
#!/bin/bash
PHPFPM_COMMAND=$1
PHPFPM_URL="http://172.16.1.7/php_status"
start_since(){
	/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^start since:/ {print $NF}'
}
accepted_conn(){
	/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^accepted conn:/ {print $NF}'
}
listen_queue(){
	/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^listen queue:/ {print $NF}'
}
max_listen_queue(){
/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^max listen queue:/ {print $NF}'
}
listen_queue_len(){
	/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^listen queue len:/ {print $NF}'
}
idle_processes(){
	/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^idle processes:/ {print $NF}'
}
active_processes(){
	/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^active processes:/ {print $NF}'
}
total_processes(){
	/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^total processes:/ {print $NF}'
}
max_active_processes(){
	/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^max active processes:/ {print $NF}'
}
max_children_reached(){
	/usr/bin/curl -s "${PHPFPM_URL}" |awk '/^max children reached:/ {print $NF}'
}
slow_requests(){
	/usr/bin/curl -s "${PHPFPM_URL}" |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

# 修改客户端配置文件
[root@web01 zabbix_agentd.d]# vim php_status.conf
UserParameter=php.status[*],/etc/zabbix/zabbix_agentd.d/scripts/php_status.sh $1
#客户端--修改zabbix-agent配置文件
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.d/scripts/nginx_status.sh $1
[root@web01 ~]# systemctl restart zabbix-agent

image-20240802153113650

image-20240802153124930

image-20240802153136413