我们正在使用队列中的消息,立即在服务中启动进程(此服务中有大量日志)并使用 HTTP Rest 客户端调用多个下游。
我们能够为下游 HTTP 请求生成跟踪上下文(traceId、txnId),但是我们无法生成跟踪上下文并将其设置在消息消耗的地方。
基本上,我们尝试在消息从队列中被消费后立即生成traceId、txnId,并将其用于登录服务+下游服务。
尝试了以下4种方法,但无法生成跟踪上下文并将其传递给下游。
Hooks.enableAutomaticContextPropagation();
并设置 contextWrite
contextWrite(Context.of(TraceContext.class, context));
Observation observation = Observation.createNotStarted(...);
MDC.put('txnId','')
Spring启动v2.7.14 反应堆核心 v3.4.31
enableAutomaticContextPropagation
Reactor core v3.5.3 支持,不幸的是 Spring boot 版本目前无法升级。还有其他可能的方法来启用上下文传播下游吗?
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());