До Spring Boot 3 трассировка, включая трассировку Kafka, выполнялась с помощью Sleuth. Можно было распространять контекст трассировки (traceId, spanId, багаж) через Kafka.
Сыщика больше не существует. Spring Boot теперь заботится об этих аспектах.
Кажется, исчезла трассировка на стороне производителя (KafkaTemplate).
Раньше это обрабатывалось с помощью постпроцессора шаблона. См. KafkaFactoryBeanPostProcessor, TraceProducerPostProcessor и TracingConsumerPostProcessor для получения более подробной технической информации.
Я что-то забыл? Должен ли я настроить его вручную или импортировать другую зависимость?
Любые комментарии и отзывы по этой сложной теме более чем приветствуются.
РЕДАКТИРОВАТЬ 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;
}
По умолчанию наблюдение не включено в компонентах Spring Kafka.
Смотрите KafkaTemplate.setObservationEnabled(true)
.
Подробнее в документации: https://docs.spring.io/spring-kafka/reference/3.1-SNAPSHOT/kafka/micrometer.html#observation
Спасибо за быстрый ответ. Включение наблюдения не решает эту проблему. Контекст трассировки не распространяется. Контекст трассировки создается на стороне производителя, но он не распространяется (что приводит к созданию другого контекста трассировки с другим идентификатором трассировки) на стороне потребителя. Итак, добавив постпроцессор, этот контекст распространяется через заголовки Kafka. Я использую смелую реализацию с типом b3.
Затем observationEnabled = true
необходимо установить на стороне потребителя через ContainerProperties
: docs.spring.io/spring-kafka/reference/3.1-SNAPSHOT/kafka/…
Наблюдение разрешено с обеих сторон. Я пытаюсь настроить базовый проект, чтобы продемонстрировать распространение от стороны производителя к стороне потребителя. Отображение TraceId и SpaId в записях журнала одного и того же потока.
Та же проблема с базовым приложением производства/потребления. TraceContext должен распространяться через Kafka с использованием заголовков Kafka, но это не так. За счет этого на стороне потребителя создается еще один контекст трассировки. Добавление постпроцессора, как это сделал Sleuth, обеспечивает правильное распространение исходного контекста. Итак, похоже на ошибку в Spring Boot или Spring Kafka.
Наконец нашел проблему. Поддержка наблюдения работает нормально, когда она включена.
Я использовал установщик в шаблоне, чтобы включить его, но преобразователь свойств, используемый в автоматической конфигурации, сбрасывал значение на 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.
не могли бы вы описать свой обходной путь?
Добавление TraceProducerPostProcessor вручную устраняет проблему (контекст трассировки распространяется при использовании этого постпроцессора). Непонятно, кто должен заботиться об этом аспекте. Spring Boot, Spring Kafka или Micrometer?!