如何不使用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
相关产品推荐
相关产品推荐

