执行器

Spring Boot 包含了 Spring Boot Actuator。 本节解答了在使用过程中经常出现的问题。spring-doc.cadn.net.cn

更改 Actuator 端点的 HTTP 端口或地址

在独立应用程序中,Actuator 的 HTTP 端口默认与主 HTTP 端口相同。 要使应用程序监听不同的端口,请设置外部属性:management.server.port。 若要监听完全不同的网络地址(例如,当您为管理使用内部网络,而为用户应用程序使用外部网络时),还可以将 management.server.address 设置为服务器能够绑定的有效 IP 地址。spring-doc.cadn.net.cn

如需更多详情,请参阅“生产就绪功能”部分中的 ManagementServerProperties 源代码和 自定义管理服务器端口spring-doc.cadn.net.cn

自定义清理策略

要控制清理过程,请定义一个 SanitizingFunction Bean。 调用该函数时传入的 SanitizableData 提供了对键和值的访问权限,以及它们来源的 PropertySource。 这使得例如可以清理来自特定属性源的每个值。 每个 SanitizingFunction 会按顺序被调用,直到某个函数更改了可清理数据的值为止。spring-doc.cadn.net.cn

将健康指标映射到 Micrometer 指标

Spring Boot 健康指示器返回一个 Status 类型,以指示系统的整体健康状况。 如果您希望监控或针对特定应用程序的健康级别发出警报,可以使用 Micrometer 将这些状态导出为指标。 默认情况下,Spring Boot 使用状态码spring-doc.cadn.net.cn

以下示例展示了一种编写此类导出器的方法:spring-doc.cadn.net.cn

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

import org.springframework.boot.health.actuate.endpoint.HealthEndpoint;
import org.springframework.boot.health.contributor.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.health.actuate.endpoint.HealthEndpoint
import org.springframework.boot.health.contributor.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
	}

}