文章目录
- 集群监控
- 监控Windows
- 监控网络设备
- 监控物理服务器
- 监控java业务
-
- 自定义监控(java线程状态)
- 相关项监控
- JMX监控(java-gateway监控)
-
- 流程
- (1)开启远程监控功能
- (2)如果是docker搭建zabbix服务端运行gateway
- [(2)yum安装zabbix服务端部署java gateway配置](#(2)yum安装zabbix服务端部署java gateway配置)
- (3)添加主机关联模板
- jar包应用
- 报错解决
-
- [cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found](#cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found)
集群监控
| 客户端 | 监控方式 |
|---|---|
| linux | zabbix agent/zabbix agent2 |
| windows server | zabbix agent/zabbix agent2 |
| 网络设备 | snmp 接口与协议 |
| 硬件设备物理服务器 | ipmi (物理服务器,监控风扇转速,cpu 温度) |
| java 应用或业务 | 🅰️ 自定义监控(zbx-agent + 自定义)jmap -heap jvm 信息导出 (推荐) 🅱️ jmx javagateway 监控 |
监控Windows
zabbix agent官方下载地址: Download Zabbix agents
(1)下载zabbix agent/zabbix agent2

(2)双击下载一直点下一步
Host name:填写windows本机host
Zabbix server IP/DNS:填写zabbix server端的IP
Agent listen port:agent的端口,默认10050,可不做修改
Server or proxy for active checks:填写zabbix server端的IP

(3)zabbix web 添加主机


监控网络设备
SNMP支持范围
- 网络设备(硬件设备):这些都是支持SNMP协议(服务)
- 企业路由器,三层交换机
- 防火墙
SNMP

snmp:简单网络管理协议,管理网络设备,查看网络设备信息
服务端:网络设备snmp服务端161端口
客户端:监控
SNMP 的 3 个版本差异
| 版本 | 认证方式 | 特点 & 适用场景 |
|---|---|---|
| SNMP v1 | 团体名(类似密码) | 最早版本,功能简单,安全性低,仅用于早期简单场景 |
| SNMP v2c | 团体名认证 | 兼容 v1,新增批量查询(GetBulk)、更多数据类型,是目前最常用的版本 |
| SNMP v3 | 用户名 + 密码(支持加密) | 安全性最高(防非法访问、防报文窃听),但配置复杂、效率略低,适用于高安全场景 |
路由器配置
开启路由器的SNMP功能
SNMP版本选择:一般使用v2c

设置团体名,相当于密码
Read-Only只读(一般做监控给读权限即可)
Read-Write读写

zabbix server配置和zabbix web配置
shell
#1.服务端安装
yum install -y net-snmp
#2.测试
snmpwalk -v 2c -c 团体名 路由器IP SysDesc
添加主机


监控物理服务器
开启IPMI

开启完成,然后就可以在zabbix web页面创建主机
监控java业务
| 方案类型 | 适用 JDK 版本 | 相关命令 | 配置要点 | 优势与推荐 |
|---|---|---|---|---|
| 自定义监控 | JDK8;JDK11 及以上 | JDK8:jstack、jmap JDK11 及以上:jhsdb jmap --heap --pid [目标进程PID] |
无需修改 Zabbix 服务端 / 客户端,通过UserParameter配置自定义脚本 |
无需额外修改服务端 & 客户端UserParameter + 脚本,操作简单直接一般推荐使用 |
| JMX 监控 | 通用 | 依赖 Java jmxremote 功能 | 1. 业务端:修改catalina.sh添加 jmxremote 参数 2. Zabbix 服务端:部署zabbix_java_gateway服务3. Zabbix 服务端:修改配置文件指定 gateway,启动 java poller |
需配置服务端与客户端(开启 jmxremote)依赖 Zabbix 模板,配置流程较繁琐 |
自定义监控(java线程状态)
(1)手动过滤出客户端Tomcat的java线程状态
shell
#1.过滤出tomcat的java线程PID
ps -ef |grep /usr/local/tomcat | grep -v grep | awk '{print $2}'
#2.查看java线程状态
jstack pid | grep -i thread.state
(2)在客户端编写shell脚本
shell
cat > /server/scripts/java-thread-status.sh <<'EOF'
#!/bin/bash
##############################################################
# File Name:java-tread-status.sh
# Version:V1.0
# Author:csq
# Organization: www.chenshiquan.xyz
# Desc:
##############################################################
#1.vars
app=/usr/local/tomcat/
choose=$1
#2.pid
pid=`ps -ef |grep $app|grep -v grep | awk '{print $2}'`
#3.check_pid
if [ -z "$pid" ];then
echo "不存在"
exit 1
fi
#4.调用jstack命令
case "$choose" in
runnable)
jstack $pid |grep -i thread.state | grep -i runnable| wc -l
;;
waiting)
jstack $pid |grep -i thread.state | grep -iw waiting| wc -l
;;
timed_waiting)
jstack $pid |grep -i thread.state | grep -iw timed_waiting| wc -l
;;
blocked)
jstack $pid |grep -i thread.state | grep -i blocked| wc -l
;;
*)
echo "输入异常"
esac
EOF
(3)配置zabbix客户端键值
shell
#1.配置客户端agent键值,在子配置文件配置
cat > /etc/zabbix/zabbix_agentd.d/java-thread-status.conf <<EOF
UserParameter=java.thread[*],sudo bash /server/scripts/java-thread-status.sh $1
EOF
#2.重启agent
systemctl restart zabbix-agent
(4)zabbix服务端测试客户端键值对
shell
#1.zabbix服务端测试
zabbix_get -s 172.16.1.115 -k java.thread["runnable"]
zabbix_get -s 172.16.1.115 -k java.thread["blocked"]
(5)zabbix web页面tomcat业务主机添加监控项

