可观察性

可观测性是从外部观察正在运行的系统的内部状态的能力。它由三个支柱组成:日志记录、指标和跟踪。spring-doc.cadn.net.cn

对于指标和跟踪,Spring Boot 使用 Micrometer Observation。要创建您自己的观察(这将导致指标和跟踪),您可以注入ObservationRegistry.spring-doc.cadn.net.cn

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

}
低基数标记将添加到指标和跟踪中,而高基数标记将仅添加到跟踪中。

Beans类型ObservationPredicate,GlobalObservationConvention,ObservationFilterObservationHandler将自动注册在ObservationRegistry. 您可以额外注册任意数量的ObservationRegistryCustomizerbean 来进一步配置注册表。spring-doc.cadn.net.cn

JDBC 的可观测性可以使用单独的项目进行配置。Datasource Micrometer 项目提供了一个 Spring Boot Starters,它在调用 JDBC作时自动创建观察。在参考文档中阅读更多相关信息。
R2DBC 的可观测性内置于 Spring Boot 中。要启用它,请将io.r2dbc:r2dbc-proxy依赖项目。

上下文传播

可观测性支持依赖于上下文传播库来跨线程和响应式管道转发当前观察。默认情况下,ThreadLocal值不会在响应式运算符中自动恢复。此行为由spring.reactor.context-propagation属性,可以设置为auto以启用自动传播。spring-doc.cadn.net.cn

有关观测的更多详细信息,请参阅千分尺观测文档spring-doc.cadn.net.cn

常见标签

通用标签通常用于对作环境进行维度向下钻取,例如主机、实例、区域、堆栈等。公共标签作为低基数标签应用于所有观察,并且可以进行配置,如以下示例所示:spring-doc.cadn.net.cn

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

前面的示例将regionstack标记添加到值为us-east-1prod分别。spring-doc.cadn.net.cn

防止观测

如果要阻止报告某些观察结果,可以使用management.observations.enable性能:spring-doc.cadn.net.cn

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

前面的示例将阻止名称以denied.prefixanother.denied.prefix.spring-doc.cadn.net.cn

如果要阻止 Spring Security 报告观察结果,请将属性management.observations.enable.spring.securityfalse.

如果您需要更好地控制观察的预防,您可以注册类型为ObservationPredicate. 仅当所有ObservationPredicate豆子返回true为了那个观察。spring-doc.cadn.net.cn

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”的所有观察。spring-doc.cadn.net.cn

OpenTelemetry 支持

有多种方法可以在应用程序中支持 OpenTelemetry。 您可以使用 OpenTelemetry Java 代理OpenTelemetry Spring Boot Starter, 由 OTel 社区支持;指标和跟踪使用OTel库定义的语义约定。 本文档描述了 Spring 团队使用 Micrometer 和 OTLP 导出器正式支持的 OpenTelemetry; 指标和跟踪使用 Spring 项目文档中描述的语义约定,例如 Spring Framework

Spring Boot 的执行器模块包括对 OpenTelemetry 的基本支持。spring-doc.cadn.net.cn

它提供了一种类型的 beanOpenTelemetry,如果存在类型SdkTracerProvider,ContextPropagators,SdkLoggerProviderSdkMeterProvider在应用程序上下文中,它们会自动注册。 此外,它还提供了一个Resource豆。 自动配置的属性Resource可以通过management.opentelemetry.resource-attributesconfiguration 属性。 自动配置的属性将与OTEL_RESOURCE_ATTRIBUTESOTEL_SERVICE_NAME环境变量,其中通过配置属性配置的属性优先于环境变量中的属性。spring-doc.cadn.net.cn

如果您已经定义了自己的Resourcebean,情况将不再如此。spring-doc.cadn.net.cn

Spring Boot 不提供 OpenTelemetry 指标或日志记录的自动配置。 OpenTelemetry 跟踪仅在与 Micrometer Tracking 一起使用时自动配置。
OTEL_RESOURCE_ATTRIBUTES环境变量由键值对列表组成。 例如:key1=value1,key2=value2,key3=spring%20boot. 所有属性值都被视为字符串,baggage-octet 范围之外的任何字符都必须以百分比编码

接下来的部分将提供有关日志记录、指标和跟踪的更多详细信息。spring-doc.cadn.net.cn

千分尺观察注释支持

要启用可观测性注释的扫描,例如@Observed,@Timed,@Counted,@MeterTag@NewSpan,您需要将management.observations.annotations.enabled属性设置为true. Micrometer 直接支持此功能。 请参阅千分尺千分尺观察千分尺追踪参考文档。spring-doc.cadn.net.cn

当您注释已经检测的方法或类(例如,Spring Data 存储库Spring MVC 控制器)时,您将获得重复的观察结果。 在这种情况下,您可以使用属性ObservationPredicate并依赖您的注释,或者您可以删除您的注释。