Spring Boot运行状况检查计划

时间:2018-09-02 16:35:11

标签: spring-boot-actuator

有什么方法可以使Spring Actuator定期执行运行状况检查?我在想,也许可以选择在HealthIndicator的自定义实现中包含一些Runnable,但对我来说,这个想法看起来不太好。 我要检查Cassandra,如果失败,请执行一些紧急操作

2 个答案:

答案 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() 将运行您的健康检查。代码每分钟运行一次健康检查。