|
如需获取最新稳定版本,请使用 Spring Boot 4.0.4! |
可观测性
可观测性是指从外部观察运行系统内部状态的能力。 它由三个支柱组成:日志、度量和跟踪。
对于指标和追踪,Spring Boot 使用 Micrometer Observation。
要创建你自己的观测数据(这将生成指标和追踪),你可以注入一个 ObservationRegistry。
-
Java
-
Kotlin
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import org.springframework.stereotype.Component;
@Component
public class MyCustomObservation {
private final ObservationRegistry observationRegistry;
public MyCustomObservation(ObservationRegistry observationRegistry) {
this.observationRegistry = observationRegistry;
}
public void doSomething() {
Observation.createNotStarted("doSomething", this.observationRegistry)
.lowCardinalityKeyValue("locale", "en-US")
.highCardinalityKeyValue("userId", "42")
.observe(() -> {
// Execute business logic here
});
}
}
import io.micrometer.observation.Observation
import io.micrometer.observation.ObservationRegistry;
import org.springframework.stereotype.Component
@Component
class MyCustomObservation(private val observationRegistry: ObservationRegistry) {
fun doSomething() {
Observation.createNotStarted("doSomething", observationRegistry)
.lowCardinalityKeyValue("locale", "en-US")
.highCardinalityKeyValue("userId", "42")
.observe {
// Execute business logic here
}
}
}
| 低基数标签将添加到指标和追踪中,而高基数标签仅会添加到追踪中。 |
类型为 ObservationPredicate、GlobalObservationConvention、ObservationFilter 和 ObservationHandler 的 Bean 将自动注册到 ObservationRegistry 上。
您还可以注册任意数量的 ObservationRegistryCustomizer Bean,以进一步配置注册表。
| 可使用一个单独的项目来配置JDBC的可观测性。 数据源Micrometer项目提供了一个Spring BootStarters,可在调用JDBC操作时自动创建观测信息。 详细了解它 在参考文档中。 |
Spring Boot 内置了对 R2DBC 的可观测性支持。
要启用它,请将 io.r2dbc:r2dbc-proxy 依赖项添加到您的项目中。 |
上下文传播
可观察性支持依赖于 上下文传播库 以在不同线程和响应式管道中传递当前观察。
默认情况下,ThreadLocal 值不会在响应式操作符中自动恢复。
此行为由 spring.reactor.context-propagation 属性控制,可以设置为 auto 以启用自动传播。
如果您使用的是 @Async 方法或使用 AsyncTaskExecutor,则必须在执行器上注册 ContextPropagatingTaskDecorator,否则在切换线程时会丢失可观测性上下文。
这可以通过以下配置完成:
-
Java
-
Kotlin
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.support.ContextPropagatingTaskDecorator;
@Configuration(proxyBeanMethods = false)
class ContextPropagationConfiguration {
@Bean
ContextPropagatingTaskDecorator contextPropagatingTaskDecorator() {
return new ContextPropagatingTaskDecorator();
}
}
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.core.task.support.ContextPropagatingTaskDecorator
@Configuration(proxyBeanMethods = false)
class ContextPropagationConfiguration {
@Bean
fun contextPropagatingTaskDecorator(): ContextPropagatingTaskDecorator {
return ContextPropagatingTaskDecorator()
}
}
有关观察的更多详情,请参阅 Micrometer 观察文档。
常用标签
常用的标签通常用于对运行环境进行维度钻取,例如主机、实例、区域、堆栈等。 常用的标签作为低基数标签应用于所有观测,并且可以进行配置,如下例所示:
-
Properties
-
YAML
management.observations.key-values.region=us-east-1
management.observations.key-values.stack=prod
management:
observations:
key-values:
region: "us-east-1"
stack: "prod"
前面的示例将 region 和 stack 标签分别添加到值为 us-east-1 和 prod 的所有观测中。
防止观测
如果您希望阻止报告某些观测数据,可以使用 management.observations.enable 属性:
-
Properties
-
YAML
management.observations.enable.denied.prefix=false
management.observations.enable.another.denied.prefix=false
management:
observations:
enable:
denied:
prefix: false
another:
denied:
prefix: false
前面的示例将阻止所有名称以 denied.prefix 或 another.denied.prefix 开头的观察。
如果您希望阻止 Spring Security 报告观测数据,请将属性 management.observations.enable.spring.security 设置为 false。 |
如果您需要对防止观测进行更精细的控制,可以注册类型为 ObservationPredicate 的 Bean。
仅当所有 ObservationPredicate Bean 对该观测返回 true 时,才会报告观测结果。
-
Java
-
Kotlin
import io.micrometer.observation.Observation.Context;
import io.micrometer.observation.ObservationPredicate;
import org.springframework.stereotype.Component;
@Component
class MyObservationPredicate implements ObservationPredicate {
@Override
public boolean test(String name, Context context) {
return !name.contains("denied");
}
}
import io.micrometer.observation.Observation.Context
import io.micrometer.observation.ObservationPredicate
import org.springframework.stereotype.Component
@Component
class MyObservationPredicate : ObservationPredicate {
override fun test(name: String, context: Context): Boolean {
return !name.contains("denied")
}
}
前面的示例将阻止所有名称包含“denied”的观察。
OpenTelemetry 支持
| 在您的应用程序中支持 OpenTelemetry 有多种方式。 您可以使用由 OTel 社区支持的 OpenTelemetry Java Agent 或 OpenTelemetry Spring Boot Starter, 其指标和追踪使用 OTel 库定义的语义约定。 本文档描述了 Spring 团队官方支持的 OpenTelemetry 集成方式,使用 Micrometer 和 OTLP 导出器; 其指标和追踪使用 Spring 项目文档(例如 Spring Framework)中描述的语义约定。 |
Spring Boot 的 actuator 模块包含对 OpenTelemetry 的基本支持。
它提供了一个类型为 OpenTelemetry 的 bean,如果应用上下文中存在类型为 SdkTracerProvider、ContextPropagators、SdkLoggerProvider 或 SdkMeterProvider 的 bean,它们将自动注册。
此外,它还提供一个 Resource bean。
可以通过 management.opentelemetry.resource-attributes 配置属性来配置自动配置的 Resource 的属性。
自动配置的属性将与来自 OTEL_RESOURCE_ATTRIBUTES 和 OTEL_SERVICE_NAME 环境变量的属性合并,其中通过配置属性设置的属性优先于来自环境变量的属性。
如果您定义了自己的 Resource bean,情况将不再如此。
| Spring Boot 不为 OpenTelemetry 指标或日志记录提供自动配置。 仅当与 Micrometer Tracing 一起使用时,才会自动配置 OpenTelemetry 追踪。 |
OTEL_RESOURCE_ATTRIBUTES 环境变量由一系列键值对组成。
例如:key1=value1,key2=value2,key3=spring%20boot。
所有属性值均被视为字符串,且任何不在 baggage-octet 范围内的字符都必须进行百分号编码。 |
接下来的章节将详细介绍日志、指标和追踪。
Micrometer 观测注解支持
要启用对诸如 @Observed、@Timed、@Counted、@MeterTag 和 @NewSpan 等可观测性注解的扫描,请将 management.observations.annotations.enabled 属性设置为 true。
还需要依赖于 org.aspectj:aspectjweaver,它是 spring-boot-starter-aop 的一部分。
此功能由 Micrometer 直接支持。
请参阅 Micrometer、Micrometer Observation 和 Micrometer Tracing 参考文档。
当你注解已经进行仪器检测的方法或类(例如,Spring Data 仓库 或 Spring MVC 控制器)时,你会得到重复的观测结果。
在这种情况下,你可以使用 属性 或一个 ObservationPredicate 禁用自动仪器检测,并依赖你的注解,或者你可以删除你的注解。 |