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

运行时启用/禁用Java OpenTelemetry Agent自动插装,避免服务重部署

运行时控制OpenTelemetry Java Agent自动插装及修改Tracer的实现方法

一、运行时启停自动插装

OpenTelemetry Java Agent本身无直接开关,但可通过两种方式实现动态控制:

  • 自定义Agent扩展:实现TracerProviderBuilderCustomizer接口,通过动态配置源(环境变量、配置中心)控制Span采集逻辑。核心思路是根据开关状态,决定使用实际SpanProcessor还是空实现:

    public class DynamicTracingExtension implements TracerProviderBuilderCustomizer {
        @Override
        public void customize(TracerProviderBuilder tracerProviderBuilder) {
            // 从配置源读取开关,示例用环境变量
            boolean tracingEnabled = Boolean.parseBoolean(System.getenv("OTEL_TRACING_ENABLED"));
            if (!tracingEnabled) {
                tracerProviderBuilder.addSpanProcessor(SpanProcessor.noop());
            }
        }
    }
    

    打包扩展为jar后,启动Agent时通过otel.javaagent.extensions参数指定该jar。后续修改环境变量(或配置中心配置)即可生效,若用配置中心需额外添加配置变更监听逻辑。

  • JMX MBean动态控制:注册MBean暴露控制接口,允许运行时通过jconsole、jcmd等工具启停追踪:

    public interface TracingControlMBean {
        void setTracingEnabled(boolean enabled);
        boolean isTracingEnabled();
    }
    
    public class TracingControl implements TracingControlMBean {
        private volatile boolean enabled = true;
        private SpanProcessor originalProcessor;
        private final SdkTracerProvider sdkTracerProvider;
    
        public TracingControl(TracerProvider tracerProvider) {
            this.sdkTracerProvider = (SdkTracerProvider) tracerProvider;
            this.originalProcessor = sdkTracerProvider.getSpanProcessors().iterator().next();
        }
    
        @Override
        public void setTracingEnabled(boolean enabled) {
            this.enabled = enabled;
            sdkTracerProvider.removeSpanProcessor(enabled ? SpanProcessor.noop() : originalProcessor);
            sdkTracerProvider.addSpanProcessor(enabled ? originalProcessor : SpanProcessor.noop());
        }
    
        @Override
        public boolean isTracingEnabled() {
            return enabled;
        }
    }
    

    在Agent扩展中注册MBean后,即可远程连接JVM调用接口修改状态。

二、运行时修改Agent的Tracer

核心是获取Agent初始化的TracerProvider实例,再进行配置修改:

  • 通过扩展保存实例:在自定义扩展的customize方法中,保存构建后的TracerProvider供后续调用:

    public class TracerAccessorExtension implements TracerProviderBuilderCustomizer {
        private static volatile SdkTracerProvider tracerProvider;
    
        @Override
        public void customize(TracerProviderBuilder builder) {
            tracerProvider = (SdkTracerProvider) builder.build();
        }
    
        public static SdkTracerProvider getTracerProvider() {
            return tracerProvider;
        }
    }
    

    后续可通过静态方法获取实例,修改采样器、SpanProcessor等配置。

  • 全局实例直接获取:直接调用OpenTelemetry全局API获取Agent初始化的实例:

    TracerProvider globalProvider = OpenTelemetry.getGlobalTracerProvider();
    if (globalProvider instanceof SdkTracerProvider) {
        SdkTracerProvider sdkProvider = (SdkTracerProvider) globalProvider;
        // 动态修改采样器为从不采样
        sdkProvider.updateSampler(Sampler.never());
    }
    

    注意需转换为SdkTracerProvider才能调用更新方法,变更仅对后续创建的Span生效。

注意事项

  • 动态配置变更仅对新创建的Span生效,已生成的Span不受影响。
  • 自定义扩展需保证与Agent版本兼容,避免类加载冲突。
  • 远程控制MBean时,需配置JMX远程连接并做好安全防护。

内容的提问来源于stack exchange,提问作者Himanshu Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:35:12