跟踪

Spring Boot Actuator 为 Micrometer Tracing(一个流行的跟踪库的facade)提供依赖管理和自动配置。

要了解有关 Micrometer Tracing 功能的更多信息,请参阅其 参考文档

支持的跟踪器

Spring Boot 为以下跟踪器提供了自动配置

入门

我们需要一个示例应用程序,以便我们能够开始使用跟踪。出于我们的目的,开发你的第一个 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,OpenTelemetry 将新的跟踪报告给 Zipkin。

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

日志关联 ID

关联 ID 提供了一种将日志文件中的行链接到跨度/跟踪的有用方法。如果您使用的是 Micrometer Tracing,则 Spring Boot 默认会在您的日志中包含关联 ID。

默认关联 ID 由 traceIdspanIdMDC 值构建。例如,如果 Micrometer Tracing 添加了 MDC traceId803B448A0489F84084905D3093480352 和 MDC spanId3425F23BB2432450,则日志输出将包含关联 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 包含一个尾随空格,以便它与默认情况下紧随其后的日志记录器名称分隔开。

传播跟踪

要自动通过网络传播跟踪,请使用自动配置的 RestTemplateBuilderRestClient.BuilderWebClient.Builder 来构建客户端。

如果您创建 RestTemplateRestClientWebClient 时未使用自动配置的构建器,则自动跟踪传播将不起作用!

跟踪器实现

由于 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 的报告。

使用 Zipkin 的 OpenZipkin Brave

使用 OpenZipkin Brave 进行跟踪并向 Zipkin 报告需要以下依赖项。

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

  • io.zipkin.reporter2:zipkin-reporter-brave - 将跟踪报告给 Zipkin。

使用 management.zipkin.tracing.* 配置属性来配置向 Zipkin 的报告。

使用 Wavefront 的 OpenZipkin Brave

使用 OpenZipkin Brave 进行跟踪并向 Wavefront 报告需要以下依赖项。

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

  • io.micrometer:micrometer-tracing-reporter-wavefront - 将跟踪报告给 Wavefront。

使用 management.wavefront.* 配置属性来配置向 Wavefront 的报告。

与 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 时,报告数据的跟踪组件不会自动配置。有关更多详细信息,请参阅 使用跟踪