Проблема Spring boot 3 с трассировкой микрометров с обработкой заголовка Traceparent

У меня есть код ниже, который обрабатывает запросы от других приложений, которые передают traceId через заголовок. Я ожидаю, что родительский traceId будет гидратирован из запроса, и на панели инструментов zipkin я должен увидеть связь между этим приложением и другими приложениями. Раньше работал сspring-cloud-sleuth-zipkin. Теперь я перешел на весеннюю загрузку 3, и пакет изменился наmicrometer-tracing-bridge-otel(См. pom.xml). Теперь он больше не гидратирует родительский traceId из запроса, а вместо этого генерирует родительский traceId по умолчанию, который равен 0, что приводит к отключению приложения от других приложений на панели инструментов zipkin.

Я протестировал простой запрос на завивание с заголовкомTraceparent:curl --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();
    }
}

пом.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>

1 ответ

Я думаю, что самый простой путь миграции из 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'

Кроме того, названиезаголовок должен быть строчным, см. в документации , с другой стороны, любой регистр должен работать:

Для повышения совместимости между несколькими протоколами и поощрения успешной интеграции поставщики по умолчанию ДОЛЖНЫ сохранять имя заголовка в нижнем регистре. Имя заголовка представляет собой одно слово без каких-либо разделителей, например дефиса (-).

Поставщики ДОЛЖНЫ ожидать имя заголовка в любом регистре (верхний, нижний, смешанный) и ДОЛЖНЫ отправлять имя заголовка в нижнем регистре.

Не могли бы вы попробовать написать имя в нижнем регистре и открыть вопрос, если он работает только в этом случае?

Я не уверен, что вы пытаетесь сделать в контроллере, но это неправильный способ записи диапазона (см. документы Micrometer Tracing).

Кроме того, у нас есть несколько примеров, где это работает: https://github.com/micrometer-metrics/micrometer-samples.

У нас есть

Другие вопросы по тегам