可观察性
可观察性是指从外部观察正在运行的系统的内部状态的能力。它包含三个支柱:日志记录、指标和跟踪。
对于指标和跟踪,Spring Boot 使用 Micrometer Observation。要创建自己的观察(这将导致指标和跟踪),您可以注入一个 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
});
}
}
低基数标签将添加到指标和跟踪中,而高基数标签将仅添加到跟踪中。 |
类型为 ObservationPredicate
、GlobalObservationConvention
、ObservationFilter
和 ObservationHandler
的 Bean 将自动注册到 ObservationRegistry
中。您还可以注册任意数量的 ObservationRegistryCustomizer
Bean 以进一步配置注册表。
可观察性支持依赖 Context Propagation 库 来跨线程和反应式管道转发当前观察。默认情况下,ThreadLocal
值不会在反应式操作符中自动恢复。此行为由 spring.reactor.context-propagation
属性控制,可以将其设置为 auto
以启用自动传播。
有关观察的更多详细信息,请参阅 Micrometer 观察文档。
JDBC 的可观察性可以使用一个单独的项目进行配置。 Datasource Micrometer 项目 提供了一个 Spring Boot 启动程序,它会在调用 JDBC 操作时自动创建观察。在 参考文档 中阅读更多相关信息。 |
R2DBC 的可观察性内置于 Spring Boot 中。要启用它,请将 io.r2dbc:r2dbc-proxy 依赖项添加到你的项目中。
|
通用标记
通用标记通常用于对操作环境进行维度细分,例如主机、实例、区域、堆栈等。通用标记作为低基数标记应用于所有观察,并且可以进行配置,如下例所示
-
属性
-
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
属性
-
属性
-
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
时,才会报告观察。
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 支持
Spring Boot 的执行器模块包括对 OpenTelemetry 的基本支持。
它提供了一个类型为 OpenTelemetry
的 bean,如果应用程序上下文中存在类型为 SdkTracerProvider
、ContextPropagators
、SdkLoggerProvider
或 SdkMeterProvider
的 bean,它们将自动注册。此外,它还提供了一个 Resource
bean。自动配置的 Resource
的属性可以通过 management.opentelemetry.resource-attributes
配置属性进行配置。如果你已经定义了自己的 Resource
bean,则不再适用。
Spring Boot 不为 OpenTelemetry 指标或日志提供自动配置。仅当与 Micrometer Tracing 一起使用时,才会自动配置 OpenTelemetry 跟踪。 |
下一节将提供有关日志记录、指标和跟踪的更多详细信息。
Micrometer 观察注解支持
若要启用对 @Timed
、@Counted
、@MeterTag
和 @NewSpan
注解等指标和跟踪注解的扫描,您需要将 management.observations.annotations.enabled
属性设置为 true
。此功能直接受 Micrometer 支持。请参阅 Micrometer 和 Micrometer Tracing 参考文档。