跳到主要内容
版本:3.5.10

Observability

QWen Max 中英对照 Observability

可观测性(Observability)是指从外部观察运行中系统内部状态的能力。它由三大支柱组成:日志(logging)、指标(metrics)和追踪(traces)。

对于指标(metrics)和追踪(traces),Spring Boot 使用 Micrometer Observation。要创建你自己的观测(observations)(这将生成指标和追踪),你可以注入一个 ObservationRegistry

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

}
备注

低基数(Low cardinality)标签将被添加到指标和追踪中,而高基数(high cardinality)标签仅会被添加到追踪中。

类型为 ObservationPredicateGlobalObservationConventionObservationFilterObservationHandler 的 Bean 将自动注册到 ObservationRegistry 上。你还可以额外注册任意数量的 ObservationRegistryCustomizer Bean,以进一步配置该注册表。

提示

JDBC 的可观测性可以通过一个独立的项目进行配置。Datasource Micrometer 项目 提供了一个 Spring Boot Starter,可在调用 JDBC 操作时自动创建观测数据。更多详情请参阅 参考文档

提示

R2DBC 的可观测性已内置于 Spring Boot 中。要启用它,请在项目中添加 io.r2dbc:r2dbc-proxy 依赖。

Context Propagation

可观测性支持依赖于 Context Propagation library 来在线程和响应式管道之间传递当前的观测上下文。默认情况下,ThreadLocal 的值不会在响应式操作符中自动恢复。该行为由 spring.reactor.context-propagation 属性控制,可将其设置为 auto 以启用自动传播。

如果你正在使用 @Async 方法或使用 AsyncTaskExecutor,则必须在执行器(executor)上注册 ContextPropagatingTaskDecorator,否则在切换线程时可观测性上下文(observability context)会丢失。可以通过以下配置实现:

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

}

有关 Observations 的更多详细信息,请参阅 Micrometer Observation 文档

通用标签

通用标签通常用于对运行环境进行维度下钻,例如主机(host)、实例(instance)、区域(region)、堆栈(stack)等。通用标签会作为低基数(low cardinality)标签应用于所有观测数据,并且可以进行配置,如下例所示:

management.observations.key-values.region=us-east-1
management.observations.key-values.stack=prod

前面的示例为所有观测数据分别添加了 regionstack 标签,其值分别为 us-east-1prod

防止观测

如果你想阻止某些观测数据被上报,可以使用 management.observations.enable 属性:

management.observations.enable.denied.prefix=false
management.observations.enable.another.denied.prefix=false

前面的示例将阻止所有名称以 denied.prefixanother.denied.prefix 开头的观测。

提示

如果想阻止 Spring Security 报告观测数据,请将属性 management.observations.enable.spring.security 设置为 false

如果你需要对观测(Observation)的阻止进行更精细的控制,可以注册类型为 ObservationPredicate 的 Bean。只有当所有 ObservationPredicate Bean 都对该观测返回 true 时,该观测才会被上报。

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

}

前面的示例将阻止所有名称中包含 "denied" 的观测。

OpenTelemetry 支持

备注

在你的应用中支持 OpenTelemetry 有多种方式。你可以使用 OTel 社区支持的 OpenTelemetry Java AgentOpenTelemetry Spring Boot Starter;这些方式中的指标和追踪使用的是 OTel 库定义的语义约定。本文档所描述的 OpenTelemetry 是由 Spring 团队官方支持的方式,使用 Micrometer 和 OTLP Exporter;其中的指标和追踪采用的是 Spring 项目文档(例如 Spring Framework)中描述的语义约定。

Spring Boot 的 actuator 模块包含对 OpenTelemetry 的基本支持。

它提供了一个类型为 OpenTelemetry 的 Bean。如果应用上下文中存在类型为 SdkTracerProviderContextPropagatorsSdkLoggerProviderSdkMeterProvider 的 Bean,它们将被自动注册。此外,它还提供了一个 Resource Bean。自动配置的 Resource 的属性可以通过 management.opentelemetry.resource-attributes 配置属性进行设置。自动配置的属性将与来自 OTEL_RESOURCE_ATTRIBUTESOTEL_SERVICE_NAME 环境变量的属性合并,其中通过配置属性设置的属性优先级高于环境变量中的属性。

如果你已经定义了自己的 Resource bean,情况将不再如此。

备注

Spring Boot 不提供 OpenTelemetry 指标(metrics)或日志(logging)的自动配置。仅当与 Micrometer Tracing 一起使用时,才会自动配置 OpenTelemetry 追踪(tracing)。

备注

OTEL_RESOURCE_ATTRIBUTES 环境变量由一组键值对组成。例如:key1=value1,key2=value2,key3=spring%20boot。所有属性值均被视为字符串,且任何超出 baggage-octet 范围的字符都必须进行 百分号编码(percent-encoded)

接下来的章节将提供更多关于日志、指标和追踪的详细信息。

Micrometer Observation 注解支持

要启用对可观测性注解(如 @Observed@Timed@Counted@MeterTag@NewSpan)的扫描,请将 management.observations.annotations.enabled 属性设置为 true。此外,还需要依赖 org.aspectj:aspectjweaver,该依赖包含在 spring-boot-starter-aop 中。此功能由 Micrometer 直接支持。请参阅 MicrometerMicrometer ObservationMicrometer Tracing 的参考文档。

备注

当你对已经被自动埋点的方法或类添加注解时(例如 Spring Data 仓库Spring MVC 控制器),将会产生重复的观测(observations)。在这种情况下,你可以通过 配置属性ObservationPredicate 禁用自动埋点并仅依赖你的注解,或者直接移除你的注解。