此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

Spring Boot Actuator 为 Micrometer Tracing 提供依赖项管理和自动配置,Micrometer Tracing 是流行跟踪库的外观。Spring中文文档

要了解有关千分尺跟踪功能的更多信息,请参阅其参考文档
要了解有关千分尺跟踪功能的更多信息,请参阅其参考文档

支持的示踪剂

Spring Boot 为以下跟踪器提供自动配置:Spring中文文档

开始

我们需要一个示例应用程序,可用于开始跟踪。 就我们的目的而言,“开发您的第一个 Spring Boot 应用程序”一节中介绍的简单 “Hello World!” Web 应用程序就足够了。 我们将使用 OpenTelemetry 跟踪器和 Zipkin 作为跟踪后端。Spring中文文档

回顾一下,我们的主要应用程序代码如下所示:Spring中文文档

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()

现在我们必须添加以下依赖项:Spring中文文档

添加以下应用程序属性:Spring中文文档

management.tracing.sampling.probability=1
management:
  tracing:
    sampling:
      probability: 1.0

默认情况下,Spring Boot 仅对 10% 的请求进行采样,以防止跟踪后端不堪重负。 此属性将其切换到 100%,以便将每个请求发送到跟踪后端。Spring中文文档

为了收集和可视化跟踪,我们需要一个正在运行的跟踪后端。 我们在这里使用 Zipkin 作为我们的跟踪后端。 Zipkin 快速入门指南提供了如何在本地启动 Zipkin 的说明。Spring中文文档

Zipkin 运行后,您可以启动应用程序。Spring中文文档

如果打开 Web 浏览器,应看到以下输出:localhost:8080Spring中文文档

Hello World!

在后台,已经为 HTTP 请求创建了一个观察结果,该观察结果又被桥接到 OpenTelemetry,OpenTelemetry 向 Zipkin 报告新的跟踪。Spring中文文档

现在打开 Zipkin UI 并按“运行查询”按钮列出所有收集的跟踪。 您应该会看到一个痕迹。 按“显示”按钮查看该跟踪的详细信息。localhost:9411Spring中文文档

该方法中添加了一个记录器语句,这在稍后会很重要。home()

记录相关 ID

相关 ID 提供了一种将日志文件中的行链接到跨度/跟踪的有用方法。 如果您使用的是千分尺跟踪,则默认情况下,Spring Boot 将在日志中包含相关 ID。Spring中文文档

默认相关 ID 是根据 和 MDC 值构建的。 例如,如果千分尺跟踪添加了 的 MDC,则日志输出的 MDC 将包括 相关 ID 。traceIdspanIdtraceId803B448A0489F84084905D3093480352spanId3425F23BB2432450[803B448A0489F84084905D3093480352-3425F23BB2432450]Spring中文文档

如果希望对相关 ID 使用不同的格式,则可以使用该属性来定义一个格式。 例如,以下内容将提供 Spring Cloud Detective 以前使用的格式的 Logback 的相关 ID:logging.pattern.correlationSpring中文文档

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-namefalselogging.pattern.correlationlogging.pattern.correlation
在上面的示例中,设置为避免应用程序名称在日志消息中重复(已包含它)。 还值得一提的是,它包含一个尾随空格,以便它与默认情况下紧随其后的记录器名称分开。logging.include-application-namefalselogging.pattern.correlationlogging.pattern.correlation

传播跟踪

若要在网络上自动传播跟踪,请使用自动配置的 RestTemplateBuilderRestClient.BuilderWebClient.Builder 来构造客户端。Spring中文文档

如果在不使用自动配置的构建器的情况下创建 、 或 ,则自动跟踪传播将不起作用!RestTemplateRestClientWebClient
如果在不使用自动配置的构建器的情况下创建 、 或 ,则自动跟踪传播将不起作用!RestTemplateRestClientWebClient

Tracer 实现

由于 Micrometer Tracer 支持多个跟踪器实现,因此 Spring Boot 可以进行多种依赖项组合。Spring中文文档

