可觀測性

可觀測性是從外部觀察執行中系統內部狀態的能力。它由三個支柱組成:日誌、指標和追蹤。

對於指標和追蹤,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
			});
	}

}
低基數標籤將新增至指標和追蹤,而高基數標籤僅會新增至追蹤。

類型為 ObservationPredicateGlobalObservationConventionObservationFilterObservationHandler 的 Beans 將自動註冊到 ObservationRegistry 上。您可以額外註冊任意數量的 ObservationRegistryCustomizer beans 以進一步組態登錄。

可觀測性支援依賴 Context Propagation 函式庫,以在執行緒和反應式管道之間轉發當前觀察。預設情況下,ThreadLocal 值不會在反應式運算符中自動恢復。此行為由 spring.reactor.context-propagation 屬性控制,可以將其設定為 auto 以啟用自動傳播。

有關觀察的更多詳細資訊,請參閱 Micrometer Observation 文件

可以使用單獨的專案組態 JDBC 的可觀測性。Datasource Micrometer 專案提供了一個 Spring Boot Starter,它會在調用 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"

前面的範例將 regionstack 標籤新增至所有觀察,其值分別為 us-east-1prod

防止觀察

如果您想防止報告某些觀察,可以使用 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.prefixanother.denied.prefix 開頭的觀察。

如果您想防止 Spring Security 報告觀察,請將屬性 management.observations.enable.spring.security 設定為 false

如果您需要對防止觀察進行更精細的控制,您可以註冊類型為 ObservationPredicate 的 beans。只有當所有 ObservationPredicate beans 都為該觀察傳回 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 AgentOpenTelemetry Spring Boot Starter,它們由 OTel 社群支援;指標和追蹤使用 OTel 函式庫定義的語意慣例。本文檔描述了 Spring 團隊正式支援的 OpenTelemetry,使用 Micrometer 和 OTLP 匯出器;指標和追蹤使用 Spring 專案文件(例如 Spring Framework)中描述的語意慣例。

Spring Boot 的 Actuator 模組包含對 OpenTelemetry 的基本支援。

它提供類型為 OpenTelemetry 的 bean,並且如果應用程式上下文中存在類型為 SdkTracerProviderContextPropagatorsSdkLoggerProviderSdkMeterProvider 的 beans,它們會自動註冊。此外,它還提供了一個 Resource bean。自動組態的 Resource 的屬性可以透過 management.opentelemetry.resource-attributes 組態屬性進行組態。如果您已定義了自己的 Resource bean,則情況不再如此。

Spring Boot 不提供 OpenTelemetry 指標或日誌記錄的自動組態。只有與 Micrometer Tracing 一起使用時,才會自動組態 OpenTelemetry 追蹤。

接下來的章節將提供有關日誌記錄、指標和追蹤的更多詳細資訊。

Micrometer Observation 註解支援

若要啟用指標和追蹤註解(例如 @Timed@Counted@MeterTag@NewSpan 註解)的掃描,您需要將 management.observations.annotations.enabled 屬性設定為 true。此功能由 Micrometer 直接支援。請參閱 MicrometerMicrometer Tracing 參考文件。