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

如何不使用AutoConfiguredOpenTelemetrySdk实现等效OpenTelemetry配置?

不使用AutoConfiguredOpenTelemetrySdk配置OpenTelemetry

需求:不使用AutoConfiguredOpenTelemetrySdk,实现以下代码的相同功能:

OpenTelemetry openTelemetry = AutoConfiguredOpenTelemetrySdk.builder()
                        .addPropertiesCustomizer(x -> telemetryProperties)
                        .addResourceCustomizer(this::customizeResource)
                        .setServiceClassLoader(Thread.currentThread().getContextClassLoader())
                        .setResultAsGlobal(false)
                        .registerShutdownHook(false)
                        .build()
                        .getOpenTelemetrySdk();

手动构建OpenTelemetrySdk的替代实现

你可以通过手动组装OpenTelemetry核心组件(TracerProvider、MeterProvider、LoggerProvider等)来复刻原代码的功能,具体实现如下:

import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.SdkTracerProviderConfigurer;
import io.opentelemetry.sdk.autoconfigure.SdkMeterProviderConfigurer;
import io.opentelemetry.sdk.autoconfigure.SdkLoggerProviderConfigurer;

// 1. 将自定义属性转换为OpenTelemetry标准配置格式
ConfigProperties config = ConfigProperties.create(telemetryProperties);

// 2. 构建并自定义Resource
Resource baseResource = Resource.getDefault();
Resource customizedResource = customizeResource(baseResource, config);

// 3. 构建TracerProvider并应用配置
SdkTracerProviderBuilder tracerBuilder = SdkTracerProvider.builder();
SdkTracerProviderConfigurer.create(config).configure(tracerBuilder);
tracerBuilder.setResource(customizedResource);
tracerBuilder.setServiceClassLoader(Thread.currentThread().getContextClassLoader());
SdkTracerProvider tracerProvider = tracerBuilder.build();

// 4. 构建MeterProvider并应用配置
SdkMeterProviderBuilder meterBuilder = SdkMeterProvider.builder();
SdkMeterProviderConfigurer.create(config).configure(meterBuilder);
meterBuilder.setResource(customizedResource);
meterBuilder.setServiceClassLoader(Thread.currentThread().getContextClassLoader());
SdkMeterProvider meterProvider = meterBuilder.build();

// 5. 构建LoggerProvider并应用配置
SdkLoggerProviderBuilder loggerBuilder = SdkLoggerProvider.builder();
SdkLoggerProviderConfigurer.create(config).configure(loggerBuilder);
loggerBuilder.setResource(customizedResource);
loggerBuilder.setServiceClassLoader(Thread.currentThread().getContextClassLoader());
SdkLoggerProvider loggerProvider = loggerBuilder.build();

// 6. 组装最终的OpenTelemetrySdk
OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder()
        .setTracerProvider(tracerProvider)
        .setMeterProvider(meterProvider)
        .setLoggerProvider(loggerProvider)
        .build();

关键细节对应说明

  • 配置属性复用:通过ConfigProperties将你的telemetryProperties转换为OpenTelemetry可识别的格式,再借助各组件的Configurer类将配置逻辑同步到构建器中
  • Resource自定义:和原代码逻辑一致,先获取默认Resource,再传入你的customizeResource方法做定制
  • 类加载器设置:为每个组件构建器指定相同的类加载器,对应原代码的setServiceClassLoader
  • 全局实例与关闭钩子:不调用buildAndRegisterGlobal()方法,就不会将实例设为全局;默认情况下不会自动注册关闭钩子,对应原代码的registerShutdownHook(false)

内容的提问来源于stack exchange,提问作者Dmitry Aleksandrov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:52:56