可观测性
可观测性是指从外部观察运行中系统的内部状态的能力。它包括三个核心要素:日志、指标和追踪。
对于指标和追踪,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 来进一步配置注册表。
JDBC 的可观测性可以使用一个单独的项目进行配置。Datasource Micrometer 项目 提供了一个 Spring Boot starter,它在调用 JDBC 操作时自动创建观测。更多详情请参阅 其参考文档。 |
R2DBC 的可观测性内置于 Spring Boot 中。要启用它,请将 io.r2dbc:r2dbc-proxy 依赖添加到你的项目中。 |
上下文传播
可观测性支持依赖于 Context Propagation 库,用于在线程和响应式管道中转发当前观测。默认情况下,ThreadLocal
的值不会在响应式操作符中自动恢复。此行为由 spring.reactor.context-propagation
属性控制,可以将其设置为 auto
以启用自动传播。
有关观测的更多详细信息,请参阅 Micrometer Observation 文档。
通用标签
通用标签通常用于对运行环境进行维度细分,例如主机、实例、区域、堆栈等。通用标签作为低基数标签应用于所有观测,并且可以配置,如下例所示
-
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
时,该观测才会被报告。
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。你可以使用 OpenTelemetry Java Agent 或 OpenTelemetry Spring Boot Starter,这些是由 OTel 社区支持的;其指标和追踪使用了 OTel 库定义的语义规范。本文档描述了 Spring 团队官方支持的 OpenTelemetry 使用方式,即使用 Micrometer 和 OTLP exporter;其指标和追踪使用了 Spring 项目文档(例如 Spring Framework)中描述的语义规范。 |
Spring Boot 的 actuator 模块包含了对 OpenTelemetry 的基本支持。
它提供了一个 OpenTelemetry
类型的 Bean,并且如果在应用上下文中存在 SdkTracerProvider
、ContextPropagators
、SdkLoggerProvider
或 SdkMeterProvider
类型的 Bean,它们将自动注册。此外,它还提供一个 Resource
Bean。自动配置的 Resource
的属性可以通过 management.opentelemetry.resource-attributes
配置属性进行配置。如果你已经定义了自己的 Resource
Bean,则不会自动配置 Resource。
Spring Boot 不为 OpenTelemetry 指标或日志提供自动配置。OpenTelemetry 追踪只有与 Micrometer Tracing 一起使用时才会自动配置。 |
下一节将提供关于日志、指标和追踪的更多详细信息。
Micrometer Observation 注解支持
要启用对 @Observed
、@Timed
、@Counted
、@MeterTag
和 @NewSpan
等可观测性注解的扫描,你需要将 management.observations.annotations.enabled
属性设置为 true
。此功能由 Micrometer 直接支持。请参阅 Micrometer、Micrometer Observation 和 Micrometer Tracing 的参考文档。
当你注解已被 instrumented 的方法或类(例如 Spring Data 仓库或 Spring MVC 控制器)时,你会得到重复的观测。在这种情况下,你可以选择使用 属性 或 ObservationPredicate 禁用自动 instrumented 并依赖你的注解,或者你可以移除你的注解。 |