我们正在使用 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
在 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;
}
}