アクチュエーター

Spring Boot には Spring Boot Actuator が含まれます。このセクションでは、その使用からしばしば生じる質問に回答します。

アクチュエーターエンドポイントの HTTP ポートまたはアドレスを変更する

スタンドアロンアプリケーションでは、アクチュエーターの HTTP ポートはデフォルトでメイン HTTP ポートと同じになります。アプリケーションが別のポートでリッスンするようにするには、外部プロパティ management.server.port を設定します。管理用の内部ネットワークとユーザーアプリケーション用の外部ネットワークがある場合など、完全に異なるネットワークアドレスでリッスンするために、management.server.address をサーバーがバインドできる有効な IP アドレスに設定することもできます。

詳細については、ManagementServerProperties (Javadoc) ソースコードおよび "Production-ready features" セクションの "管理サーバーポートのカスタマイズ" を参照してください。

「ホワイトラベル」エラーページをカスタマイズする

Spring Boot は、サーバーエラーが発生した場合にブラウザークライアントに表示される「ホワイトラベル」エラーページをインストールします(JSON およびその他のメディア型を使用するマシンクライアントは、適切なエラーコードで適切なレスポンスを確認する必要があります)。

server.error.whitelabel.enabled=false を設定して、デフォルトのエラーページをオフにします。これにより、使用しているサーブレットコンテナーのデフォルトが復元されます。Spring Boot は引き続きエラービューの解決を試みるため、完全に無効にするのではなく、おそらく独自のエラーページを追加する必要があります。

独自のエラーページを上書きするかどうかは、使用するテンプレート技術によって異なります。例: Thymeleaf を使用する場合、error.html テンプレートを追加できます。FreeMarker を使用する場合は、error.ftlh テンプレートを追加できます。一般に、error という名前で解決される View または /error パスを処理する @Controller が必要です。デフォルト構成の一部を置き換えない限り、ApplicationContext に BeanNameViewResolver が見つかるはずです。そのため、error という名前の @Bean がその 1 つの方法です。その他のオプションについては、ErrorMvcAutoConfiguration [GitHub] (英語) を参照してください。

サーブレットコンテナーにハンドラーを登録する方法の詳細については、"エラー処理" のセクションも参照してください。

サニタイズのカスタマイズ

サニタイズを制御するには、SanitizingFunction Bean を定義します。関数が呼び出される SanitizableData は、キーと値、それらの元の PropertySource へのアクセスを提供します。これにより、たとえば、特定のプロパティソースからのすべての値をサニタイズできます。関数がサニタイズ可能なデータの値を変更するまで、各 SanitizingFunction が順番に呼び出されます。

ヘルスインジケーターを Micrometer メトリクスにマップする

Spring Boot ヘルスインジケーターは、システム全体のヘルスを示す Status 型を返します。特定のアプリケーションのヘルスレベルを監視または警告する場合は、これらのステータスを Micrometer を使用してメトリクスとしてエクスポートできます。デフォルトでは、ステータスコード "UP"、"DOWN"、"OUT_OF_SERVICE"、"UNKNOWN" が Spring Boot によって使用されます。これらをエクスポートするには、Micrometer Gauge で使用できるように、これらの状態をいくつかの数値のセットに変換する必要があります。

次の例は、そのようなエクスポーターを作成する 1 つの方法を示しています。

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

}