Micrometer / Spring Boot 3+ / While 方法是 @ASYNC 无法在日志级别进行跟踪

问题描述 投票:0回答:1

我有一个项目正在通过kafka发送获取事件,我注意到当我开始在EndPoints或任何其他事件生成器方法上使用@Async时。看不到千分尺跟踪日志。您对此有任何解决方案或建议吗?

private final KafkaTemplate<String, Object> kafkaTemplate;
private final KafkaProperties kafkaProperties;

@Async//PROBLEM CHILD.....
public void sendResetPasswordEmail(ResetPasswordEmailEvent resetPasswordEmailEvent) {   
kafkaTemplate.send(kafkaProperties.getTopic().getResetPasswordEmail(),resetPasswordEmailEvent);

    log.info("Reset password email sent: {} ", resetPasswordEmailEvent.toString());
}

我的 kafkaTemplate 配置就在下面

@RequiredArgsConstructor
@Configuration
public class ProducerConfiguration {

    private final KafkaProperties kafkaProperties;

    @Bean
    public ProducerFactory<String, Object> producerFactory() {
        Map<String, Object> configProps = new HashMap<>();
        configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaProperties.getAddress());
        configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
        configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
        
        return new DefaultKafkaProducerFactory<>(configProps);
    }

    @Bean
    public KafkaTemplate<String, Object> kafkaTemplate() {

        KafkaTemplate<String, Object> kafkaTemplate = new KafkaTemplate<>(producerFactory());
        kafkaTemplate.setMicrometerEnabled(true);
        kafkaTemplate.setObservationEnabled(true);

        return kafkaTemplate;
    }
}

当我不使用@Async时,一切都很好并且可以跟踪,spanId是在日志上创建的。在使用@ASYNC任何其他方法trace之后,spanId无法在日志上跟踪。(我在这种情况下在日志上看到的所有内容[,])

检查了我的 pom 和生产者、消费者以及除了 @ASYNC 之外一切都很好......

spring-boot asynchronous logging micrometer spring-micrometer
1个回答
0
投票

Spring Boot 中的任何异步操作都不会自动将 MDC 映射传播到生成的线程——因为它存在于 ThreadLocal 中。

尝试创建您自己的执行程序配置,将 mdc 上下文(线程装饰器)包装在您的线程周围。

然后确保在

@Async("yourExecutor")
中使用此执行程序的名称,以便您可以利用刚刚配置的执行程序。 MDC 上下文现在应该可用(包括您的跟踪/跨度 ID)

© www.soinside.com 2019 - 2024. All rights reserved.