Actuator

Spring Boot 集成了 Spring Boot Actuator。本節回答了使用 Actuator 時經常遇到的問題。

更改 Actuator 端點的 HTTP 埠或地址

在獨立應用中,Actuator 的 HTTP 埠預設與主 HTTP 埠相同。要使應用監聽不同的埠,請設定外部屬性:management.server.port。要在完全不同的網路地址上監聽(例如,當您有用於管理的內部網路和用於使用者應用的外部網路時),您還可以將 management.server.address 設定為伺服器能夠繫結的有效 IP 地址。

更多詳細資訊,請參閱 ManagementServerProperties 原始碼以及“生產就緒特性”部分中的定製管理伺服器埠

定製清理

要控制清理過程,請定義一個 SanitizingFunction bean。呼叫該函式時使用的 SanitizableData 提供了對鍵和值以及它們所屬的 PropertySource 的訪問許可權。例如,這允許您清理來自特定屬性源的每個值。每個 SanitizingFunction 會按順序呼叫,直到某個函式更改了可清理資料的值。

將健康指示器對映到 Micrometer 度量

Spring Boot 健康指示器返回一個 Status 型別,以指示系統的整體健康狀況。如果您想監控或對特定應用的健康水平進行預警,可以使用 Micrometer 將這些狀態匯出為度量。預設情況下,Spring Boot 使用狀態碼“UP”、“DOWN”、“OUT_OF_SERVICE”和“UNKNOWN”。要匯出這些狀態,您需要將這些狀態轉換為一組數字,以便與 Micrometer Gauge 一起使用。

以下示例展示了編寫此類匯出器的一種方法

  • Java

  • Kotlin

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;

import org.springframework.boot.actuate.health.HealthEndpoint;
import org.springframework.boot.actuate.health.Status;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
public class MyHealthMetricsExportConfiguration {

	public MyHealthMetricsExportConfiguration(MeterRegistry registry, HealthEndpoint healthEndpoint) {
		// This example presumes common tags (such as the app) are applied elsewhere
		Gauge.builder("health", healthEndpoint, this::getStatusCode).strongReference(true).register(registry);
	}

	private int getStatusCode(HealthEndpoint health) {
		Status status = health.health().getStatus();
		if (Status.UP.equals(status)) {
			return 3;
		}
		if (Status.OUT_OF_SERVICE.equals(status)) {
			return 2;
		}
		if (Status.DOWN.equals(status)) {
			return 1;
		}
		return 0;
	}

}
import io.micrometer.core.instrument.Gauge
import io.micrometer.core.instrument.MeterRegistry
import org.springframework.boot.actuate.health.HealthEndpoint
import org.springframework.boot.actuate.health.Status
import org.springframework.context.annotation.Configuration

@Configuration(proxyBeanMethods = false)
class MyHealthMetricsExportConfiguration(registry: MeterRegistry, healthEndpoint: HealthEndpoint) {

	init {
		// This example presumes common tags (such as the app) are applied elsewhere
		Gauge.builder("health", healthEndpoint) { health ->
			getStatusCode(health).toDouble()
		}.strongReference(true).register(registry)
	}

	private fun getStatusCode(health: HealthEndpoint) = when (health.health().status) {
		Status.UP -> 3
		Status.OUT_OF_SERVICE -> 2
		Status.DOWN -> 1
		else -> 0
	}

}