Micronaut:如何在日志中打印traceId和spanId?

Ano*_*ala 7 jaeger micronaut micronaut-rest

我已经使用 Spring Boot 很长时间了。我现在正在研究 Micronaut。

我习惯使用 Sleuth 在日志上自动打印跟踪和跨度 ID。Micronaut 中的 sleuth 相当于什么?

如果没有等效项,如何使用 Jaeger 在 Micronaut 中打印跟踪和跨度 ID?

Hau*_*ing -1

可以通过以下链接看到应该如何完成的第一条线索:

https://blogs.ashrithgn.com/adding-transaction-trace-id-correlation-id-for-each-request-in-micronaut-for-tracing-the-log-easily/

最重要的部分如下,其余部分我忽略了:

@Filter("/**")
@Singleton
@Slf4j
public class HttpFilter implements HttpServerFilter {

    @Override
    public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> request, ServerFilterChain chain) {
        String uuid = request.getHeaders().contains("X-TRACE-ID") ? request.getHeaders().get("X-TRACE-ID") : UUID.randomUUID().toString();
        request.setAttribute("traceId", uuid);

        log.debug("filter is working");
        return Flux.from(chain.proceed(request)).map(mutableHttpResponse -> {
            MDC.put("trace", uuid);
            mutableHttpResponse.getHeaders().add("X-TRACE-ID",uuid);
            log.debug(mutableHttpResponse.getBody(String.class).orElse("empty"));
            return mutableHttpResponse;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,标头可能不包含 X-TREACE-ID ,在这种情况下,只需调试请求,然后查看其中有哪些标头,例如,我使用 uber-trace 代替 H-TRACE-IF -id 手动提取跟踪 ID:

        val traceId = uberTraceId!!.substringBefore(":")
Run Code Online (Sandbox Code Playgroud)

并放置在MDC中

        MDC.put("trace", traceId)
Run Code Online (Sandbox Code Playgroud)

下一步是启用 micronaut 跟踪 bean

tracing:
  jaeger:
    enabled: true
    sender:
      agentHost: "your jeager host"
      agentPort: "your jaeger port"
Run Code Online (Sandbox Code Playgroud)

应该是这样。如果跟踪位于标头中,则意味着跟踪是由另一个服务启动的。然而,如果这个服务确实是开始跟踪的服务,那么traceId会在稍后初始化,因为它在标头中看不到,当然它不会用于日志记录,但它会被发送到jaeger实例。