Мы потребляем сообщение из очереди, процесс немедленно инициируется в службе (имея много журналов в этой службе) и вызывает несколько нисходящих процессов с использованием HTTP-клиента отдыха.
мы можем генерировать контекст трассировки (traceId, txnId) для нисходящих HTTP-запросов, однако мы не можем генерировать контекст трассировки и устанавливать его в месте потребления сообщения.
По сути, мы пытаемся сгенерировать TraceId, txnId, как только сообщение будет использовано из очереди, и использовать его для входа в службу + нижестоящие службы.
Попробовал следующие 4 подхода, но не смог сгенерировать контекст трассировки и передать его нижестоящему серверу.
Hooks.enableAutomaticContextPropagation();
и установка contextWrite
contextWrite(Context.of(TraceContext.class, context));
Observation observation = Observation.createNotStarted(...);
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));
Инициировать диапазон в начале вызова и распространять контекст.
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());