You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenTelemetry JavaAgent扩展中无法在@Advice.OnMethodEnter使用静态变量

解决OpenTelemetry JavaAgent扩展中静态变量的ClassNotFoundException问题

问题原因

OpenTelemetry JavaAgent基于ByteBuddy实现字节码增强,Advice类会被加载到目标应用的类加载器中。如果静态变量定义在Advice内部类里,目标类加载器会因无法加载外部Agent类(属于Agent专属类加载器)而抛出ClassNotFoundException,本质是类加载器隔离导致的访问限制。

解决方案

1. 将静态变量移到独立的共享类中

不要把静态变量放在Advice内部类里,单独创建一个全局静态持有者类,确保该类能被目标应用类加载器访问:

// 独立的静态变量持有者类
public class AgentStaticHolder {
    public static Integer CONST = 123;
}

修改Advice类引用该类的静态变量:

public static class MethodAdvice {
    @Advice.OnMethodEnter(suppress = Throwable.class)
    public static void onEnter() {
        try {
            System.out.println(AgentStaticHolder.CONST.toString());
        } catch (Throwable e) {
            System.out.println("ERROR: " + e.getCause().toString());
            throw new RuntimeException(e);
        }
    }
}

打包Agent时,确保AgentStaticHolder类被包含在Agent的classpath中,ByteBuddy会自动将其注入目标类加载器。

2. 显式指定类加载器加载静态变量类

如果需要保留原有类结构,可在Agent初始化阶段将静态变量类加载到Agent类加载器,再在Advice中通过上下文类加载器获取:

// Agent初始化代码(如AgentBuilder配置阶段)
Class.forName("com.yourpackage.AgentStaticHolder", true, AgentClassLoader.class.getClassLoader());

// 修改后的Advice类
public static class MethodAdvice {
    @Advice.OnMethodEnter(suppress = Throwable.class)
    public static void onEnter() {
        try {
            Class<?> holderClass = Class.forName(
                "com.yourpackage.AgentStaticHolder", 
                true, 
                Thread.currentThread().getContextClassLoader()
            );
            Integer constVal = (Integer) holderClass.getField("CONST").get(null);
            System.out.println(constVal.toString());
        } catch (Throwable e) {
            System.out.println("ERROR: " + e.getCause().toString());
            throw new RuntimeException(e);
        }
    }
}

3. 参考官方实现思路

OpenTelemetry官方扩展中,全局静态变量均放在独立顶级类中(如SpanContext、TraceFlags等工具类),避免内部类的类加载依赖;同时通过ByteBuddy的AgentBuilder配置,确保这些类被目标类加载器正确加载,实现跨类加载器的变量访问。

内容的提问来源于stack exchange,提问作者Valeriy K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:35:05