Actuator

Spring Boot 包含 Spring Boot Actuator。本节解答了使用 Actuator 时经常出现的问题。

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

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

有关更多详细信息,请参阅 ManagementServerProperties 源代码和“自定义管理服务器端口”在“生产就绪功能”部分。

自定义“白标”错误页面

Spring Boot 安装了一个“白标”错误页面,如果您遇到服务器错误,您将在浏览器客户端中看到它(使用 JSON 和其他媒体类型的机器客户端应该看到一个带有正确错误代码的合理响应)。

设置 server.error.whitelabel.enabled=false 以关闭默认错误页面。这样做会恢复您正在使用的 servlet 容器的默认设置。请注意,Spring Boot 仍然尝试解析错误视图,因此您应该添加自己的错误页面,而不是完全禁用它。

使用您自己的错误页面覆盖默认错误页面取决于您使用的模板技术。例如,如果您使用 Thymeleaf,您可以添加一个 error.html 模板。如果您使用 FreeMarker,您可以添加一个 error.ftlh 模板。一般来说,您需要一个以 error 为名称解析的 View 或者一个处理 /error 路径的 @Controller。除非您替换了一些默认配置,否则您应该在您的 ApplicationContext 中找到一个 BeanNameViewResolver,因此一个名为 error@Bean 将是一种实现方式。有关更多选项,请参见 ErrorMvcAutoConfiguration

另请参阅“错误处理”部分,了解如何在 servlet 容器中注册处理程序的详细信息。

自定义清理

要控制清理过程,请定义一个 SanitizingFunction bean。调用该函数的 SanitizableData 提供对键和值以及它们来自的 PropertySource 的访问。这使您可以例如清理来自特定属性源的每个值。每个 SanitizingFunction 按顺序调用,直到某个函数更改了可清理数据的 value。

将健康指标映射到 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
	}

}