前言

在Java企业级应用架构中,Tomcat作为主流Servlet容器承载着大量Web应用,而基于Spring Boot等框架构建的Java微服务则逐渐成为新一代应用部署的主流形态。对这两类Java应用进行有效的性能监控,是保障业务系统稳定运行的关键。

Zabbix提供了完善的Java监控方案:通过Java Gateway + JMX协议实现对Tomcat的监控,通过自定义脚本 + Zabbix Sender实现对微服务的自动发现与监控。本文将分别详细介绍这两种监控方案的完整部署流程。

一、实验环境说明

组件配置
Tomcat服务器麒麟V10(IP: 192.168.38.33)
微服务服务器麒麟V10(IP: 192.168.38.34)
Zabbix Server192.168.38.30
Zabbix Java Gateway已部署,端口10052
Tomcat JMX端口12345
Java版本OpenJDK 11

二、整体架构与数据流程

Zabbix监控Java应用的整体数据流程如下:

核心组件说明:

组件作用端口
Zabbix Java Gateway充当Zabbix Server与Java应用之间的桥梁10052
Java PollerZabbix Server端的采集进程,连接Java Gateway-
JMX AgentJava应用端暴露的管理接口12345(可配置)

当Zabbix Server需要获取Java应用的性能指标时,会启动Java Poller进程连接Java Gateway,Java Gateway再通过JMX管理API向Java应用程序发起查询。Java应用程序需在启动时开启JMX远程访问功能,并暴露一个固定端口供Java Gateway连接。

img

三、监控Tomcat应用

3.1 配置Tomcat JMX远程访问

在需要监控的Tomcat服务器上,编辑Tomcat启动脚本 catalina.sh,在文件开头或JAVA_OPTS配置区域加入以下JMX参数:

CATALINA_OPTS="-server \
    -Xms256m \
    -Xmx512m \
    -XX:PermSize=64M \
    -XX:MaxPermSize=128m \
    -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Djava.rmi.server.hostname=192.168.38.33 \
    -Dcom.sun.management.jmxremote.port=12345 \
    -Dcom.sun.management.jmxremote.rmi.port=12345"

⚠️ 关键配置说明:

参数说明注意事项
-Dcom.sun.management.jmxremote开启JMX远程管理功能必选
-Dcom.sun.management.jmxremote.port=12345指定JMX监听端口需确保端口未被占用
-Djava.rmi.server.hostname=192.168.38.33指定服务器IP必配! 否则会导致RMI连接失败
-Dcom.sun.management.jmxremote.authenticate=false关闭认证(测试环境)生产环境建议启用认证
-Dcom.sun.management.jmxremote.ssl=false关闭SSL(测试环境)生产环境建议启用SSL

生产环境安全建议:

# 启用认证和SSL的配置示例
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=true
-Dcom.sun.management.jmxremote.password.file=/etc/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=/etc/jmxremote.access

配置完成后,启动Tomcat服务:

