我正在使用 SchedulingConfigurer 调度 spring 调度程序,如下所示。但是,每次调用“ProcessJob”方法时都不会创建新的 traceid。
即使下面的方法总是使用相同的 traceid 记录。
log.info("Performing task");
这里有什么问题?以及如何确保每次触发此作业时都有新的 traceid。
我什至尝试将“processJob”方法调用包装在 newSpan 中,如下所示:但没有运气。
修复 1:不工作:
private void setSchedule() {
future =
taskScheduler.schedule(
() -> {
Span newSpan = tracer.nextSpan().name("newSpan").start();
try (SpanInScope ws = tracer.withSpanInScope(newSpan.start())) {
log.info("Performing task");
taskManager.processJob();
} finally {
newSpan.finish();
}
},
dynamicTrigger);
}
需要修复的原始类:
public class SchedulerConfig
implements SchedulingConfigurer, ApplicationListener<RefreshScopeRefreshedEvent> {
private final DynamicTrigger dynamicTrigger;
private final TaskManager taskManager;
private TaskScheduler taskScheduler;
private ScheduledFuture<?> future;
@Bean(destroyMethod = "shutdown")
public ExecutorService taskExecutor() {
return Executors.newScheduledThreadPool(1);
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
taskScheduler = taskRegistrar.getScheduler();
setSchedule();
}
private void setSchedule() {
future =
taskScheduler.schedule(
() -> {z
log.info("Performing task");
taskManager.processJob();
},
dynamicTrigger);
}
@Override
public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
log.info("Rescheduling due to change in cron expression");
future.cancel(false);
setSchedule();
}
答案 0 :(得分:1)
您开始跨度的方式不是您想的方式(例如:您调用 start
两次)。请查看文档以了解如何正确操作:https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/htmlsingle/#using-creating-and-ending-spans
启动新跨度的最简单方法是在属于 Spring Bean 的方法上使用 @NewSpan
,请参阅文档:https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/htmlsingle/#using-annotations-new-spans
对于调度,我认为使用 @Scheduled
更简单,请参阅文档:https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/htmlsingle/#sleuth-async-scheduled-integration
这也由 Sleuth 开箱即用,因此您无需执行任何操作即可开始新的 Span
:
@Scheduled(fixedDelay = 1_000)
public void scheduled() {
log.info("Hey, look what I'm doing");
}
如果您不想使用 @Scheduled
,您可以使用 TraceableScheduledExecutorService
作为您的 ExecutorService
,文档:https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/htmlsingle/#sleuth-async-executor-service-integration