Springboot 3 微米追踪问题

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

我们正在使用 Springboot 3.1.4,我一直在尝试利用基于 Micrometer 的方法来对应用程序进行分布式跟踪。我已经包含了正确的 build.gradle 依赖项,但跟踪仅适用于运行状况检查点,仅适用于健康检查点。更深入地观察,我发现了一种奇怪的行为。我测试了 2 个流程:

流程 1 -> 对服务 1 的 REST 调用 -> JMS 发布到服务 2 方法

流程 2 -> 对服务 2 方法的 REST 调用

在这两种情况下,传入服务都会收到一个带有traceFlags=00的PropagatedSpan。在这种情况下没有捕获/发送任何痕迹/跨度

({opentelemetry-trace-span-key=PropagatedSpan{ImmutableSpanContext{traceId=a2ea0716a45d02a490d7cef097acdb9a,spanId=adb8f982d4294b13,traceFlags=00,traceState=ArrayBasedTraceState{entries=[]} ,远程=假,有效=真}} 、opentelemetry-baggage-key={}、otelTraceContext=ImmutableSpanContext{traceId=a2ea0716a45d02a490d7cef097acdb9a、spanId=adb8f982d4294b13、traceFlags=00、traceState=ArrayBasedTraceState{entries=[]}、remote=false、valid=true}})

但是,当服务 2 在流程 1 中收到来自服务 1 的请求时,它收到的 Span 为 SDKSpan,traceFlags=01。发生这种情况时,我会看到服务 2(而不是服务 1)的捕获的迹线/跨度

({opentelemetry-baggage-key={},opentelemetry-trace-span-key=SdkSpan{traceId=c92ee058c19d5288d6cc72d2bb9c2a3b,spanId=5797df5b5620f02d,parentSpanContext=ImmutableSpanContext{traceId=0000000 0000000000000000000000000,spanId=0000000000000000,traceFlags=00,traceState= ArrayBasedTraceState{entries=[]}、remote=false、valid=false}、name=、kind=SERVER、attributes=null、status=ImmutableStatusData{statusCode=UNSET、description=}、totalRecordedEvents=0、totalRecordedLinks=0、startEpochNanos= 1727214899985765169,endEpochNanos = 0},otelTraceContext = ImmutableSpanContext {traceId = c92ee058c19d5288d6cc72d2bb9c2a3b,spanId = 5797df5b5620f02d,traceFlags = 01,traceState = ArrayBasedT raceState{entries=[]}, Remote=false, valid=true}}

有没有办法让传入的跟踪/跨度利用 SDKSpan 而不是 PropaatedSpan,这似乎甚至会阻止我创建的自定义跨度?

还有其他方法可以解决这个问题吗?预先感谢您!

SG

java spring-boot open-telemetry micrometer-tracing open-telemetry-java
1个回答
0
投票

在 Springboot 3.1.4 中,有一个更改,默认情况下仅跟踪健康检查点。日志中还有这样的内容:

traceFlags=00
它表示请求不会被跟踪。

我建议执行以下操作:

1- 激活采样以跟踪请求并将其添加到您的 application.yml 属性文件中:

management:
  tracing:
    sampling:
      probability: 1.0  # 100% sampling rate

2- 创建跟踪配置并使用 OpenTelemetry 进行配置:

@Configuration
public class TracingConfig {

    @Bean
    public Tracer tracer() {
        SpanExporter spanExporter = OtlpGrpcSpanExporter.builder().build();
        SdkTracerProvider tracerProvider = SdkTracerProvider.builder()
                .addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build())
                .build();
        OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
                .setTracerProvider(tracerProvider)
                .build();
        GlobalOpenTelemetry.set(openTelemetrySdk);
        return openTelemetrySdk.getTracer("example-tracer");
    }
}

3-确保跟踪作为拦截器正确传播:

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        TextMapPropagator propagator = GlobalOpenTelemetry.getPropagators().getTextMapPropagator();
        restTemplate.getInterceptors().add((request, body, execution) -> {
            propagator.inject(Context.current(), request, (req, key, value) -> req.getHeaders().set(key, value));
            return execution.execute(request, body);
        });
        return restTemplate;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.