执行器
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 使用状态码
以下示例展示了一种编写此类导出器的方法:
-
Java
-
Kotlin
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
}
}