描图

Spring Boot Actuator 为 Micrometer Tracking 提供依赖管理和自动配置,Micrometer Tracking 是流行的跟踪器库的外观。spring-doc.cadn.net.cn

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

支持的示踪剂

开始

我们需要一个示例应用程序,可以使用它来开始跟踪。 对于我们的目的,开发您的第一个 Spring Boot 应用程序部分中介绍的简单 “Hello World!” Web 应用程序就足够了。 我们将使用 OpenTelemetry 跟踪器和 Zipkin 作为跟踪后端。spring-doc.cadn.net.cn

回顾一下,我们的主要应用程序代码如下所示:spring-doc.cadn.net.cn

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

}
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@SpringBootApplication
class MyApplication {

	private val logger: Log = LogFactory.getLog(MyApplication::class.java)

	@RequestMapping("/")
	fun home(): String {
		logger.info("home() has been called")
		return "Hello, World!"
	}

}

fun main(args: Array<String>) {
	runApplication<MyApplication>(*args)
}
home()方法,这在以后会很重要。

现在我们必须添加以下依赖项:spring-doc.cadn.net.cn

添加以下应用程序属性:spring-doc.cadn.net.cn

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

默认情况下,Spring Boot 仅采样 10% 的请求,以防止跟踪后端不堪重负。 此属性将其切换为 100%,以便将每个请求发送到跟踪后端。spring-doc.cadn.net.cn

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

Zipkin 运行后,您可以启动应用程序。spring-doc.cadn.net.cn

如果您打开 Web 浏览器以localhost:8080,您应该会看到以下输出:spring-doc.cadn.net.cn

Hello World!

在后台,已经为 HTTP 请求创建了一个观察,该观察又被桥接到 OpenTelemetry,后者向 Zipkin 报告新的跟踪。spring-doc.cadn.net.cn

现在打开 Zipkin UIlocalhost:9411,然后按“运行查询”按钮列出所有收集的跟踪。 您应该会看到一条痕迹。 按“显示”按钮可查看该跟踪的详细信息。spring-doc.cadn.net.cn

记录相关 ID

相关 ID 提供了一种有用的方法,用于将日志文件中的行链接到跨度/跟踪。 如果您使用的是 Micrometer Tracing,Spring Boot 将默认在您的日志中包含相关 ID。spring-doc.cadn.net.cn

默认关联 ID 是从traceIdspanId MDC 值。 例如,如果千分尺跟踪已添加 MDCtraceId803B448A0489F84084905D3093480352和 MDCspanId3425F23BB2432450日志输出将包括相关 ID[803B448A0489F84084905D3093480352-3425F23BB2432450].spring-doc.cadn.net.cn

如果您更喜欢对相关 ID 使用不同的格式,可以使用logging.pattern.correlation属性来定义一个。 例如,以下内容将以 Spring Cloud Sleuth 以前使用的格式提供 Logback 的相关 ID:spring-doc.cadn.net.cn

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包含尾随空格,以便它与默认情况下紧跟在它后面的记录器名称分开。
相关 ID 依赖于上下文传播。 请阅读此文档了解更多详细信息

传播迹线

要通过网络自动传播跟踪,请使用自动配置的RestTemplateBuilder,RestClient.BuilderWebClient.Builder以构建客户端。spring-doc.cadn.net.cn

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

示踪剂实现

由于 Micrometer Tracer 支持多个跟踪器实现,因此 Spring Boot 可能有多种依赖项组合。spring-doc.cadn.net.cn

所有跟踪器实现都需要org.springframework.boot:spring-boot-starter-actuatorDependency。spring-doc.cadn.net.cn

OpenTelemetry 与 Zipkin

使用 OpenTelemetry 进行跟踪并向 Zipkin 报告需要以下依赖项:spring-doc.cadn.net.cn

  • io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。spring-doc.cadn.net.cn

  • io.opentelemetry:opentelemetry-exporter-zipkin- 向 Zipkin 报告痕迹。spring-doc.cadn.net.cn

使用management.zipkin.tracing.*配置属性来配置向 Zipkin 报告。spring-doc.cadn.net.cn

