有什么方法可以使Spring Actuator定期执行运行状况检查?我在想,也许可以选择在HealthIndicator的自定义实现中包含一些Runnable,但对我来说,这个想法看起来不太好。 我要检查Cassandra,如果失败,请执行一些紧急操作
答案 0 :(得分:0)
您可能只是定期从某些外部监视系统(如Nagios)调用/ health端点,如果响应不是HTTP 200,则采取适当的措施。如果您对/ health端点进行了身份验证的调用,则响应主体将包含确切失败的详细信息(未经身份验证的呼叫只有HTTP响应代码。
Spring Actuator现在不打算采取任何行动。它仅供/health
端点使用。
但是,如果您真的想扩展该想法并对失败的运行状况检查采取某些措施,请查看弹簧启动执行器的源代码。
https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra
它包含每个运行状况检查的实现。
您可以轻松地重用它们并编写自己的实现,该实现将定期调用每个HealthIndicator
。
有关详细信息,请检查org.springframework.boot.actuate.health.HealthEndpoint
的外观。
您可能会定期做完全相同的事情。
请注意,这可能不是最好的主意。您将在很大程度上取决于执行器特定版本的实现细节。在更新了Sping Boot的版本(它们通常会发布新版本,并且由于安全修补程序和新功能而经常进行更新)之后,您的自定义逻辑可能无法编译,停止工作或无法正常工作。
答案 1 :(得分:0)
我通过谷歌搜索发现了这个条目,因为我希望定期运行健康检查。就像之前的文章中提到的那样,您可以定期从外部监控系统调用健康端点,但假设您想使用 micrometer 将健康指标发送到 NewRelic 等外部注册表,并且您不想依赖外部 ping。然后你可以像下面这样使用 import org.springframework.boot.actuate.health.HealthEndpoint :
@Configuration
@EnableScheduling
public class HealthMetricsConfiguration {
private final String GAUGE_NAME = "gaugeName";
private AtomicInteger gauge;
private HealthEndpoint healthEndpoint;
public HealthMetricsConfiguration(MeterRegistry registry, HealthEndpoint healthEndpoint) {
this.healthEndpoint = healthEndpoint;
gauge = registry.gauge(GAUGE_NAME, new AtomicInteger());
gauge.set(getStatusCode(this.healthEndpoint));
}
private int getStatusCode(HealthEndpoint healthEndPoint) {
Status status = healthEndPoint.health().getStatus();
if(Status.OUT_OF_SERVICE.equals(status)) {
return 3;
}else if(Status.DOWN.equals(status)) {
return 2;
}else if(Status.UP.equals(status)) {
return 1;
}else {
return 0; //Status.UNKNOWN
}
}
@Scheduled(fixedDelayString = 60000, initialDelayString = 60000)
public void periodicRunSelfHealthCheck() {
gauge.set(getStatusCode(this.healthEndpoint));
}
}
关键是 healthEndpoint.health() 将运行您的健康检查。代码每分钟运行一次健康检查。