#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? 🙂