Spring sleuth 没有在 spring 调度程序中创建新的 traceid

时间:2021-02-26 09:42:27

标签: java spring-boot spring-cloud-sleuth spring-scheduled

我正在使用 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();
  }

1 个答案:

答案 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