带波前的 OpenTelemetry

使用 OpenTelemetry 进行跟踪并向 Wavefront 报告需要以下依赖项:spring-doc.cadn.net.cn

  • io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。spring-doc.cadn.net.cn

  • io.micrometer:micrometer-tracing-reporter-wavefront- 向 Wavefront 报告跟踪。spring-doc.cadn.net.cn

使用management.wavefront.*配置属性以配置对 Wavefront 的报告。spring-doc.cadn.net.cn

使用 OTLP 的 OpenTelemetry

使用 OpenTelemetry 进行跟踪并使用 OTLP 进行报告需要以下依赖项:spring-doc.cadn.net.cn

  • io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。spring-doc.cadn.net.cn

  • io.opentelemetry:opentelemetry-exporter-otlp- 向可以接受 OTLP 的收集器报告跟踪。spring-doc.cadn.net.cn

使用management.otlp.tracing.*配置属性,以使用 OTLP 配置报告。spring-doc.cadn.net.cn

如果您需要对 OTLP 跨度导出器应用高级自定义,请考虑注册OtlpHttpSpanExporterBuilderCustomizerOtlpGrpcSpanExporterBuilderCustomizer豆。 这些将在创建OtlpHttpSpanExporterOtlpGrpcSpanExporter. 定制器优先于自动配置应用的任何内容。

OpenZipkin Brave 与 Zipkin

使用 OpenZipkin Brave 进行跟踪并向 Zipkin 报告需要以下依赖项:spring-doc.cadn.net.cn

使用management.zipkin.tracing.*配置属性来配置向 Zipkin 报告。spring-doc.cadn.net.cn

OpenZipkin Brave 带波前

使用 OpenZipkin Brave 进行跟踪并向 Wavefront 报告需要以下依赖项:spring-doc.cadn.net.cn

使用management.wavefront.*配置属性以配置对 Wavefront 的报告。spring-doc.cadn.net.cn

与千分尺观察集成

一个TracingAwareMeterObservationHandler自动注册在ObservationRegistry,这将为每个已完成的观测点创建跨度。spring-doc.cadn.net.cn

创建自定义跨度

您可以通过开始观察来创建自己的跨度。为此,注入ObservationRegistry到你的组件中:spring-doc.cadn.net.cn

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 ...
		});
	}

}
import io.micrometer.observation.Observation
import io.micrometer.observation.ObservationRegistry
import org.springframework.stereotype.Component

@Component
class CustomObservation(private val observationRegistry: ObservationRegistry) {

	fun someOperation() {
		Observation.createNotStarted("some-operation", observationRegistry)
			.lowCardinalityKeyValue("some-tag", "some-value")
			.observe {
				// Business logic ...
			}
	}

}

这将创建一个名为“some-operation”的观察,标签为“some-tag=some-value”。spring-doc.cadn.net.cn

如果要在不创建指标的情况下创建范围,则需要使用较低级别Tracer应用程序接口来自千分尺。

行李

您可以使用Tracer应用程序接口:spring-doc.cadn.net.cn

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

}
import io.micrometer.tracing.Tracer
import org.springframework.stereotype.Component

@Component
class CreatingBaggage(private val tracer: Tracer) {

	fun doSomething() {
		tracer.createBaggageInScope("baggage1", "value1").use {
			// Business logic
		}
	}

}

此示例创建名为baggage1与值value1. 如果您使用的是 W3C 传播,则包袱会自动通过网络传播。 如果您使用的是 B3 传播,则行李不会自动传播。 要通过网络手动传播行李,请使用management.tracing.baggage.remote-fieldsconfiguration 属性(这也适用于 W3C)。 对于上面的示例,将此属性设置为baggage1结果为 HTTP 标头baggage1: value1.spring-doc.cadn.net.cn

如果要将行李传播到 MDC,请使用management.tracing.baggage.correlation.fieldsconfiguration 属性。 对于上面的示例,将此属性设置为baggage1导致名为baggage1.spring-doc.cadn.net.cn

测试

使用@SpringBootTest. 有关更多详细信息,请参阅使用跟踪spring-doc.cadn.net.cn