Интеграция Spring Cloud Sleuth с Spring boot amqp

#spring-boot #rabbitmq #amqp #spring-cloud-sleuth

#spring-загрузка #rabbitmq #amqp #spring-cloud-sleuth

Вопрос:

Ищу пример, показывающий интеграцию spring cloud sleuth с издателем и подписчиком spring boot amqp (rabbit).

Я вижу следующие сообщения в журнале

2016-10-21 08:35:15.708 ИНФОРМАЦИЯ [производитель, 9148f56490e5742f, 943ed050691842ab, false] 30928 — [nio-8080-exec-1] a.b.c.контроллеры.MessagingController: Получен запрос на удаление с помощью Activity OrderShipped 2016-10-21 08:35:15.730 ИНФОРМАЦИЯ [производитель, 9148f56490e5742f, 943ed050691842ab, false] 30928 — [nio-8080-exec-1] служба кондиционирования.Служба производителя: опубликовано сообщение

Когда я просматриваю сообщения в очереди, я не вижу traceId или каких-либо других сведений, добавленных в заголовок. Должен ли я использовать MessagePostProcessor для добавления их в заголовок?

Также, что должно быть сделано на принимающей службе?

Комментарии:

1. Если мы используем Spring Boot 2.x и Sleuth, достаточно просто включить свойство spring.sleuth.messaging.rabbit.enabled=true для этой цели.

Ответ №1:

Мы не устанавливаем Spring AMQP «из коробки». Однако вы можете использовать Spring Integration или Spring Cloud Stream, которые мы поддерживаем, и тогда все будет работать «из коробки». Если вам по какой-либо причине потребуется использовать Spring AMQP, вам придется самостоятельно настраивать код (и отправлять нам PR ;)).

Комментарии:

1. Привет, Марчин, спасибо тебе. Я был бы не прочь написать код. Вот несколько примеров того, как интегрировать.

2. У нас есть концепция SpanInjector и SpanExtractor. Вы можете взглянуть на те, которые используются в обмене сообщениями — github.com/spring-cloud/spring-cloud-sleuth/blob/master /… и github.com/spring-cloud/spring-cloud-sleuth/blob/master/… . Они заботятся о получении и передаче информации об отслеживании в сообщениях.

3. Марчин — Если я реализую свою собственную версию SpanInjector, как вызывается метод inject?

4. Достигнут некоторый прогресс. Не удалось опубликовать информацию, но было бы неплохо, если бы я мог сделать это в перехватчике

5. Попробуйте сообщить о проблеме в проекте Spring AMQP. Кстати, можем ли мы отметить это как ответ?

Ответ №2:

Используя Spring AMQP, вы можете настроить MessagePostProcessor на RabbitTemplate с помощью метода setBeforePublishPostProcessors.

Мы внедрили org.springframework.amqp.core.MessagePostProcessor и переопределили postProcessMessage метод таким образом:

 @Override
public org.springframework.amqp.core.Message postProcessMessage(org.springframework.amqp.core.Message message)
        throws AmqpException {
    MessagingMessageConverter converter = new MessagingMessageConverter();
    MessageBuilder<?> mb = MessageBuilder.fromMessage((Message<?>) converter.fromMessage(message));
    inject(tracer.getCurrentSpan(), mb);
    return converter.toMessage(mb.build(), message.getMessageProperties());
}
  

inject Теперь метод может устанавливать все необходимые заголовки для сообщения, и оно будет передано в RabbitMQ с изменениями.
У вас есть отличный пример того, как реализовать такой inject метод в org.springframework.cloud.sleuth.instrument.messaging.MessagingSpanInjector

Мы используем версию 1.1 spring-cloud-sleuth-stream, поэтому мой пример основан на этой версии, в следующем выпуске (1.2) это будет проще.

Комментарии:

1. В итоге мы сделали похожий материал.

2. @yuval-simhon — нужен пиар для Sleuth? 🙂