跟踪
Spring Boot Actuator 提供依赖项管理和自动配置,用于 Micrometer Tracing,这是流行追踪器库的外观。
要详细了解 Micrometer Tracing 功能,请参阅其 参考文档。 |
支持的追踪器
Spring Boot 为以下追踪器提供自动配置
-
OpenTelemetry,其中包括 Zipkin、Wavefront 或 OTLP
-
OpenZipkin Brave,其中包括 Zipkin 或 Wavefront
入门
我们需要一个示例应用程序,以便我们可以开始使用追踪。对于我们的目的,在“开发您的第一个 Spring Boot 应用程序”部分中介绍的简单的“Hello World!”Web 应用程序就足够了。我们将使用 OpenTelemetry 追踪器,并使用 Zipkin 作为追踪后端。
回顾一下,我们的主应用程序代码如下所示
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class MyApplication {
private static final Log logger = LogFactory.getLog(MyApplication.class);
@RequestMapping("/")
String home() {
logger.info("home() has been called");
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
home() 方法中添加了一个日志记录器语句,这在后面很重要。
|
现在,我们必须添加以下依赖项
-
org.springframework.boot:spring-boot-starter-actuator
-
io.micrometer:micrometer-tracing-bridge-otel
- 将 Micrometer Observation API 桥接到 OpenTelemetry。 -
io.opentelemetry:opentelemetry-exporter-zipkin
- 将 追踪 报告给 Zipkin。
添加以下应用程序属性
-
属性
-
YAML
management.tracing.sampling.probability=1
management:
tracing:
sampling:
probability: 1.0
默认情况下,Spring Boot 仅对 10% 的请求进行采样,以防止压垮追踪后端。此属性将其切换到 100%,以便将每个请求发送到追踪后端。
要收集和可视化追踪,我们需要一个正在运行的追踪后端。我们在此处使用 Zipkin 作为我们的追踪后端。Zipkin 快速入门指南 提供了如何在本地启动 Zipkin 的说明。
Zipkin 运行后,您可以启动应用程序。
如果您在 Web 浏览器中打开 localhost:8080
,您应该会看到以下输出
Hello World!
在幕后,已为 HTTP 请求创建了一个观察,该观察反过来又桥接到 OpenTelemetry,后者会向 Zipkin 报告一个新追踪。
现在在 localhost:9411
打开 Zipkin UI,然后按“运行查询”按钮以列出所有收集的追踪。您应该会看到一个追踪。按“显示”按钮以查看该追踪的详细信息。
记录关联 ID
关联 ID 提供了一种将日志文件中的行链接到跨度/追踪的便捷方式。如果您使用 Micrometer Tracing,Spring Boot 默认情况下会在日志中包含关联 ID。
默认关联 ID 由 traceId
和 spanId
MDC 值生成。例如,如果 Micrometer Tracing 添加了 traceId
MDC 803B448A0489F84084905D3093480352
和 spanId
MDC 3425F23BB2432450
,则日志输出将包括关联 ID [803B448A0489F84084905D3093480352-3425F23BB2432450]
。
如果您希望为关联 ID 使用其他格式,则可以使用 logging.pattern.correlation
属性定义一个格式。例如,以下内容将为 Logback 提供以前由 Spring Cloud Sleuth 使用的格式的关联 ID
-
属性
-
YAML
logging.pattern.correlation=[${spring.application.name:},%X{traceId:-},%X{spanId:-}]
logging.include-application-name=false
logging:
pattern:
correlation: "[${spring.application.name:},%X{traceId:-},%X{spanId:-}] "
include-application-name: false
在上述示例中,logging.include-application-name 设置为 false ,以避免在日志消息中重复应用程序名称(logging.pattern.correlation 已包含它)。还值得一提的是,logging.pattern.correlation 包含一个尾随空格,以便默认情况下将其与紧随其后的记录器名称分隔开。
|
传播跟踪
要自动通过网络传播跟踪,请使用自动配置的 RestTemplateBuilder
或 WebClient.Builder
构建客户端。
如果您在不使用自动配置的构建器的情况下创建 WebClient 或 RestTemplate ,则自动跟踪传播将不起作用!
|
跟踪器实现
由于 Micrometer Tracer 支持多种跟踪器实现,因此 Spring Boot 可以使用多种依赖项组合。
所有跟踪器实现都需要 org.springframework.boot:spring-boot-starter-actuator
依赖项。
使用 Zipkin 的 OpenTelemetry
使用 OpenTelemetry 进行跟踪并向 Zipkin 报告需要以下依赖项
-
io.micrometer:micrometer-tracing-bridge-otel
- 将 Micrometer Observation API 桥接到 OpenTelemetry。 -
io.opentelemetry:opentelemetry-exporter-zipkin
- 向 Zipkin 报告跟踪。
使用 management.zipkin.tracing.*
配置属性配置向 Zipkin 报告。
使用 Wavefront 的 OpenTelemetry
使用 OpenTelemetry 进行跟踪并向 Wavefront 报告需要以下依赖项
-
io.micrometer:micrometer-tracing-bridge-otel
- 将 Micrometer Observation API 桥接到 OpenTelemetry。 -
io.micrometer:micrometer-tracing-reporter-wavefront
- 向 Wavefront 报告跟踪。
使用 management.wavefront.*
配置属性配置向 Wavefront 报告。
使用 OTLP 的 OpenTelemetry
使用 OpenTelemetry 进行跟踪并使用 OTLP 进行报告需要以下依赖项
-
io.micrometer:micrometer-tracing-bridge-otel
- 将 Micrometer Observation API 桥接到 OpenTelemetry。 -
io.opentelemetry:opentelemetry-exporter-otlp
- 将跟踪报告给可以接受 OTLP 的收集器。
使用 management.otlp.tracing.*
配置属性配置使用 OTLP 进行报告。
OpenZipkin Brave 与 Zipkin
使用 OpenZipkin Brave 并向 Zipkin 报告跟踪需要以下依赖项
-
io.micrometer:micrometer-tracing-bridge-brave
- 将 Micrometer Observation API 桥接到 Brave。 -
io.zipkin.reporter2:zipkin-reporter-brave
- 将跟踪报告给 Zipkin。
如果你的项目不使用 Spring MVC 或 Spring WebFlux,还需要 io.zipkin.reporter2:zipkin-sender-urlconnection 依赖项。
|
使用 management.zipkin.tracing.*
配置属性配置向 Zipkin 报告。
与 Micrometer Observation 集成
TracingAwareMeterObservationHandler
会自动注册到 ObservationRegistry
,它会为每个已完成的观察创建跨度。
创建自定义跨度
你可以通过启动观察来创建自己的跨度。为此,将 ObservationRegistry
注入到你的组件中
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import org.springframework.stereotype.Component;
@Component
class CustomObservation {
private final ObservationRegistry observationRegistry;
CustomObservation(ObservationRegistry observationRegistry) {
this.observationRegistry = observationRegistry;
}
void someOperation() {
Observation observation = Observation.createNotStarted("some-operation", this.observationRegistry);
observation.lowCardinalityKeyValue("some-tag", "some-value");
observation.observe(() -> {
// Business logic ...
});
}
}
这将创建一个名为“some-operation”的观察,带有标签“some-tag=some-value”。
如果你想创建一个不创建指标的跨度,你需要使用 Micrometer 的 更底层的 Tracer API。
|
行李
你可以使用 Tracer
API 创建行李
import io.micrometer.tracing.BaggageInScope;
import io.micrometer.tracing.Tracer;
import org.springframework.stereotype.Component;
@Component
class CreatingBaggage {
private final Tracer tracer;
CreatingBaggage(Tracer tracer) {
this.tracer = tracer;
}
void doSomething() {
try (BaggageInScope scope = this.tracer.createBaggageInScope("baggage1", "value1")) {
// Business logic
}
}
}
此示例创建名为 baggage1
的行李,其值为 value1
。如果你使用 W3C 传播,行李会自动通过网络传播。如果你使用 B3 传播,行李不会自动传播。若要手动通过网络传播行李,请使用 management.tracing.baggage.remote-fields
配置属性(这也适用于 W3C)。对于上面的示例,将此属性设置为 baggage1
会生成一个 HTTP 标头 baggage1: value1
。
如果你想将行李传播到 MDC,请使用 management.tracing.baggage.correlation.fields
配置属性。对于上面的示例,将此属性设置为 baggage1
会生成一个名为 baggage1
的 MDC 条目。
测试
使用 @SpringBootTest
时,报告数据的跟踪组件不会自动配置。有关更多详细信息,请参阅 测试部分。