Как интегрировать Sleuth в весеннюю загрузку 1.5 для распространения идентификатора трассировки в новой весенней загрузке 2.2?

У нас есть микросервисная архитектура, созданная с помощью Spring Boot 2.2, и мы используем Spring Cloud Sleuth для распространения идентификатора трассировки.

Однако у нас есть один старый огромный монолитный компьютер, построенный с помощью Spring Boot 1.5.2, который не использует Sleuth (обновление этого монолита до Spring Boot 2.x не является вариантом). Я попытался интегрировать в него Spring Cloud Sleuth 1.3.5, но он также не генерирует идентификатор трассировки (и не нашел документации по этому поводу).

В настоящее время я закодировал этот фильтр для регистрации своей транзакции в качестве альтернативы, но я не хочу изобретать велосипед:

@Component
public class TransactionLoggingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        String txnId = ofNullable(request.getHeader(TXN_ID_HEADER))
                .orElse(randomUUID().toString().substring(0, 8));

        MDC.put(TXN_ID, txnId);
        chain.doFilter(request, servletResponse);
        MDC.remove(TXN_ID);
    }
}

Мне было интересно, как я могу добавить Sleuth и программно создать идентификатор трассировки / диапазона, чтобы он мог беспрепятственно распространяться на другие микросервисы с помощью Spring Boot 2.2.

Более старая документация, которую я нашел о Spring Cloud Sleuth, - это 2.1.6. Итак, я не нашел возможности использовать Sleuth с Spring Boot 1.5. Вы знаете, совместим ли он с ним и как я могу его интегрировать?

Мне не нравится приведенный выше фрагмент, потому что я создаю еще один идентификатор трассировки, который не обнаружен Сыщиком.


person Federico Piazza    schedule 30.03.2020    source источник


Ответы (2)


Если вы следуете соглашению о заголовках B3, это должно работать из коробки. В общем, вам следует как можно скорее перейти на последнюю версию, так как 1.3.x устарел.

Заголовки, о которых я говорю, находятся здесь для 1.3.6 (https://github.com/spring-cloud/spring-cloud-sleuth/blob/v1.3.6.RELEASE/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Span.java#L79-L86) и здесь для 2.x версия Сыщика (https://github.com/openzipkin/brave/blob/release-5.10.2/brave/src/main/java/brave/propagation/B3Propagation.java#L102-L125)

person Marcin Grzejszczak    schedule 30.03.2020
comment
Определенно, я хочу обновить как можно скорее, хотя это непросто и требует много времени. Не могли бы вы опубликовать фрагмент кода заголовков, о которых вы говорите, которые необходимы для распространения идентификатора трассировки? - person Federico Piazza; 30.03.2020
comment
Обновил ответ. - person Marcin Grzejszczak; 30.03.2020
comment
Спасибо еще раз. Марцин: Я все еще не на 100% ясен с вашим ответом, поэтому вы говорите, что я должен заполнить все эти заголовки в запросе (servletRequest) через мой TransactionLoggingFilter? Или мне следует создать этот объект Span и поместить его где-нибудь в Sleuth? Прошу прощения, если это очевидно для вас, я пытаюсь понять это - person Federico Piazza; 30.03.2020
comment
Я хочу сказать, что если у вас есть приложение Boot 1.5 Sleuth 1.3, вам не нужно ничего делать, чтобы оно могло взаимодействовать с приложением Boot 2.x Sleuth 2.x, потому что эти заголовки распространяются автоматически. - person Marcin Grzejszczak; 30.03.2020
comment
Понятно ... значит, у меня что-то не работает, потому что я не вижу трассировки / диапазона в журналах. Вот почему я спрашивал, как это сделать программно. Знаете ли вы, должно ли работать при простом добавлении 1.3 start? Я не могу найти никакой документации по этому поводу - person Federico Piazza; 30.03.2020
comment
Я не понимаю твоей проблемы. Вы можете построить диапазон с помощью Sleuth.builder () и продолжить его с помощью Tracer.continueSpan - person Marcin Grzejszczak; 30.03.2020
comment
Извините, моя проблема в том, что я добавил Sleuth 1.3, и я не вижу никаких идентификаторов трассировки в журналах, поэтому кажется, что Sleuth либо неправильно настроен, либо не работает, поэтому я хотел использовать Sleuth программно. С другой стороны, я искал документацию, потому что наличие стартера 1.3 кажется недостаточным, чтобы заставить его работать. - person Federico Piazza; 30.03.2020

Нашли проблему к моему ответу. Поделиться для других, которые могут оказаться полезными.

Чтобы использовать Spring boot 1.5, версия Spring Cloud Sleuth должна быть 1.3.6. Проблема заключалась в том, что у нас есть собственный файл logback.xml, и это ограничивало Sleuth выводить идентификатор трассировки / диапазона.

Поэтому, когда мы добавили конфигурацию spring boot default.xml в logback.xml, он начал печатать необходимые журналы:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- Needed for Sleuth to print the logs -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <variable name="LOGS_DIR_VAR" value="${LOGS_DIR:-/logs}"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
            </pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
person Federico Piazza    schedule 13.04.2020