1、OpenTelemetry 字节码增强与 Redisson 3.5.0 不兼容导致的。
方案一:临时绕过(快速恢复服务)
-
在 JVM 启动参数中添加排除规则:
-Dotel.instrumentation.redisson.enabled=false这个参数会禁用 OpenTelemetry 对 Redisson 的自动埋点,避免字节码冲突。 -
检查依赖冲突:确认 pom.xml 中没有同时引入
opentelemetry-sdk和opentelemetry-agent相关的依赖,避免 SDK 和 Agent 双重增强导致字节码混乱。
方案二:升级兼容版本(推荐长期方案)
-
升级 Redisson 版本:建议升级到
3.17.x以上版本(OpenTelemetry 官方文档明确支持 Redisson 3.0+,但 3.17 以上修复了大量字节码兼容性问题):
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.25.0</version> <!-- 选择稳定版 -->
</dependency>
- 使用匹配的 OpenTelemetry Agent 版本:升级 Redisson 后,同步更新 OpenTelemetry Agent 到最新稳定版,确保两者的增强逻辑兼容。
2、OpenTelemetry Java Agent 对 Spring 定时任务(spring-scheduling)做字节码增强时,把类弄坏了 → JVM 直接拒绝加载类
这个 100% 是 OpenTelemetry Java Agent 字节码增强 Bug:
OpenTelemetry Agent 在动态修改 Spring 内部类 DelegatingErrorHandlingRunnable 的字节码时,破坏了 JVM 的构造器 + try 块的字节码校验规则,直接触发 JVM 类加载校验失败,Spring 容器还没启动完成就崩溃。
最快立刻修复(优先用这个,马上启动成功)
# 核心必加参数
-Dotel.instrumentation.spring-scheduling.enabled=false
加上pom.xml引入下面的,解决成功
<!-- OpenTelemetry API -->
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.24.0</version>
</dependency>
<!-- OpenTelemetry 注解支持 -->
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-annotations</artifactId>
<version>1.24.0</version>
</dependency>
</dependencies>
永久根治方案(长期稳定)
2.1、降级 / 锁定 OpenTelemetry Agent 稳定版本,最新版 Agent 反而有兼容性问题,建议降级到 1.32.0(兼容性最好,无该 VerifyError)
# 下载稳定版Agent
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.32.0/opentelemetry-javaagent.jar
2.2、不要同时混合「Agent + SDK 注解」
- 只用 Agent 零代码埋点,就移除所有手动 opentelemetry-sdk、api 依赖
- 只用代码注解埋点,就完全去掉
-javaagent参数二者绝对不能混用,会双重字节码增强,必出 VerifyError
2.3、版本匹配检查
- Spring Boot 2.x → 推荐 OTel Agent 1.29~1.35
- Spring Boot 3.x → 推荐 OTel Agent 2.x+
- JDK 8 避免使用最新 2.x 系列 Agent,兼容性极差
3、OpenTelemetry Java Agent 的配置必须在 JVM 启动参数中提供,它不会读取 Spring Boot 的配置中心(Nacos/Apollo 等),因为:
- Agent 在 Spring Boot 之前加载:Agent 通过
-javaagent参数在 JVM 启动时加载,此时 Spring 容器还未初始化 - 配置中心是应用层:Nacos/Apollo 等配置中心由 Spring Cloud 在应用启动后才加载
解决方案
方案一:通过 JVM 启动参数传入(推荐)
将 Agent 配置转换为系统属性,通过启动参数传入: