首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未传播到其他服务的侦听日志traceId

未传播到其他服务的侦听日志traceId
EN

Stack Overflow用户
提问于 2017-04-05 12:01:44
回答 1查看 7.8K关注 0票数 7

我试图在我的微服务中添加一个分布式跟踪(在Azure的Kubernetes下面)。

我在父pom.xml中添加了依赖项:

代码语言:javascript
复制
<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尝试最新的侦探版本,看看它是否是旧版本的sleuth中的一个bug。

我使用了logback-spring.xml的以下配置:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
spring:
  zipkin:
    baseUrl: http://zipkin:8080
  sleuth:
    sampler:
      percentage: 1.0
server:
  port: 8080

zipkin URL是一个Kubernetes服务,公开Zipkin服务器(带有@EnableZipkinServer的Spring引导应用程序)

然后,使用以下代码调用第一个服务(services-1):

代码语言:javascript
复制
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;
}

产生这些日志:

代码语言:javascript
复制
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

如您所见,它使用RestTemplate调用服务-i18n-2服务,该服务生成以下日志:

代码语言:javascript
复制
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)不同于服务-1 (eaf3dbcb2f92091b)。

在服务-2中,traceId与spanId相同。

问题:

  • 为什么我不让traceId传播到service-2,以便能够在Zipkin中看到完整的堆栈跟踪?
  • 为什么服务中的traceId -2等于spanId?
  • 为什么出口服务是假的-1?Zipkin服务器看不到这些日志。
  • 我在Zipkin服务器上被rxjava跨服务器垃圾处理。我已经试过spring.sleuth.rxjava.schedulers.ignoredthreads=rxjava了,但还是去了Zipkin。

FYI,我在依赖项中有Hystrix,并且删除了@HystrixCommand,以确保它在每次HTTP调用时创建一个新的traceId没有问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-05 13:39:23

对于1,2,3来说,这是因为我正在做一个新的RestTemplate。

医生说:

您必须将RestTemplate注册为bean,这样拦截器才会被注入。如果使用新关键字创建RestTemplate实例,则该工具将无法工作。

所以RTFM为我自己解决了我的第三个问题:

代码语言:javascript
复制
@Bean
public RestTemplate template() {
    return new RestTemplate();
}
@Autowired
private RestTemplate template;
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43230619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档