Spring Boot 3 与微米级跟踪和处理 Traceparent 标头相关的问题

use*_*406 9 spring-boot spring-cloud-sleuth micrometer spring-micrometer micrometer-tracing

我有下面的代码,用于处理来自其他应用程序的请求,这些应用程序通过标头传递traceId Traceparent。我希望它能够从请求中吸收父级 TraceId,并且在 zipkin 仪表板中我应该看到该应用程序与其他应用程序之间的连接。它曾经与spring-cloud-sleuth-zipkin. 现在我迁移到spring boot 3,包改为micrometer-tracing-bridge-otel(参见pom.xml)。现在,它不再从请求中提取父traceId,而是生成一个全为0的默认父traceId,导致应用程序与zipkin仪表板中的其他应用程序断开连接

我使用带有标头的简单卷曲请求进行了测试Traceparentcurl --location --request GET 'http://localhost:8080/test' --header 'Traceparent: 00-63cf0173620c57b0aed605ee94255089-1444ca74c3d2133a-01'但此代码不会从标头中提取父上下文。知道如何进行这项工作吗?

@RestController
public class Test {

    @Autowired
    private Tracer tracer;

    @GetMapping(path="/test")
    public ResponseEntity<?> handleTest() {
        ScopedSpan span = tracer.startScopedSpan("test span");
        return ResponseEntity.ok();
    }
}

Run Code Online (Sandbox Code Playgroud)

pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.2</version>
    </parent>

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing-bridge-otel</artifactId>
        </dependency>
        <dependency>
            <groupId>io.opentelemetry</groupId>
            <artifactId>opentelemetry-exporter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.reporter2</groupId>
            <artifactId>zipkin-sender-urlconnection</artifactId>
        </dependency>

Run Code Online (Sandbox Code Playgroud)

Jon*_*oni 0

我认为从 Sleuth(默认使用 Brave)最简单的迁移路径是通过 Brave:

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-tracing-bridge-brave'
implementation 'io.zipkin.reporter2:zipkin-reporter-brave'
Run Code Online (Sandbox Code Playgroud)

另外,标头的名称应该是小写的,另一方面traceparent请参阅文档,任何大小写都必须有效:

为了提高跨多个协议的互操作性并鼓励成功集成,默认情况下供应商应将标头名称保持小写。标头名称是一个没有任何分隔符的单词,例如连字符 (-)。

供应商必须期望标头名称为任何大小写(大写、小写、混合),并且应该以小写形式发送标头名称。

您能否尝试使用小写名称并打开一个问题(如果它仅适用于这种情况)?

我不确定您想在控制器中做什么,但这不是记录跨度的正确方法(请参阅微米追踪的文档)。

此外,我们还有很多可以使用的示例:https://github.com/micrometer-metrics/micrometer-samples

我们有