(6)克隆监控项,给其他java线程状态页创建监控项

(7)配置blocked线程阻塞就报警,配置监控项blocked的触发器

(8)添加java线程状态图形


(9)创建模板,将监控项、触发器、图形添加到模板中



(10)关联主机


相关项监控
如果zabbix 想要看 jvm内存详细信息呢?
xshell复制两个窗口,同时执行相同命令,可以看到另一个窗口是报错的
这是因为Linux 的 ptrace 调试机制 + JVM 工具的 "排他性附加" 限制 ------ 同一时间,一个 Java 进程只能被一个 jhsdb 这类 "调试型工具" 附加,第二个窗口会因 "附加权限被占用" 报错

相关项监控就是通过正则表达式将,将数据源过滤提取出你要的结果
(1)使用命令输出你要提取的数据源
shell
#1.获取tomcat业务的所有jvm内存信息
[root@web03 ~]# jhsdb jmap --heap --pid 861
Attaching to process ID 861, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.28+6
using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 513802240 (490.0MB)
NewSize = 1363144 (1.2999954223632812MB)
MaxNewSize = 308281344 (294.0MB)
OldSize = 5452592 (5.1999969482421875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 1048576 (1.0MB)
Heap Usage:
G1 Heap:
regions = 490
capacity = 513802240 (490.0MB)
used = 26731008 (25.49267578125MB)
free = 487071232 (464.50732421875MB)
5.202586894132653% used
G1 Young Generation:
Eden Space:
regions = 15
capacity = 19922944 (19.0MB)
used = 15728640 (15.0MB)
free = 4194304 (4.0MB)
78.94736842105263% used
Survivor Space:
regions = 1
capacity = 1048576 (1.0MB)
used = 1048576 (1.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:
regions = 11
capacity = 34603008 (33.0MB)
used = 9953792 (9.49267578125MB)
free = 24649216 (23.50732421875MB)
28.765684185606062% used
#2.写个脚本获取tomcat业务的所有jvm内存信息
cat > /server/scripts/java-thread-jvm-memory.sh <<'EOF'
#!/bin/bash
##############################################################
# File Name:java-tread-status.sh
# Version:V1.0
# Author:csq
# Organization: www.chenshiquan.xyz
# Desc:
##############################################################
#1.vars
app=/usr/local/tomcat/
choose=$1
#2.pid
pid=`ps -ef |grep $app|grep -v grep | awk '{print $2}'`
#3.check_pid
if [ -z "$pid" ];then
echo "不存在"
exit 1
fi
#4.调用jhsdb命令
jhsdb jmap --heap --pid $pid
EOF
(2)在客户端agent子配置文件中写入相关键值
shell
#1.修改客户端agent子配置文件
cat >> /etc/zabbix/zabbix_agentd.d/java-thread-status.conf <<EOF
#jvm内存信息
UserParameter=java.jvm.mem.all,sudo bash /server/scripts/java-thread-jvm-memory.sh $1
EOF
#2.重启agent生效配置文件
systemctl restart zabbix-agent
(3)zabbix服务端测试键值
shell
#1.测试客户端键值是否可用
zabbix_get -s 172.16.1.115 -k java.jvm.mem.all
#2.如果可用继续下一步
(4)在zabbix web页面tomcat业务主机创建主要监控项,获取数据源


(5)创建tomcat业务jvm内存信息的相关项,并设置正则过滤数据源
| 监控指标名称 | 最终修正正则表达式(Heap Configuration 专用) | 匹配结果示例 |
|---|---|---|
| 最小堆空闲比率(MinHeapFreeRatio) | \s+MinHeapFreeRatio\s+=\s+([0-9]+) |
40 |
| 最大堆空闲比率(MaxHeapFreeRatio) | \s+MaxHeapFreeRatio\s+=\s+([0-9]+) |
70 |
| 最大堆大小(字节数) | \s+MaxHeapSize\s+=\s+([0-9]+)\s+\(([0-9.]+)MB\) |
513802240 |
| 最大堆大小(MB) | \s+MaxHeapSize\s+=\s+[0-9]+\s+\(([0-9.]+)MB\) |
490.0 |
| 新生代初始大小(字节数) | \s+NewSize\s+=\s+([0-9]+)\s+\(([0-9.]+)MB\) |
1363144 |
| 新生代初始大小(MB) | \s+NewSize\s+=\s+[0-9]+\s+\(([0-9.]+)MB\) |
1.2999954223632812 |
| 新生代最大大小(字节数) | \s+MaxNewSize\s+=\s+([0-9]+)\s+\(([0-9.]+)MB\) |
308281344 |
| 新生代最大大小(MB) | \s+MaxNewSize\s+=\s+[0-9]+\s+\(([0-9.]+)MB\) |
294.0 |
| 老年代初始大小(字节数) | \s+OldSize\s+=\s+([0-9]+)\s+\(([0-9.]+)MB\) |
5452592 |
| 老年代初始大小(MB) | \s+OldSize\s+=\s+[0-9]+\s+\(([0-9.]+)MB\) |
5.1999969482421875 |
| 新生代与老年代比例(NewRatio) | \s+NewRatio\s+=\s+([0-9]+) |
2 |
| 新生代 Eden/Survivor 比例(SurvivorRatio) | \s+SurvivorRatio\s+=\s+([0-9]+) |
8 |
| 元空间初始大小(字节数) | \s+MetaspaceSize\s+=\s+([0-9]+)\s+\(([0-9.]+)MB\) |
21807104 |
| 元空间初始大小(MB) | \s+MetaspaceSize\s+=\s+[0-9]+\s+\(([0-9.]+)MB\) |
20.796875 |
| 压缩类空间大小(字节数) | \s+CompressedClassSpaceSize\s+=\s+([0-9]+)\s+\(([0-9.]+)MB\) |
1073741824 |
| 压缩类空间大小(MB) | \s+CompressedClassSpaceSize\s+=\s+[0-9]+\s+\(([0-9.]+)MB\) |
1024.0 |
| 最大元空间大小(字节数) | \s+MaxMetaspaceSize\s+=\s+([0-9]+)\s+MB |
17592186044415 |
| G1 堆区域大小(字节数) | \s+G1HeapRegionSize\s+=\s+([0-9]+)\s+\(([0-9.]+)MB\) |
1048576 |
| G1 堆区域大小(MB) | \s+G1HeapRegionSize\s+=\s+[0-9]+\s+\(([0-9.]+)MB\) |
1.0 |
shell
#perl正则
\d [0-9]
\w [a-zA-Z0-9_]
\s 空格,回车,tab键




(6)如法炮制,将自己想要获取的内容添加监控项

(7)创建模板将创建的监控项关联进去


(8)如果有需要可以将他们导出

JMX监控(java-gateway监控)

zabbix官方文档:13 JMX监控
流程
- 开启远程监控功能
- zabbix服务你部署java gateway配置
- 添加主机关联模板
(1)开启远程监控功能
shell
#在tomcat根目录下的 bin/catalina.sh
#在#!/bin/bash注释下面添加
CATALINA_OPTS="-Dcom.sun.management.jmxremote \ #启用远程监控JMX
-Dcom.sun.management.jmxremote.port=12345 \ #默认启动的JMX端口号
-Dcom.sun.management.jmxremote.authenticate=false \ #不使用用户名密码
-Dcom.sun.management.jmxremote.ssl=false \ #不使用SSL认证
-Djava.rmi.server.hostname=172.16.1.9" #是tomcat主机的IP地址,不是zabbix
export CATALINA_OPTS
#重启生效
systemctl restart tomcat
(2)如果是docker搭建zabbix服务端运行gateway
shell
#version: "3.8"
services:
db:
image: mysql:8.0-debian
container_name: zbx_db
networks:
- oldboy_zbx_net
restart: always
volumes:
- ./zbx_db/:/var/lib/mysql/
environment:
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASS}"
MYSQL_DATABASE: "${ZBX_DB}"
MYSQL_USER: "${ZBX_USER}"
MYSQL_PASSWORD: "${ZBX_PASS}"
command:
- --character-set-server=utf8
- --collation-server=utf8_bin
- --default-authentication-plugin=mysql_native_password
zbx_server:
image: zabbix/zabbix-server-mysql:7.0.9-ubuntu
container_name: zabbix-server-mysql-7.0
networks:
- oldboy_zbx_net
restart: always
ports:
- 10051:10051
depends_on:
- db
environment:
DB_SERVER_HOST: "db"
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASS}"
MYSQL_DATABASE: "${ZBX_DB}"
MYSQL_USER: "${ZBX_USER}"
MYSQL_PASSWORD: "${ZBX_PASS}"
zbx_web:
image: zabbix/zabbix-web-nginx-mysql:7.0.9-ubuntu
container_name: zabbix-web-nginx-mysql
networks:
- oldboy_zbx_net
restart: always
ports:
- 80:8080
depends_on:
- db
- zbx_server
environment:
ZBX_SERVER_HOST: "zbx_server"
DB_SERVER_HOST: "db"
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASS}"
MYSQL_DATABASE: "${ZBX_DB}"
MYSQL_USER: "${ZBX_USER}"
MYSQL_PASSWORD: "${ZBX_PASS}"
networks:
oldboy_zbx_net:
driver: bridge
ipam:
config:
- subnet: 172.200.0.0/16
ip_range: 172.200.1.0/24
gateway: 172.200.1.1
(2)yum安装zabbix服务端部署java gateway配置
zabbix官方网站:下载Zabbix 7.0 LTS for CentOS 7
shell
#0.先添加zabbix-agent仓库源,如果添加过了就别添加了
#1.客户端安装zabbix-java-gateway
yum install -y zabbix-java-gateway
#2.启动
systemctl enable --now zabbix-java-gateway
###查看端口
ss -tulnp |grep 10052
#3.配置zabbix服务端(我的zabbix是编译安装,所以地址不一样)
grep -n 'Java.*=' /usr/local/zabbix/etc/zabbix_server.conf
362:JavaGateway=172.16.1.115 #指向JAVA gateway主机
370:JavaGatewayPort=10052 #指定端口,此为默认值,可不修改
378:StartJavaPollers=5 #指定开启的进程数,默认为0,即不开启,所以必须修改此行
#4.重启服务端
systemctl restart zabbix_server
#5.检查java poller进程

(3)添加主机关联模板
注意防火墙


jar包应用
带 JMX 远程监控配置的 Java 程序启动命令
shell
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=172.16.1.9 \
-jar xxx.jar
报错解决
cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found
其实在 z abbix web上是有 agent主机最新数据的,出现上面的问题是因为 web和agent配置的Hos tname对不上 ,但是agent主机是有配 server ip的,所以也可以请求到数据。处理也比较简单
两边改为一致的,方便记忆的名字 ,然后 重启agent服务 就行了


shell
[root@m03 ~]# tail -f /var/log/zabbix/zabbix_server.log
42983:20251201:210156.535 cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found
42984:20251201:210257.043 cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found
42983:20251201:210356.457 cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found
42980:20251201:210456.898 cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found
42983:20251201:210556.335 cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found
42984:20251201:210656.756 cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found
42984:20251201:210756.161 cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found
42980:20251201:210856.586 cannot send list of active checks to "10.0.0.1": host [DESKTOP-VL8O7G4] not found
43012:20251201:210918.965 Zabbix agent item "service.info["SamSs",state]" on host "windows" failed: first network error, wait for 15 seconds
43012:20251201:210933.965 resuming Zabbix agent checks on host "windows": connection restored