Actuator

Spring Boot 包含了 Spring Boot 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
	}

}