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

Spring Boot 3.4.2中@Scheduled与OpenTelemetry重复Trace ID问题及配置建议

解决Spring Boot @Scheduled定时任务与OpenTelemetry复用Trace ID的问题

问题背景

使用Spring Boot 3.4.2集成io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter,通过以下BOM管理版本:

mavenBom("io.opentelemetry:opentelemetry-bom:1.46.0")
mavenBom("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:2.12.0-alpha")

当执行@Scheduled定时任务时:

@Scheduled(fixedRate = 10000)
public void callHero() {
    log.info("{}","hello");
}

发现每次任务执行复用同一个Trace ID,日志示例:

2025-02-03T19:48:43.423-06:00  INFO 43618 --- [a-otel] [   scheduling-1] [9252d302d75e48b8e25af53b6621647d-2916ce0fa2e97ab2]
2025-02-03T19:48:53.244-06:00  INFO 43618 --- [a-otel] [   scheduling-1] [9252d302d75e48b8e25af53b6621647d-d0b5bf23d13fd026]

原因分析

OpenTelemetry的Spring调度器 instrumentation默认会复用线程上下文的Trace信息,而定时任务线程池的线程是复用的,导致每次任务执行时继承了线程中残留的Trace ID,无法生成新的Trace。

配置解决方案

1. 启用定时任务Trace重置配置

在application.properties中添加:

opentelemetry.instrumentation.spring-scheduling.reset-trace-on-task-execution=true

或application.yml中配置:

opentelemetry:
  instrumentation:
    spring-scheduling:
      reset-trace-on-task-execution: true

该配置会强制每次定时任务执行前重置线程的Trace上下文,生成全新的Trace ID。

2. 验证版本兼容性

当前使用的opentelemetry-instrumentation-bom-alpha:2.12.0-alpha已经支持上述配置项,无需调整版本。

3. 手动创建Trace(备选方案)

如果配置方式不生效,可以在定时任务方法中手动初始化新的Trace:

import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Scope;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
public class ScheduledTask {
    private static final Logger log = LoggerFactory.getLogger(ScheduledTask.class);
    private final Tracer tracer;

    public ScheduledTask(Tracer tracer) {
        this.tracer = tracer;
    }

    @Scheduled(fixedRate = 10000)
    public void callHero() {
        var span = tracer.spanBuilder("callHero-scheduled").startSpan();
        try (Scope scope = span.makeCurrent()) {
            log.info("hello");
        } finally {
            span.end();
        }
    }
}

通过手动创建Span并绑定到当前上下文,确保每次任务生成独立的Trace。

验证效果

重启应用后查看日志,每次定时任务的Trace ID应各不相同,示例:

2025-02-03T20:00:00.123-06:00  INFO 12345 --- [scheduling-1] [abc1234567890-def1234567890] hello
2025-02-03T20:00:10.456-06:00  INFO 12345 --- [scheduling-1] [ghi0987654321-jkl0987654321] hello

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:55:12