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

使用OpenTelemetrySdk推送日志至OTEL Collector遇类缺失问题求助

问题根源

你遇到的NoClassDefFoundError本质是OpenTelemetry组件版本碎片化导致的兼容性问题:

  • 混合使用了多个不同版本的OTEL核心依赖(如opentelemetry-exporter-otlp-http-logs v1.14.0-alpha、opentelemetry-exporter-common v1.32.0、opentelemetry-exporter-sender-okhttp v1.37.0),这些版本的内部API结构不一致,OtlpHttpLogRecordExporterBuilder依赖的OkHttpExporterBuilder在高版本的exporter-common中已发生结构变更,旧版本的exporter-otlp-http-logs无法找到该类。
  • 冗余的依赖声明(同时引入opentelemetry-exporter-otlp-logs和opentelemetry-exporter-otlp-http-logs)进一步加剧了版本冲突。

解决方案

1. 用OpenTelemetry BOM统一管理依赖版本

通过Maven的dependencyManagement引入OTEL BOM,强制所有相关组件使用同一兼容版本,彻底避免版本不兼容问题。

2. 精简依赖,移除冗余声明

只保留必要的核心依赖,移除重复或不必要的exporter、sender依赖(BOM会自动管理传递依赖)。

3. 修正OTLP端点配置

注意:OTEL Collector默认HTTP端口是4318,4317是gRPC端口,你的代码使用HTTP exporter,需修正端点端口。

修正后的配置示例

pom.xml(核心调整)

<dependencyManagement>
    <dependencies>
        <!-- 引入OpenTelemetry BOM,统一所有核心组件版本 -->
        <dependency>
            <groupId>io.opentelemetry</groupId>
            <artifactId>opentelemetry-bom</artifactId>
            <version>1.37.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 引入Instrumentation BOM,管理logback appender等工具版本 -->
        <dependency>
            <groupId>io.opentelemetry.instrumentation</groupId>
            <artifactId>opentelemetry-instrumentation-bom</artifactId>
            <version>2.3.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- OpenTelemetry SDK核心 -->
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk</artifactId>
    </dependency>
    <!-- OpenTelemetry Logback Appender -->
    <dependency>
        <groupId>io.opentelemetry.instrumentation</groupId>
        <artifactId>opentelemetry-logback-appender-1.0</artifactId>
    </dependency>
    <!-- OTLP Logs Exporter(包含HTTP和gRPC实现,由BOM统一版本) -->
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-otlp-logs</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

Java配置类(修正端点)

@Configuration
public class OpenTelemetryLogConfiguration {

    @Bean
    public OpenTelemetrySdk initializeOpenTelemetryConfig() {
        // 修正HTTP端点端口为4318(若Collector自定义了HTTP端口则调整为对应值)
        OtlpHttpLogRecordExporter exporter = OtlpHttpLogRecordExporter.builder()
                .setEndpoint("http://10.20.36.68:4318/v1/logs")
                .build();

        BatchLogRecordProcessor processor = BatchLogRecordProcessor.builder(exporter)
                .build();

        SdkLoggerProvider loggerProvider = SdkLoggerProvider.builder()
                .addLogRecordProcessor(processor)
                .build();

        OpenTelemetrySdk sdk = OpenTelemetrySdk.builder()
                .setLoggerProvider(loggerProvider)
                .build();

        Runtime.getRuntime().addShutdownHook(new Thread(sdk::close));
        io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender.install(sdk);
        return sdk;
    }
}

logback-spring.xml(保持原配置,需添加appender引用)

<appender name="OpenTelemetry"
          class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
    <captureExperimentalAttributes>false</captureExperimentalAttributes>
    <captureCodeAttributes>true</captureCodeAttributes>
    <captureMarkerAttribute>true</captureMarkerAttribute>
    <captureKeyValuePairAttributes>true</captureKeyValuePairAttributes>
    <captureLoggerContext>true</captureLoggerContext>
    <captureMdcAttributes>*</captureMdcAttributes>
</appender>

<!-- 必须将OpenTelemetry appender关联到日志输出节点 -->
<root level="info">
    <appender-ref ref="OpenTelemetry"/>
</root>

关键说明

  • BOM的作用:OTEL BOM会自动确保所有核心组件(SDK、exporter、instrumentation)使用兼容版本,无需手动指定每个依赖的版本号。
  • 依赖精简:opentelemetry-exporter-otlp-logs已包含HTTP和gRPC两种exporter实现,无需单独引入opentelemetry-exporter-otlp-http-logs;sender依赖会通过exporter自动传递,无需单独声明。
  • 端口验证:若你的OTEL Collector确实配置为HTTP端口4317,可忽略端口调整,但默认情况下4317是gRPC端口,HTTP请求会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:45:04