Трассировка Spring Boot 3 KafkaTemplate (traceId, spanId, багаж) отсутствует

До Spring Boot 3 трассировка, включая трассировку Kafka, выполнялась с помощью Sleuth. Можно было распространять контекст трассировки (traceId, spanId, багаж) через Kafka.

Сыщика больше не существует. Spring Boot теперь заботится об этих аспектах.

Кажется, исчезла трассировка на стороне производителя (KafkaTemplate).

Раньше это обрабатывалось с помощью постпроцессора шаблона. См. KafkaFactoryBeanPostProcessor, TraceProducerPostProcessor и TracingConsumerPostProcessor для получения более подробной технической информации.

https://github.com/spring-cloud/spring-cloud-sleuth/tree/80f0889c91d337e84ce0eca2d602464a1a4355c6/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/ обмен сообщениями

Я что-то забыл? Должен ли я настроить его вручную или импортировать другую зависимость?

Любые комментарии и отзывы по этой сложной теме более чем приветствуются.

РЕДАКТИРОВАТЬ 1:

Добавив Brave-Instrumentation-Kafka-Clients в путь к классам, его также можно настроить вручную, используя следующую часть кода:

@Bean
public <K, V> ProducerFactory<K, V> kafkaProducerFactory(KafkaProperties kafkaProperties, ObjectProvider<Tracing> tracing) {
    final var factory = new DefaultKafkaProducerFactory<>(kafkaProperties.buildProducerProperties());
        tracing.ifAvailable(t -> {
            final var kafkaTracing = KafkaTracing.create(t);
            factory.addPostProcessor(kafkaTracing::producer);
        });
        return factory;
}

Добавление TraceProducerPostProcessor вручную устраняет проблему (контекст трассировки распространяется при использовании этого постпроцессора). Непонятно, кто должен заботиться об этом аспекте. Spring Boot, Spring Kafka или Micrometer?!

François Rosière 19.03.2024 11:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
1
572
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

По умолчанию наблюдение не включено в компонентах Spring Kafka.

Смотрите KafkaTemplate.setObservationEnabled(true).

Подробнее в документации: https://docs.spring.io/spring-kafka/reference/3.1-SNAPSHOT/kafka/micrometer.html#observation

Спасибо за быстрый ответ. Включение наблюдения не решает эту проблему. Контекст трассировки не распространяется. Контекст трассировки создается на стороне производителя, но он не распространяется (что приводит к созданию другого контекста трассировки с другим идентификатором трассировки) на стороне потребителя. Итак, добавив постпроцессор, этот контекст распространяется через заголовки Kafka. Я использую смелую реализацию с типом b3.

François Rosière 19.03.2024 15:10

Затем observationEnabled = true необходимо установить на стороне потребителя через ContainerProperties: docs.spring.io/spring-kafka/reference/3.1-SNAPSHOT/kafka/…

Artem Bilan 19.03.2024 15:18

Наблюдение разрешено с обеих сторон. Я пытаюсь настроить базовый проект, чтобы продемонстрировать распространение от стороны производителя к стороне потребителя. Отображение TraceId и SpaId в записях журнала одного и того же потока.

François Rosière 19.03.2024 15:26

Та же проблема с базовым приложением производства/потребления. TraceContext должен распространяться через Kafka с использованием заголовков Kafka, но это не так. За счет этого на стороне потребителя создается еще один контекст трассировки. Добавление постпроцессора, как это сделал Sleuth, обеспечивает правильное распространение исходного контекста. Итак, похоже на ошибку в Spring Boot или Spring Kafka.

François Rosière 19.03.2024 16:10

Наконец нашел проблему. Поддержка наблюдения работает нормально, когда она включена.

Я использовал установщик в шаблоне, чтобы включить его, но преобразователь свойств, используемый в автоматической конфигурации, сбрасывал значение на false.

    public KafkaTemplate<?, ?> kafkaTemplate(KafkaProperties kafkaProperties,
                                         ObservationRegistry observationRegistry,
                                         ProducerFactory<Object, Object> kafkaProducerFactory,
                                         ProducerListener<Object, Object> kafkaProducerListener,
                                         ObjectProvider<RecordMessageConverter> messageConverter) {
    PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
    KafkaTemplate<Object, Object> kafkaTemplate = new KafkaTemplate<>(kafkaProducerFactory);

    kafkaTemplate.setObservationEnabled(true);
    messageConverter.ifUnique(kafkaTemplate::setMessageConverter);
    map.from(kafkaProducerListener).to(kafkaTemplate::setProducerListener);
    map.from(kafkaProperties.getTemplate().getDefaultTopic()).to(kafkaTemplate::setDefaultTopic);
    map.from(kafkaProperties.getTemplate().getTransactionIdPrefix()).to(kafkaTemplate::setTransactionIdPrefix);
    map.from(kafkaProperties.getTemplate().isObservationEnabled()).to(kafkaTemplate::setObservationEnabled); // RESET THE FLAG TO FALSE IF NOT SET INTO THE PROPERTIES
    return kafkaTemplate;
}

Короче говоря, это произошло из-за неправильного переопределения KafkaTemplate («копирование вставлено» из автоматической конфигурации по умолчанию) в пользовательскую автоматическую конфигурацию. Я не обратил внимания на PropertyMapper.

не могли бы вы описать свой обходной путь?

Esca Tran 02.04.2024 23:33

Другие вопросы по теме