描图

Spring Boot Actuator 为微米追踪(Micrometer Tracing)提供了依赖管理和自动配置,这是流行追踪器库的表象。spring-doc.cadn.net.cn

想了解更多关于微米追踪能力的信息,请参阅其参考文档

支持的猎空

Spring Boot 提供以下示踪器的自动配置:spring-doc.cadn.net.cn

开始

我们需要一个示例应用,用来开始追踪。 就我们而言,开发你的第一个春季靴子应用部分介绍的简单“Hello World!”网页应用就足够了。 我们将使用 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)
}
主页()方法,后面会很重要。

现在我们需要添加以下依赖关系: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

如果你打开网页浏览器本地主持人:8080你应该会看到以下输出:spring-doc.cadn.net.cn

Hello World!

在幕后,已经为 HTTP 请求创建了一个观测值,该请求再被桥接到 OpenTelemetry,OpenTelemetry 报告了一个新的 Zipkin 追踪线。spring-doc.cadn.net.cn

现在打开Zipkin的界面本地主持:9411并点击“运行查询”按钮列出所有收集的痕迹。 你应该看到一个痕迹。 点击“显示”按钮查看该追踪的详细信息。spring-doc.cadn.net.cn

日志相关ID

相关ID为日志文件中的线路与跨度/痕迹提供了一种有用的连接方式。 如果你使用微尺追踪,Spring Boot 默认会在日志中包含相关ID。spring-doc.cadn.net.cn

默认的相关ID 由traceId西班牙语 民主化原则价值观。 例如,如果Micrometer Tracering添加了MDCtraceId803B448A0489F84084905D3093480352以及一个多元发展委员会(MDC)西班牙语3425F23BB2432450日志输出将包含相关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依赖于上下文传播。 请阅读本文档以获取更多细节

传播痕迹

要自动传播线路,请使用自动配置Rest模板构建器,RestClient.BuilderWebClient.Builder构建客户端。spring-doc.cadn.net.cn

如果你创建了Rest模板Rest客户端或者Web客户端如果不使用自动配置的构建器,自动追踪传播是无法实现的!

追踪器实现

由于Micrometer Tracer支持多种tracer实现,Spring Boot可以实现多种依赖组合。spring-doc.cadn.net.cn

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

OpenTelemetry With 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

使用该管理.tracing.export.zipkin.*配置属性用于配置向 Zipkin 报告。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

使用该管理.opentelemetry.tracing.export.otlp.*配置属性用于使用 OTLP 配置报表。spring-doc.cadn.net.cn

如果你需要对OTLP跨度导出器应用高级定制,建议注册OtlpHttpSpanExporterBuilderCustomizerOtlpGrpcSpanExporterBuilderCustomizer豆。 这些命令将在创建OtlpHttpSpanExporterOtlpGrpcSpanExporter. 自定义器优先于自动配置中施加的任何作。

OpenZipkin 勇敢与 Zipkin

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

使用该管理.tracing.export.zipkin.*配置属性用于配置向 Zipkin 报告。spring-doc.cadn.net.cn

与微米观测的积分

一个追踪意识计量观察处理器自动注册于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

如果你想创建跨度但不创建度量,你需要使用下层示 踪应用程序接口来自Micrometer。

行李

你可以用示 踪应用程序接口: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
		}
	}

}

这个例子会生成名为行李1其中值为值1. 如果你使用 W3C 传播,行李会自动通过网络传播。 如果你用的是B3传播,行李不会自动传播。 要手动在网络上传播行李,请使用管理。追踪。行李。远程字段配置属性(这对W3C同样适用)。 以上述例子为例,将该属性设为行李1结果生成HTTP头部行李1:价值1.spring-doc.cadn.net.cn

如果你想将包袱传播到多元中心,可以使用管理。追踪。行李。关联。字段配置属性。 以上述例子为例,将该属性设为行李1结果是一个MDC条目,名为行李1.spring-doc.cadn.net.cn

测试

用于报告数据的追踪组件在使用时并非自动配置@SpringBootTest. 详情请参见使用追踪spring-doc.cadn.net.cn