背景:
在分布式系统架构中,全链路监控是定位性能瓶颈、排查系统问题的核心手段。Apache SkyWalking 作为开源 APM(应用性能监控)工具,凭借其无侵入式采集、丰富的插件生态和强大的可视化能力,成为企业级监控方案的首选。本文基于 Struts2+Spring+Hibernate 技术栈,详细讲解 Webfunny Apm如何用SkyWalking Java Agent 来集成配置、验证流程及常见问题解决方案,帮助开发者快速落地全链路监控。
一、项目技术栈说明
本次实战基于以下技术栈构建,确保方案的通用性和可复用性:
|
层级 |
技术 |
版本 |
用途 |
|
Web 框架 |
Apache Struts2 |
6.3.0.2 |
MVC 控制器层,处理 HTTP 请求 |
|
IoC 容器 |
Spring Framework |
5.3.27 |
依赖注入、事务管理、Bean 管理 |
|
ORM 框架 |
Hibernate |
5.6.15.Final |
数据持久化,简化数据库操作 |
|
数据库 |
H2 Database |
2.2.224 |
内存数据库(开发 / 测试环境) |
|
构建工具 |
Maven |
3.8+ |
项目构建、依赖管理、插件集成 |
|
JDK 版本 |
Java |
11 |
运行环境(兼容 8+) |
|
APM 探针 |
SkyWalking Java Agent |
9.5.0 |
无侵入式全链路数据采集 |
二、SkyWalking 集成架构与原理
2.1 集成架构图
SkyWalking 采用「Agent 采集 + OAP 分析 + UI 展示」的经典架构,本次集成无需修改业务代码,通过 Agent 自动插桩实现数据采集:
2.2 自动采集的核心组件
SkyWalking Agent 内置丰富插件,针对本次技术栈自动采集以下关键数据,无需手动埋点:
|
组件类型 |
采集内容 |
依赖插件 |
|
HTTP Server (Jetty) |
请求方法、URL、状态码、响应时间、请求参数 |
apm-jetty-server |
|
Struts2 Action |
Action 类名、方法名、执行耗时、异常信息 |
apm-struts2-2.x-plugin |
|
Spring 组件 |
Bean 方法调用链路、参数、返回值、执行时间 |
apm-spring-core、apm-spring-transaction |
|
Hibernate |
SQL 语句、执行时间、表名、参数绑定 |
apm-hibernate |
|
JDBC 操作 |
数据库连接池状态、SQL 执行耗时、结果集大小 |
apm-jdbc |
三、环境配置(推荐配置文件方式)
为了便于多环境复用和配置管理,推荐采用「独立配置文件 + 启动脚本」的方式集成,避免硬编码导致的维护成本。
3.1 配置文件编写(skywalking.properties)
在项目根目录创建 skywalking.properties 文件,集中管理 Agent 配置:
3.2 启动脚本编写(start-with-skywalking.sh)
创建启动脚本,通过 source 加载配置文件,避免重复配置:
3.3 核心配置参数说明
|
参数 |
作用 |
注意事项 |
|
SW_AGENT_NAME |
定义服务在 Webfunny Apm中的唯一标识 |
多项目部署时名称不可重复 |
|
SW_AGENT_COLLECTOR_BACKEND_SERVICES |
指定 Webfunny Apm 上报地址和端口 |
确保网络可达(防火墙 / 安全组放行端口) |
|
SW_AGENT_PROTOCOL |
通信协议选择 |
生产环境优先 grpc(性能优化更好) |
|
SW_AGENT_SAMPLE_N_PER_3_SECS |
采样率控制 |
高流量场景建议设置为 100-500,避免数据量过大 |
|
SW_AGENT_JDBC_TRACE_SQL_PARAMETERS |
开启 SQL 参数追踪 |
生产环境可关闭,避免敏感数据泄露 |
3.4 脚本权限配置
给启动脚本添加执行权限(Linux/Mac 环境):
四、常见问题与解决方案(实战踩坑)
集成过程中难免遇到各类问题,以下是本次实战中遇到的高频问题及根治方案,覆盖配置、网络、版本等核心场景。
4.1 插件未加载导致无链路数据(最常见)
问题现象
- 应用正常启动,但 Webfunny Apm 中看不到任何 Trace 数据
- Agent 日志显示:no plugin files (skywalking-plugin.def) found
- 仅能看到 JVM 指标,无业务链路数据
错误日志
根因分析
错误配置了 SW_AGENT_PLUGIN_MOUNT=true,该参数会覆盖 Agent 默认的插件加载路径(plugins 和 activations 目录),导致所有业务插件未加载。
解决方案
删除或注释掉配置文件中的 SW_AGENT_PLUGIN_MOUNT=true 配置,使用 Agent 默认插件路径:
验证方法
启动日志中出现以下信息,说明插件加载成功:
4.2 版本不兼容导致 gRPC 接口未实现
问题现象
日志中频繁出现 UNIMPLEMENTED 错误:
根因分析
SkyWalking Agent 与 OAP Server 版本不匹配,gRPC 协议不兼容(如 6.x Agent 对接 8.x+ OAP,或 9.x Agent 对接 7.x OAP)。
解决方案
- 确认 OAP Server 版本(通过 UI 或运维查询)
- 下载对应版本的 Agent(推荐 Agent 与 OAP 版本一致或相差不超过 1 个大版本)
- 本次实战使用 Agent 9.5.0,建议 OAP Server 版本为 9.x
4.3 端口冲突导致启动失败
问题现象
根因分析
pom.xml 中 Jetty 端口硬编码为 8080,但启动脚本指定为 9080,端口不一致导致冲突。
解决方案
修改 pom.xml 中的 Jetty 插件配置,保持端口一致:
4.4 部分高级功能不支持(可忽略)
问题现象
日志中出现 UNIMPLEMENTED 错误,但不影响基础链路追踪:
根因分析
OAP Server 未启用动态配置、Profiling 等高级功能模块,Agent 上报相关数据时被拒绝。
影响范围
- ✅ 正常工作:基础链路追踪、服务拓扑、JVM 指标、SQL 监控
- ❌ 受影响:动态配置、性能分析、事件上报等高级功能
解决方案
无需处理,基础监控功能不受影响,若需使用高级功能,需在 OAP 中启用对应模块。
4.5 网络不通导致数据上报失败
问题现象
Agent 日志显示连接超时,UI 无数据:
根因分析
- OAP Server 端口未对外开放(防火墙 / 安全组未放行)
- 网络不可达(如跨网段、VPN 未连接)
- OAP Server 未启动
解决方案
- 本地 telnet 验证端口可达:telent xxx.webfunny.cn 9018
- 让运维放行对应端口(gRPC 协议默认 11800,自定义端口需单独配置)
- 确认 OAP Server 正常运行
五、集成验证流程
集成完成后,通过以下步骤验证监控是否生效,确保全链路数据正常采集。
5.1 本地验证步骤
- 启动应用
- 发送测试请求
调用业务接口,触发链路数据采集:
- 检查 Agent 日志
查看链路数据上报情况:
正常输出(表示数据已上报):
- 查看 Webfunny Apm里面的「链路追踪」「服务拓扑」「SQL 监控」等模块,确认数据正常显示
5.2 日志关键词快速排查
通过 Agent 日志关键词快速判断集成状态:
|
关键词 |
含义 |
正常表现 |
|
PluginResourcesResolver |
插件发现 |
找到 Struts2、JDBC 等插件的配置文件 |
|
PluginBootstrap |
插件加载 |
加载各类插件的 Instrumentation 类 |
|
TraceSegmentService |
链路数据上报 |
显示 X trace segments have been sent |
|
JVMMetricReportService |
JVM 指标上报 |
显示 grpc-status: 0(0 表示成功) |
|
gRPC Reporter |
通信状态 |
无连接超时、拒绝等错误 |
六、生产环境注意事项
- 配置优化
-
- 日志级别调整为 INFO 或 WARN,避免 DEBUG 日志占用过多磁盘
-
- 采样率根据流量调整(如每秒 100 条请求,设置 SW_AGENT_SAMPLE_N_PER_3_SECS=300)
-
- 关闭敏感数据采集(如 SW_AGENT_JDBC_TRACE_SQL_PARAMETERS=false)
- 版本管理
-
- 保持 Agent 与 OAP Server 版本一致,避免协议不兼容问题
-
- 定期更新 Agent 版本,修复已知漏洞和性能问题
- 网络稳定性
-
- 生产环境建议 Agent 与 OAP Server 部署在同一网段,降低网络延迟
-
- 启用 gRPC 协议的重连机制(Agent 内置,无需额外配置)
- 资源监控
-
- 监控 Agent 占用的 CPU / 内存(通常较低,约 1-5% 开销)
-
- 定期清理 Agent 日志,避免磁盘占满
七、总结
本文基于 Struts2+Spring+Hibernate 技术栈,详细讲解了 SkyWalking Java Agent 的无侵入式集成方案,核心亮点如下:
- 配置集中化:通过独立配置文件管理 Agent 参数,支持多环境复用,降低维护成本;
- 问题全覆盖:针对插件加载、版本兼容、端口冲突等高频问题,提供可直接落地的解决方案;
- 验证流程化:通过「启动 → 请求 → 日志 → UI」四步验证,确保集成生效;
- 生产可用:提供生产环境优化建议,兼顾监控效果和系统性能。
Webfunny Apm作为一款成熟的 APM 工具,能够帮助团队快速定位分布式系统中的性能瓶颈和异常问题,建议在生产环境中全面推广。如果在集成过程中遇到其他问题.