[root@tomcat-server ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar
Tomcat started.

3.2 验证JMX端口是否正常监听

[root@tomcat-server ~]# netstat -tlnp | grep 12345
tcp6       0      0 :::12345                :::*                    LISTEN      12345/java

3.3 部署Zabbix Java Gateway

Zabbix Java Gateway是Zabbix官方提供的Java应用数据采集中间件,监听10052端口。

验证Java Gateway是否正常运行:

[root@zabbix-server ~]# netstat -tlnp | grep 10052
tcp6       0      0 :::10052                :::*                    LISTEN      1234/java

3.4 配置Zabbix Server连接Java Gateway

修改Zabbix Server配置文件(容器部署已预配置),主要参数如下:

# /etc/zabbix/zabbix_server.conf

# Java Gateway地址
JavaGateway=192.168.38.30

# Java Gateway端口
JavaGatewayPort=10052

# Java Poller进程数量(根据监控的Java应用数量调整)
StartJavaPollers=5

配置完成后重启Zabbix Server:

[root@zabbix-server ~]# systemctl restart zabbix-server

3.5 Zabbix Web端配置JMX监控

3.5.1 为主机添加JMX接口
  1. 登录Zabbix Web管理界面

  2. 进入 数据采集(Data collection) → 主机(Hosts)

  3. 选择Tomcat目标主机(192.168.38.33)

  4. 切换到 接口(Interfaces) 区域,点击 添加(Add)

  5. 接口类型选择 JMX

  6. 填写IP地址:192.168.38.33,端口:12345

如下图所示:

微信截图_20230509134300

3.5.2 链接监控模板
  1. 进入主机详情页,切换到 模板(Templates) 选项卡

  2. 点击 链接新模板(Link new templates)

  3. 搜索并勾选以下两个模板:

    • Apache Tomcat by JMX —— Tomcat专用监控模板

    • Generic Java JMX —— Java通用JMX监控模板

  4. 点击 更新(Update) 保存配置

如下图所示:

微信截图_20230509134711

3.6 Tomcat监控指标解读

链接模板后,Zabbix会自动采集以下核心指标:

监控类别监控项说明监控意义
堆内存Heap Memory UsageJVM堆内存使用量⚠️ 核心指标,接近上限需扩容
非堆内存Non-Heap Memory Usage方法区/元空间使用量监控类加载情况
线程数Thread Count当前活动线程数监控线程泄漏风险
类加载Loaded Class Count已加载类数量监控类加载器状态
GC次数GC Collection CountGC发生次数评估GC频率是否合理
GC时间GC Collection TimeGC总耗时⚠️ 长时间GC需排查
会话数Active Sessions活跃Session数量监控用户在线情况
请求处理Request Processing Time请求处理耗时反映应用响应性能
连接器状态Connector Status连接器线程池状态监控连接处理能力

四、监控Java微服务

4.1 微服务监控面临的挑战

微服务架构具有以下特点,给传统监控带来挑战:

特点监控挑战
每个微服务以 java -jar service.jar 方式独立运行不依赖Tomcat,无法通过Tomcat模板监控
每台服务器上的微服务数量不固定手工添加/删除主机配置非常繁琐
微服务端口动态分配端口管理混乱,难以静态配置

解决方案:采用 自动发现(Discovery) + Zabbix Sender 的方式实现动态监控。

4.2 整体监控架构

4.3 安装必要工具

4.3.1 安装JDK开发工具(提供jstat、jps)
[root@ms-server ~]# yum install -y java-11-openjdk-devel

验证工具是否可用:

[root@ms-server ~]# jps -l
12345 /opt/services/user-service.jar
12346 /opt/services/order-service.jar
12347 /opt/services/payment-service.jar
4.3.2 安装Zabbix Sender工具

从Zabbix官方仓库下载并安装zabbix-sender:

[root@ms-server ~]# cd /tmp
[root@ms-server tmp]# wget http://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-sender-6.4.2-release2.el9.x86_64.rpm
[root@ms-server tmp]# rpm -ivh zabbix-sender-6.4.2-release2.el9.x86_64.rpm

验证安装:

[root@ms-server ~]# zabbix_sender --version
zabbix_sender (Zabbix) 6.4.2

4.4 自定义监控脚本

4.4.1 脚本功能介绍

本文使用 jstat.py 脚本实现对微服务的全面监控。脚本主要功能:

参数功能输出
--jvmname获取当前所有运行中的JVM进程名称进程列表(JSON格式)
--jvmport获取JVM进程端口信息端口列表(JSON格式)
--data采集所有JVM性能指标并通过zabbix_sender发送发送状态

脚本内容较长,请从课程附件中获取完整文件,或联系作者获取。

4.4.2 部署监控脚本

创建脚本目录并上传脚本:

[root@ms-server ~]# mkdir -p /etc/zabbix/scripts/java
[root@ms-server ~]# cp jstat.py /etc/zabbix/scripts/java/
[root@ms-server ~]# chmod +x /etc/zabbix/scripts/java/jstat.py
[root@ms-server ~]# chown -R zabbix:zabbix /etc/zabbix/scripts/

验证脚本是否可用:

[root@ms-server ~]# python /etc/zabbix/scripts/java/jstat.py --jvmname
["user-service","order-service","payment-service"]

[root@ms-server ~]# python /etc/zabbix/scripts/java/jstat.py --data
Sending data to Zabbix Server: 192.168.38.30
Data sent successfully: 45 items

4.5 配置Zabbix Agent 2

4.5.1 创建自定义监控项配置文件

在 /etc/zabbix/zabbix_agent2.d/ 目录下创建 userparameter_java_discovery.conf 文件:

# 获取JVM进程名称列表(用于自动发现)
UserParameter=jvmname, sudo /usr/bin/python /etc/zabbix/scripts/java/jstat.py --jvmname

# 获取并发送JVM性能数据
UserParameter=jvmdata, sudo /usr/bin/python /etc/zabbix/scripts/java/jstat.py --data
4.5.2 配置Zabbix用户sudo权限

脚本需要以zabbix用户身份执行,但需要获取系统中所有Java进程信息,因此必须配置sudo权限:

[root@ms-server ~]# visudo

在文件末尾添加以下内容:

zabbix ALL=(ALL) NOPASSWD: ALL

安全建议:如果希望权限最小化,可精确限制命令:

zabbix ALL=(ALL) NOPASSWD: /usr/bin/python /etc/zabbix/scripts/java/jstat.py
4.5.3 确认Agent配置

确保 /etc/zabbix/zabbix_agent2.conf 中以下配置正确:

PidFile=/var/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=192.168.38.30
ServerActive=192.168.38.30
Hostname=192.168.38.34
Include=/etc/zabbix/zabbix_agent2.d/*.conf
4.5.4 重启Agent服务
[root@ms-server ~]# systemctl restart zabbix-agent2
[root@ms-server ~]# systemctl status zabbix-agent2
● zabbix-agent2.service - Zabbix Agent 2
   Loaded: loaded (/usr/lib/systemd/system/zabbix-agent2.service; enabled)
   Active: active (running) since ...

4.6 导入微服务监控模板

4.6.1 模板功能说明

自定义模板 Template Jvm Process Discovery.xml 的核心功能:

功能模块说明
自动发现规则自动发现服务器上所有JVM进程
监控原型为每个发现的JVM自动创建CPU、内存、GC等监控项
触发器原型自动生成内存溢出、GC频繁等告警规则
图形原型自动生成JVM性能趋势图
4.6.2 导入模板
  1. 登录Zabbix Web管理界面

  2. 进入 数据采集(Data collection) → 模板(Templates)

  3. 点击右上角 导入(Import) 按钮

  4. 选择模板文件 Template Jvm Process Discovery.xml

  5. 确保所有规则选项均已勾选

  6. 点击 导入(Import) 完成操作如下图所示:

如下图所示:

微信截图_20230509142812

4.7 链接模板到主机

  1. 进入 数据采集(Data collection) → 主机(Hosts)

  2. 选择微服务目标主机(192.168.38.34)

  3. 切换到 模板(Templates) 选项卡

  4. 点击 链接新模板(Link new templates)

  5. 搜索并选择 Template Jvm Process Discovery

  6. 点击 更新(Update) 保存配置

如下图所示:

微信截图_20230509143211

4.8 验证监控数据

4.8.1 检查自动发现结果
  1. 进入 数据采集(Data collection) → 主机(Hosts)

  2. 选择微服务主机,点击 自动发现(Discovery)

  3. 查看是否自动发现了所有JVM进程

4.8.2 检查性能数据
  1. 进入 监控(Monitoring) → 最新数据(Latest data)

  2. 筛选主机 192.168.38.34

  3. 查看是否有各微服务的CPU、内存、GC等监控数据

4.8.3 命令行验证
# 测试JVM自动发现
zabbix_get -s 192.168.38.34 -k "jvmname"

# 测试数据采集与发送
zabbix_get -s 192.168.38.34 -k "jvmdata"

五、监控指标详解

5.1 微服务核心监控指标

指标类别指标项采集方式告警意义
堆内存使用Heap Usedjstat⚠️ 接近-Xmx需扩容
堆内存使用率Heap Usage %计算⚠️ 持续>80%需关注
GC次数GC Countjstat频繁GC表示内存压力大
GC时间GC Timejstat⚠️ 耗时长影响响应速度
线程数Thread Countjstat异常增长可能有线程泄漏
类加载数Loaded Classesjstat异常增长可能热部署问题
CPU使用率CPU Usagejstat⚠️ 持续高位需排查代码
进程存活Process Alive检测立即告警

5.2 常见触发条件配置

# 建议的触发条件示例
- JVM堆内存使用率 > 90%: 严重告警
- JVM堆内存使用率 > 80%: 警告告警
- Full GC频率 > 5次/10分钟: 严重告警
- GC总时间 > 1000ms/分钟: 警告告警
- JVM进程消失: 灾难告警
- CPU使用率 > 200%: 警告告警(多核)

六、常见问题排查

6.1 Tomcat监控常见问题

问题现象排查步骤
JMX端口未监听检查catalina.sh配置是否正确,查看Tomcat启动日志
Java Gateway连接失败检查Zabbix Server的JavaGateway配置,确认10052端口连通性
监控数据为空检查Java Poller进程是否启动:ps aux | grep java_poller
RMI连接超时确认-Djava.rmi.server.hostname配置了正确的IP地址

快速诊断命令:

# 检查Java Poller日志
tail -f /var/log/zabbix/zabbix_server.log | grep -i java

# 检查JMX连接是否可用
jconsole 192.168.38.33:12345

6.2 微服务监控常见问题

问题现象排查步骤
无JVM发现数据检查jps命令是否可用:which jps
脚本执行失败手动执行脚本查看报错:python /etc/zabbix/scripts/java/jstat.py --jvmname
权限被拒绝检查sudo配置是否正确:sudo -u zabbix jps
数据未发送到Server检查zabbix_sender是否安装,Server地址配置是否正确

日志排查:

# 查看Agent日志
tail -f /var/log/zabbix/zabbix_agent2.log

# 查看脚本执行日志(如果脚本中有日志输出)
tail -f /var/log/zabbix/zabbix_java.log

七、性能优化建议

7.1 Tomcat JVM参数优化

# 生产环境推荐配置
CATALINA_OPTS="-server \
    -Xms2048m -Xmx2048m \
    -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m \
    -XX:+UseG1GC \
    -XX:MaxGCPauseMillis=200 \
    -XX:G1ReservePercent=25 \
    -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.authenticate=true \
    -Dcom.sun.management.jmxremote.ssl=true \
    -Dcom.sun.management.jmxremote.port=12345 \
    -Djava.rmi.server.hostname=192.168.38.33"

7.2 微服务JVM参数优化

# 微服务启动参数示例
java -server \
    -Xms512m -Xmx512m \
    -XX:+UseG1GC \
    -XX:MaxGCPauseMillis=200 \
    -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=0 \
    -jar /opt/services/user-service.jar

7.3 Zabbix Poller性能优化

参数建议值说明
StartJavaPollers5-20根据Java应用数量调整
JavaGateway配置内网IP避免跨网段延迟
采集间隔60s避免过于频繁采集影响JVM性能

八、总结

本文详细介绍了两种Java应用监控方案:

Tomcat监控(JMX方案):

  • 通过配置JMX参数暴露管理接口

  • 利用Zabbix Java Gateway进行数据采集

  • 使用官方模板实现标准化监控

微服务监控(自动发现方案):

  • 通过jstat脚本采集JVM性能数据

  • 利用自动发现规则动态识别微服务进程

  • 通过Zabbix Sender主动上报数据

  • 实现灵活增减微服务无需手工维护

两种方案相互补充,共同构建了完整的Java应用监控体系。在实际生产环境中,建议结合业务特点选择适合的方案,并配置合理的告警规则,实现对Java应用的主动运维。


📌 相关文章推荐

  • 《Zabbix监控MySQL与Redis应用实践》

  • 《Zabbix监控Nginx+PHP-FPM应用实践》

  • 《Zabbix监控Apache与Nginx应用实践》

如需要脚本和模板文件,请在评论区留言或私信联系。感谢阅读!

原创文章,转载请注明出处。

更多推荐