Нужна помощь в инициализации контекста трассировки для запроса, отличного от HTTP

Мы потребляем сообщение из очереди, процесс немедленно инициируется в службе (имея много журналов в этой службе) и вызывает несколько нисходящих процессов с использованием HTTP-клиента отдыха.

мы можем генерировать контекст трассировки (traceId, txnId) для нисходящих HTTP-запросов, однако мы не можем генерировать контекст трассировки и устанавливать его в месте потребления сообщения.

По сути, мы пытаемся сгенерировать TraceId, txnId, как только сообщение будет использовано из очереди, и использовать его для входа в службу + нижестоящие службы.

Попробовал следующие 4 подхода, но не смог сгенерировать контекст трассировки и передать его нижестоящему серверу.

  1. Hooks.enableAutomaticContextPropagation(); и установка contextWrite

  2. contextWrite(Context.of(TraceContext.class, context));

  3. Observation observation = Observation.createNotStarted(...);

  4. MDC.put('txnId','')

Весенняя загрузка v2.7.14 Ядро реактора v3.4.31

enableAutomaticContextPropagation поддерживается в ядре Reactor v3.5.3, к сожалению, версию загрузки Spring на данный момент невозможно обновить. Есть ли другой возможный способ включить распространение контекста вниз по течению?

long generatedLong = new Random().nextLong();

String txnId = StringUtils.lowerCase(RandomStringUtils.randomAlphabetic(16));

final BaggageField baggageField = 
BaggageField.create(TXN_ID_BAGGAGE);
baggageField.updateValue(txnId);

final BaggageFields baggageFields = BaggageFields.newFactory(List.of(baggageField), 1).create();

final TraceContext traceContext = TraceContext.newBuilder().traceId(generatedLong)
 .spanId(generatedLong)
 .parentId(generatedLong)
 .addExtra(baggageFields).build();

return Mono.defer(() -> {
   return validate(request).then(Mono.defer(() -> {
           return service.modify(request)
                  .then(successResponse())
                  .onErrorResume(e -> errorResponse(e));
            })).onErrorResume(e -> errorResponse(e));
        }).contextWrite(Context.of(TraceContext.class, traceContext));
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Инициировать диапазон в начале вызова и распространять контекст.

private final Tracer tracer;
var span = tracer.spanBuilder().start();
final TraceContext context = span.context();
return Mono.defer(() -> {
      ..............
      ..............
).contextWrite(Context.of(TraceContext.class, context))
.doFinally(f -> span.end());

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