区分昂贵和便宜的健康检查
Distinguish between expensive and inexpensive health checks
我们通常在高度可用的应用程序中非常频繁地 ping /health
以确定何时需要进行故障转移。 Spring 如果使用的健康指示器不会对外部依赖项(如数据库或 Web 服务)进行昂贵的调用,则引导执行器可以很好地执行此操作。但是,我们喜欢编写健康指标的简便性以及它如何插入 /health
端点。
有什么方法可以配置 Spring 引导执行器,以便在某些情况下仅执行一部分指标?如果可以,怎么做?
谢谢!
您可以使用 management.health.<service>.enabled
属性控制启用哪些健康指标。例如,要关闭数据库健康检查:
management.health.db.enabled: false
完整的属性列表可用 here。在撰写本文时,它们是:
management.health.db.enabled
management.health.diskspace.enabled
management.health.mongo.enabled
management.health.rabbit.enabled
management.health.redis.enabled
management.health.solr.enabled
我现在也有类似情况。我刚刚实现了一个自定义 Endpoint
来执行昂贵的健康检查。
如果您需要 HTTP 端点的舒适性,您还可以实现一个 AbstractEndpointMvcAdapter
,它执行与 Spring 的 HealthMvcEndpoint
.[=13= 类似的 HTTP 状态代码映射]
2021 年更新
Health Groups 提供您所询问的确切功能。
如果您使用 Spring Boot >= 2.2,您可以使用单独的库 spring-boot-async-health-indicator 在单独的线程上进行昂贵的健康检查 运行,只需用 @AsyncHealth
.
这将确保您的 /health
端点总是 return 非常快并且不会等待那些昂贵的健康检查完成。
示例:
@AsyncHealth
@Component
public class MyExpensiveHealthCheck implements HealthIndicator {
@Override
public Health health() {
verySlowCheck(); // This method does not run when /health is called
return Health.up().build();
}
}
免责声明:我创建这个库就是为了这个目的
我们通常在高度可用的应用程序中非常频繁地 ping /health
以确定何时需要进行故障转移。 Spring 如果使用的健康指示器不会对外部依赖项(如数据库或 Web 服务)进行昂贵的调用,则引导执行器可以很好地执行此操作。但是,我们喜欢编写健康指标的简便性以及它如何插入 /health
端点。
有什么方法可以配置 Spring 引导执行器,以便在某些情况下仅执行一部分指标?如果可以,怎么做?
谢谢!
您可以使用 management.health.<service>.enabled
属性控制启用哪些健康指标。例如,要关闭数据库健康检查:
management.health.db.enabled: false
完整的属性列表可用 here。在撰写本文时,它们是:
management.health.db.enabled
management.health.diskspace.enabled
management.health.mongo.enabled
management.health.rabbit.enabled
management.health.redis.enabled
management.health.solr.enabled
我现在也有类似情况。我刚刚实现了一个自定义 Endpoint
来执行昂贵的健康检查。
如果您需要 HTTP 端点的舒适性,您还可以实现一个 AbstractEndpointMvcAdapter
,它执行与 Spring 的 HealthMvcEndpoint
.[=13= 类似的 HTTP 状态代码映射]
2021 年更新
Health Groups 提供您所询问的确切功能。
如果您使用 Spring Boot >= 2.2,您可以使用单独的库 spring-boot-async-health-indicator 在单独的线程上进行昂贵的健康检查 运行,只需用 @AsyncHealth
.
这将确保您的 /health
端点总是 return 非常快并且不会等待那些昂贵的健康检查完成。
示例:
@AsyncHealth
@Component
public class MyExpensiveHealthCheck implements HealthIndicator {
@Override
public Health health() {
verySlowCheck(); // This method does not run when /health is called
return Health.up().build();
}
}
免责声明:我创建这个库就是为了这个目的