所有跟踪器实现都需要依赖项。org.springframework.boot:spring-boot-starter-actuatorSpring中文文档

使用 Zipkin 的 OpenTelemetry

使用 OpenTelemetry 进行跟踪并向 Zipkin 报告需要以下依赖项:Spring中文文档

  • io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。Spring中文文档

  • io.opentelemetry:opentelemetry-exporter-zipkin- 向 Zipkin 报告跟踪。Spring中文文档

使用配置属性配置向 Zipkin 报告。management.zipkin.tracing.*Spring中文文档

使用波前的 OpenTelemetry

使用 OpenTelemetry 进行跟踪并向 Wavefront 报告需要以下依赖项:Spring中文文档

  • io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。Spring中文文档

  • io.micrometer:micrometer-tracing-reporter-wavefront- 向 Wavefront 报告跟踪。Spring中文文档

使用配置属性配置向 Wavefront 报告。management.wavefront.*Spring中文文档

使用 OTLP 的 OpenTelemetry

使用 OpenTelemetry 进行跟踪并使用 OTLP 进行报告需要以下依赖项:Spring中文文档

  • io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。Spring中文文档

  • io.opentelemetry:opentelemetry-exporter-otlp- 向可以接受 OTLP 的收集器报告跟踪。Spring中文文档

使用配置属性配置使用 OTLP 的报告。management.otlp.tracing.*Spring中文文档

OpenZipkin Brave 与 Zipkin

使用 OpenZipkin Brave 进行跟踪并向 Zipkin 报告需要以下依赖项:Spring中文文档

  • io.micrometer:micrometer-tracing-bridge-brave- 将 Micrometer Observation API 桥接到 Brave。Spring中文文档

  • io.zipkin.reporter2:zipkin-reporter-brave- 向 Zipkin 报告跟踪。Spring中文文档

使用配置属性配置向 Zipkin 报告。management.zipkin.tracing.*Spring中文文档

OpenZipkin Brave 与 Wavefront

使用 OpenZipkin Brave 进行跟踪并向 Wavefront 报告需要以下依赖项:Spring中文文档

  • io.micrometer:micrometer-tracing-bridge-brave- 将 Micrometer Observation API 桥接到 Brave。Spring中文文档

  • io.micrometer:micrometer-tracing-reporter-wavefront- 向 Wavefront 报告跟踪。Spring中文文档

使用配置属性配置向 Wavefront 报告。management.wavefront.*Spring中文文档

与千分尺观察集成

A 会自动注册到 上,这会为每个完成的观测值创建范围。TracingAwareMeterObservationHandlerObservationRegistrySpring中文文档

创建自定义跨度

您可以通过启动观测点来创建自己的跨度。 为此,请注入到组件中:ObservationRegistrySpring中文文档

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”。Spring中文文档

如果要在不创建指标的情况下创建跨度,则需要使用 Micrometer 的较低级别的 Tracer API
如果要在不创建指标的情况下创建跨度,则需要使用 Micrometer 的较低级别的 Tracer API

行李

您可以使用 API 创建行李:TracerSpring中文文档

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
		}
	}

}

本示例创建以值 命名的行李。 如果您使用的是 W3C 传播,则行李会自动通过网络传播。 如果您使用的是 B3 传播,则行李不会自动传播。 若要通过网络手动传播行李,请使用 configuration 属性(这也适用于 W3C)。 对于上面的示例,将此属性设置为生成 HTTP 标头。baggage1value1management.tracing.baggage.remote-fieldsbaggage1baggage1: value1Spring中文文档

如果要将行李传播到 MDC,请使用 configuration 属性。 对于上面的示例,将此属性设置为生成名为 的 MDC 条目。management.tracing.baggage.correlation.fieldsbaggage1baggage1Spring中文文档

测试

使用 时,不会自动配置正在报告数据的跟踪组件。 有关详细信息,请参阅测试部分@SpringBootTestSpring中文文档