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
相关产品推荐
相关产品推荐

