当前位置: 首页 > 知识库问答 >
问题:

侦测日志traceId未传播到另一个服务

薛钧
2023-03-14

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

我在父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版本来尝试最新的sleuth版本,看看它是否是sleuth旧版本中的一个bug。

我使用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

zipkin URL是一个公开zipkin服务器的Kubernetes服务(带有@enableZipkinServer的spring boot应用程序)

然后使用以下代码调用第一个服务(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

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

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

如您所见,服务-2(e0c6495a0a598cff)中的traceId与服务-1(eaf3dbcb2f92091b)不同。

而在service-2中,traceId与spanID相同。

问题:

  • 为什么不将traceId传播到service-2,以便能够在Zipkin中看到完整的stacktrace?
  • 为什么service-2中的traceId等于spanId?
  • 为什么在服务-1中导出为假?Zipkin服务器看不到这些日志。
  • 我收到了Zipkin服务器中的rxjava跨域垃圾邮件。我已经尝试了spring.sleuth.rxjava.schedulers.IgnoredThreads=rxjava,但它仍然是zipkin。

请注意,我的依赖项中有Hystrix,并且我删除了@HystrixCommand,以确保Hystrix在每次HTTP调用时创建新的traceId不会有问题。

共有1个答案

乐城
2023-03-14

对于1、2、3,这是因为我正在做一个新的RESTTemplate。

医生说:

您必须将RestTemplate注册为bean,以便插入拦截器。如果使用new关键字创建RestTemplate实例,则检测将无法工作。

所以RTFM为我自己,这解决了我的3个首要问题:

@Bean
public RestTemplate template() {
    return new RestTemplate();
}
@Autowired
private RestTemplate template;
 类似资料:
  • 我正在尝试设置多线程应用程序的跟踪。我已设置线程池: 所以有几个线程。其中一个线程正在侦听SQS队列: 在此代码段中

  • 我有3个节点设置 10.x.x.1-应用程序和文件拍10.x.x.2-用于解析和日志存储的机器10.x.x.3-具有集中的日志存储节点,我们需要从该节点将消息推送到弹性搜索中 10.x.x.3 logstash conf文件 是否有任何插件可以将json数据从一个logstash发送到另一个logstash服务器

  • 名为“Connection Factory”的bean应为“org.apache.activeMQ.activeMQConnectionFactory”类型,但实际上是“org.springframework.cloud.sleuth.instrument.messaging.lazyConnectionFactory”类型 我的依赖项: > org.springframework.boot.sp

  • 例如:来自https://localhost:9200将索引“index_name”设置为https://localhost:9300对于索引“index2_name” 建议在复制数据之前使用映射,映射文章:https://www.elastic.co/guide/en/elasticsearch/reference/current/explicit-mapping.html

  • 问题内容: 也许,我做错了,但在以下情况下我找不到好的出路。 我想对使用下面的Spring Batch执行作业的服务进行单元测试。通过在单独的线程中预配置来执行作业。在我的单元测试中,我想: 创建几个域对象并通过DAO持久化它们 调用服务方法启动工作 等待作业完成 使用DAO检索域对象并检查其状态 显然,以上所有操作都应在一个事务中执行,但是不幸的是,事务不会传播到新线程中(我理解这背后的原理)。

  • SLF4J 提供了 MDC (Mapped Diagnostic Contexts)功能,可以支持用户定义和修改日志的输出格式以及内容。本文将介绍 SOFATracer 集成的 SLF4J MDC功能,方便用户在只简单修改日志配置文件的前提下输出当前 SOFATracer 上下文 TraceId 以及 SpanId 。 使用前提 为了在应用中的日志正确打印 TraceId 和 SpanId 参数,