需要帮助启动非 HTTP 请求的跟踪上下文

问题描述 投票:0回答:1

我们正在使用队列中的消息,立即在服务中启动进程(此服务中有大量日志)并使用 HTTP Rest 客户端调用多个下游。

我们能够为下游 HTTP 请求生成跟踪上下文(traceId、txnId),但是我们无法生成跟踪上下文并将其设置在消息消耗的地方。

基本上,我们尝试在消息从队列中被消费后立即生成traceId、txnId,并将其用于登录服务+下游服务。

尝试了以下4种方法,但无法生成跟踪上下文并将其传递给下游。

  1. Hooks.enableAutomaticContextPropagation();
    并设置
    contextWrite

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

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

  4. 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));
spring-webflux spring-cloud-sleuth micrometer-tracing
1个回答
0
投票

在调用开始时启动跨度并传播上下文

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());
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.