Идентификатор трассировки журнала сыщика не передается в другую службу

Я пытаюсь добавить распределенную трассировку в свои микросервисы (в Kubernetes в Azure).

Я добавил зависимости в родительский pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
    <relativePath/>
</parent>
<dependencies>
    {...}
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-core</artifactId>
        <version>1.1.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-zipkin</artifactId>
        <version>1.1.3.RELEASE</version>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>CAMDEN.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        {...}
    </dependencies>
</dependencyManagement>

Я использую 1.4.1 и CAMDEN.SR4, потому что fabric8 kubeflix не поддерживает более новые версии. Я заставил 1.1.3.RELEASE попробовать новейшую версию сыщика, чтобы узнать, не было ли это ошибкой в ​​более старой версии сыщика.

Я использую эту конфигурацию logback-spring.xml:

<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <jmxConfigurator/>
    <property name="CONSOLE_LOG_PATTERN"
          value="%d{yyyy-MM-dd HH:mm:ss.SSS} [${springAppName},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] [%thread] %-5level %logger{35} - %msg%n"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
    </root>
    <logger name="org.springframework" level="ERROR"/>
    <logger name="com.netflix" level="ERROR"/>
    <logger name="io.fabric8" level="ERROR"/>
    <logger name="org.apache" level="ERROR"/>
</configuration>

А вот и мой application.yml:

spring:
  zipkin:
    baseUrl: http://zipkin:8080
  sleuth:
    sampler:
      percentage: 1.0
server:
  port: 8080

URL-адрес zipkin - это сервисы Kubernetes, предоставляющие доступ к серверу Zipkin (приложение Spring для загрузки с @EnableZipkinServer)

Затем я вызываю первую службу (services-1) с помощью этого кода:

private RestTemplate template = new RestTemplate();

@GetMapping("/{key}/{language}")
public String getLabel(@PathVariable String key, @PathVariable String language) throws UnknownHostException {
    log.info("Entering getLabel");
    String testResponse = template.getForObject("http://services-i18n-2/test", String.class);
    String s = labelService.getLabel(key, language) + " " + message + " " + InetAddress.getLocalHost().getHostName() + ", response=" + testResponse;
    log.info("Exiting getLabel");
    return s;
}

который производит эти журналы:

2017-04-05T11:04:48.497345669Z 2017-04-05 11:04:48.497 [services-1,eaf3dbcb2f92091b,95dd9e6082990923,false] [XNIO-2 task-4] INFO  c.l.m.i18n.web.LabelController - Entering getLabel
2017-04-05T11:04:48.519851116Z 2017-04-05 11:04:48.519 [services-1,eaf3dbcb2f92091b,95dd9e6082990923,false] [XNIO-2 task-4] DEBUG c.l.m.i18n.service.LabelService - Response Label(key=Key(value=action.login), language=Language(value=fr), value=s'authentifier)
2017-04-05T11:04:48.519864516Z 2017-04-05 11:04:48.519 [services-1,eaf3dbcb2f92091b,95dd9e6082990923,false] [XNIO-2 task-4] INFO  c.l.m.i18n.web.LabelController - Exiting getLabel

Как вы можете видеть, он вызывает сервис services-i18n-2 с RestTemplate, который создает следующие журналы:

2017-04-05T11:04:48.514145894Z 2017-04-05 11:04:48.513 [services-2,e0c6495a0a598cff,e0c6495a0a598cff,true] [XNIO-2 task-4] INFO  c.l.m.i18n.web.TestController - Entering test
2017-04-05T11:04:48.516430459Z 2017-04-05 11:04:48.516 [services-2,e0c6495a0a598cff,e0c6495a0a598cff,true] [XNIO-2 task-4] INFO  c.l.m.i18n.web.TestController - Exiting test

Как видите, traceId в сервисе-2 (e0c6495a0a598cff) отличается от service-1 (eaf3dbcb2f92091b).

А в сервисе-2 traceId совпадает с spanId.

Вопросов :

  • Почему мне не передать traceId на сервис-2, чтобы иметь возможность видеть полную трассировку стека в Zipkin?
  • Почему traceId в сервисе-2 равен spanId?
  • Почему в service-1 экспортируемое значение false? Эти журналы не просматриваются сервером Zipkin.
  • Я засыпаю спамом rxjava на сервере Zipkin. Я пробовал spring.sleuth.rxjava.schedulers.ignoredthreads = rxjava, но он все еще идет в Zipkin.

К вашему сведению, у меня есть Hystrix в зависимостях, и я удалил @HystrixCommand, чтобы убедиться, что это не проблема, когда Hystrix создает новый traceId при каждом HTTP-вызове.


person Michaël L    schedule 05.04.2017    source источник


Ответы (1)


Для 1, 2, 3 это было потому, что я делал новый RestTemplate.

В документе говорится:

Вы должны зарегистрировать RestTemplate как bean-компонент, чтобы перехватчики были введены. Если вы создаете экземпляр RestTemplate с новым ключевым словом, инструментарий НЕ БУДЕТ работать.

Итак, RTFM для меня, и это решило мои первые 3 проблемы:

@Bean
public RestTemplate template() {
    return new RestTemplate();
}
@Autowired
private RestTemplate template;
person Michaël L    schedule 05.04.2017
comment
Для 4. Я закончил добавлять spring.sleuth.rxjava.schedulers.hook.enabled = false, но я не большой его поклонник. - person Michaël L; 05.04.2017