描图
Spring Boot Actuator 为微米追踪(Micrometer Tracing)提供了依赖管理和自动配置,这是流行追踪器库的表象。
| 想了解更多关于微米追踪能力的信息,请参阅其参考文档。 |
支持的猎空
Spring Boot 提供以下示踪器的自动配置:
-
OpenTelemetry 搭配 Zipkin 或 OTLP。
-
OpenZipkin 勇敢与 Zipkin 合作。
开始
我们需要一个示例应用,用来开始追踪。 就我们而言,开发你的第一个春季靴子应用部分介绍的简单“Hello World!”网页应用就足够了。 我们将使用 OpenTelemetry 追踪器,Zipkin 作为跟踪后端。
总结一下,我们的主要应用代码如下:
-
Java
-
Kotlin
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)
}
在主页()方法,后面会很重要。 |
现在我们需要添加以下依赖关系:
-
org.springframework.boot:spring-boot-starter-actuator -
io.micrometer:micrometer-tracing-bridge-otel- 将Micrometer Observation API与OpenTelemetry连接起来。 -
io.opentelemetry:opentelemetry-exporter-zipkin- 报告有Zipkin的线索。
添加以下应用属性:
-
Properties
-
YAML
management.tracing.sampling.probability=1
management:
tracing:
sampling:
probability: 1.0
默认情况下,Spring Boot只采样10%的请求,以防止跟踪后端过载。 这个特性会把它切换到100%,这样每个请求都会发送到追踪后端。
为了收集和可视化这些痕迹,我们需要一个正在运行的痕迹后端。 我们这里用Zipkin作为追踪后台。 Zipkin 快速入门指南提供了如何在本地启动 Zipkin 的说明。
Zipkin运行后,你可以启动应用。
如果你打开网页浏览器本地主持人:8080你应该会看到以下输出:
Hello World!
在幕后,已经为 HTTP 请求创建了一个观测值,该请求再被桥接到 OpenTelemetry,OpenTelemetry 报告了一个新的 Zipkin 追踪线。
现在打开Zipkin的界面本地主持:9411并点击“运行查询”按钮列出所有收集的痕迹。
你应该看到一个痕迹。
点击“显示”按钮查看该追踪的详细信息。
日志相关ID
相关ID为日志文件中的线路与跨度/痕迹提供了一种有用的连接方式。 如果你使用微尺追踪,Spring Boot 默认会在日志中包含相关ID。
默认的相关ID 由traceId和西班牙语 民主化原则价值观。
例如,如果Micrometer Tracering添加了MDCtraceId之803B448A0489F84084905D3093480352以及一个多元发展委员会(MDC)西班牙语之3425F23BB2432450日志输出将包含相关ID[803B448A0489F84084905D3093480352-3425F23BB2432450].
如果你更喜欢用不同的格式来做相关ID,可以用logging.pattern.correlation用来定义一。
例如,以下表格将为 Spring Cloud Sleuth 之前使用的 Logback 格式提供关联 ID:
-
Properties
-
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包含一个尾部空格,因此默认与紧随其后的日志器名称分开。 |
| 相关ID依赖于上下文传播。 请阅读本文档以获取更多细节。 |
传播痕迹
要自动传播线路,请使用自动配置Rest模板构建器,RestClient.Builder或WebClient.Builder构建客户端。
追踪器实现
由于Micrometer Tracer支持多种tracer实现,Spring Boot可以实现多种依赖组合。
所有追踪器实现都需要org.springframework.boot:spring-boot-starter-actuatorDependency。
OpenTelemetry With Zipkin
使用 OpenTelemetry 进行追踪并向 Zipkin 报告需要以下依赖关系:
-
io.micrometer:micrometer-tracing-bridge-otel- 将Micrometer Observation API与OpenTelemetry连接起来。 -
io.opentelemetry:opentelemetry-exporter-zipkin- 报告有Zipkin的线索。
使用该管理.tracing.export.zipkin.*配置属性用于配置向 Zipkin 报告。
使用OTLP的OpenTelemetry
使用 OpenTelemetry 进行追踪并使用 OTLP 进行报告,需要满足以下依赖关系:
-
io.micrometer:micrometer-tracing-bridge-otel- 将Micrometer Observation API与OpenTelemetry连接起来。 -
io.opentelemetry:opentelemetry-exporter-otlp- 将追踪报告给能够接受OTLP的收集者。
使用该管理.opentelemetry.tracing.export.otlp.*配置属性用于使用 OTLP 配置报表。
如果你需要对OTLP跨度导出器应用高级定制,建议注册OtlpHttpSpanExporterBuilderCustomizer或OtlpGrpcSpanExporterBuilderCustomizer豆。
这些命令将在创建OtlpHttpSpanExporter或OtlpGrpcSpanExporter.
自定义器优先于自动配置中施加的任何作。 |
与微米观测的积分
一个追踪意识计量观察处理器自动注册于ObservationRegistry,为每个完成的观测生成张成。
创建自定义跨度
你可以通过开始观测来创建自己的跨度。
为此,注射ObservationRegistry进入你的组件:
-
Java
-
Kotlin
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”。
如果你想创建跨度但不创建度量,你需要使用下层示 踪应用程序接口来自Micrometer。 |
行李
你可以用示 踪应用程序接口:
-
Java
-
Kotlin
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.
如果你想将包袱传播到多元中心,可以使用管理。追踪。行李。关联。字段配置属性。
以上述例子为例,将该属性设为行李1结果是一个MDC条目,名为行李1.
测试
用于报告数据的追踪组件在使用时并非自动配置@SpringBootTest.
详情请参见使用追踪。