156. Spring CloudSleuth

Spring CloudSleuth是用于 Spring Boot 应用程序的工具框架。它捕获跟踪信息,并将跟踪转发到 Zipkin 之类的服务以进行存储和分析。

Google Cloud Platform 提供了自己的托管分布式跟踪服务Stackdriver Trace。您可以使用 Stackdriver Trace 来存储跟踪,查看跟踪详细信息,生成延迟分布图以及生成性能回归报告,而不必运行和维护自己的 Zipkin 实例和存储。

该 Spring Cloud GCP Starter程序无需中间 Zipkin 服务器即可将 Spring Cloud Sleuth 跟踪转发到 Stackdriver Trace。

使用 Spring Cloud GCP BOM 进行 Maven 坐标:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>

Gradle coordinates:

dependencies {
    compile group: 'org.springframework.cloud', name: 'spring-cloud-gcp-starter-trace'
}

您必须从 Google Cloud Console 启用 Stackdriver Trace API 才能捕获跟踪。导航到项目的Stackdriver Trace API并确保已启用它。

Note

如果您已经在使用 Zipkin 服务器捕获来自多个平台/框架的跟踪信息,则还可以使用Stackdriver Zipkin 代理将这些跟踪转发到 Stackdriver Trace,而无需修改现有应用程序。

156.1 Tracing

Spring Cloud Sleuth 使用Brave tracer生成跟踪。这种集成使 Brave 可以使用StackdriverTracePropagation传播。

传播负责从实体中提取跟踪上下文(例如 HTTP Servlet 请求),并将跟踪上下文注入到实体中。传播用法的一个典型示例是接收 HTTP 请求的 Web 服务器,该 Web 服务器在将 HTTP 响应返回给原始调用者之前会触发来自服务器的其他 HTTP 请求。对于StackdriverTracePropagation,首先会在x-cloud-trace-context键(例如 HTTP 请求 Headers)中查找跟踪上下文。 x-cloud-trace-context键的值可以用三种不同的方式设置格式:

  • x-cloud-trace-context: TRACE_ID

  • x-cloud-trace-context: TRACE_ID/SPAN_ID

  • x-cloud-trace-context: TRACE_ID/SPAN_ID;o=TRACE_TRUE

TRACE_ID是一个 32 个字符的十六进制值,它编码一个 128 位数字。

SPAN_ID是无符号的长整数。由于 Stackdriver Trace 不支持 Span 联接,因此始终生成一个新的 SpanID,而不管x-cloud-trace-context中指定的 ID 如何。

TRACE_TRUE可以是0(如果应 traceback 实体),也可以是1(如果应 traceback 实体)。该字段强制决定是否跟踪请求。如果省略,则将决定推迟到采样器。

如果找不到x-cloud-trace-context键,则StackdriverTracePropagation会回退到使用X-B3 headers进行跟踪。

156.2 用于 Stackdriver Trace 的 Spring Boot Starter

用于 Stackdriver Trace 的 Spring Boot Starter 使用 Spring Cloud Sleuth 并自动配置StackdriverSender,该StackdriverSender将 Sleuth 的跟踪信息发送到 Stackdriver Trace。

所有配置都是可选的:

NameDescriptionRequiredDefault value
spring.cloud.gcp.trace.enabled自动配置 Spring Cloud Sleuth 以将跟踪发送到 Stackdriver Trace。Notrue
spring.cloud.gcp.trace.project-id覆盖Spring Cloud GCP 模块中的项目 IDNo
spring.cloud.gcp.trace.credentials.location覆盖Spring Cloud GCP 模块中的凭据位置No
spring.cloud.gcp.trace.credentials.encoded-key覆盖Spring Cloud GCP 模块中的凭据编码密钥No
spring.cloud.gcp.trace.credentials.scopes覆盖Spring Cloud GCP 模块中的凭据范围No
spring.cloud.gcp.trace.num-executor-threads跟踪执行程序使用的线程数No4
spring.cloud.gcp.trace.authority通道声称要连接的 HTTP/2 权限。No
spring.cloud.gcp.trace.compression在 Trace 调用中使用的压缩名称No
spring.cloud.gcp.trace.deadline-ms通话截止时间(以毫秒为单位)No
spring.cloud.gcp.trace.max-inbound-size入站邮件的最大大小No
spring.cloud.gcp.trace.max-outbound-size出站邮件的最大大小No
spring.cloud.gcp.trace.wait-for-readyawaitChannels 准备就绪如果出现短暂故障Nofalse

您可以使用核心 Spring Cloud Sleuth 属性来控制 Sleuth 的采样率等。请阅读Sleuth documentation以获取有关 Sleuth 配置的更多信息。

例如,当您测试以查看走线时,可以将采样率设置为 100%。

spring.sleuth.sampler.probability=1                     # Send 100% of the request traces to Stackdriver.
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)  # Ignore some URL paths.

Spring Cloud GCP Trace 确实会覆盖一些 Sleuth 配置:

  • 始终使用 128 位跟踪 ID。这是 Stackdriver Trace 所必需的。

  • 不使用跨接。Span 联接将在 Client 端和服务器 Span 之间共享 SpanID。 Stackdriver 要求跟踪中的每个 Span ID 都是唯一的,因此不支持 Span 联接。

  • 默认情况下使用StackdriverHttpClientParserStackdriverHttpServerParser填充与 Stackdriver 相关的字段。

156.3 与日志记录集成

可通过Stackdriver 记录支持与 Stackdriver Logging 集成。如果将“跟踪”集成与“日志记录”一起使用,则请求日志将与相应的跟踪相关联。可以通过转到Google Cloud Console 追踪清单,选择一条跟踪并按Details部分中的Logs → View链接来查看跟踪日志。

156.4 Sample

sample applicationcodelab可用。