使用Spring Boot Actuator进行健康检查

这次试试对Spring Boot进行健康检查。
通过使用spring-boot-actuator,可以轻松实现健康检查。

添加依赖关系

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.M5</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

健康检查处理目标

只需添加依赖关系,就能通过HealthIndicatorAutoConfiguration自动执行健康检查。目前,spring-boot-actuator-1.3.0.M5仅支持这种健康检查。

対象ヘルスチェック内容DataSourceSpringのBeanとして管理されている全DataSourceに対してPINGクエリを実行(ORACLEの場合は”SELECT ‘Hello’ from DUAL”)MongoDBSpringのBeanとして管理されている全MongoTemplateに対して{ buildInfo: 1 }コマンドを発行RedisSpringのBeanとして管理されている全RedisConnectionFactoryに対してINFOコマンドを発行RabbitMQSpringのBeanとして管理されている全RabbitTemplateに対して、com.rabbitmq.client.Channel#getConnection.getServerProperties()を試行SolrSpringのBeanとして管理されている全SolrServerに対してSolrServer#ping()を実行ディスク空き領域デフォルトではnew File(“.”).getFreeSpace()で10MB以上空きがあるかチェックメール送信SpringのBeanとして管理されている全JavaMailSenderImplに対してJavaMailSenderImpl#testConnection()を実行JMSSpringのBeanとして管理されている全ConnectionFactoryに対してConnectionFactory#createConnection() and Closeを実行ElastitsearchSpringのBeanとして管理されている全Clientに対してRequests#clusterHealthRequestを実行。対象indexはデフォルトで_all

向一个端点发送请求将执行所有的健康检查。
因此,可以判断整个系统是否正在运行。

スクリーンショット 2015-09-19 22.48.37.png

使用的方式

当向/health发送请求时,将以JSON格式返回健康检查结果。

请将以下内容用中文进行本地化改写,只需提供一种选项:
$ curl localhost:8080/health

请用 curl 命令请求本地主机 8080 端口的 /health 路径。

{
    "status":"DOWN",
    "redis":{
        "status":"UP",
        "redisDataWriter" {"status":"UP","version":"2.8.21"},
        "redisDataReader":{"status":"UP","version":"2.8.21"}},
    "elasticsearch":{
        "status":"DOWN",
        "clusterName":"elaseticsearch_sample",
        "numberOfNodes":1,
        "numberOfDataNodes":1,
        "activePrimaryShards":7,
        "activeShards":7,
        "relocatingShards":0,
        "initializingShards":0,
        "unassignedShards":1},
    "db":{
        "status":"UP",
        "database":"Oracle","hello":1}
}

這個結果中已經對Redis、Elasticsearch和資料庫進行了健康檢查。
由於Elasticsearch的健康檢查失敗,所以被標記為DOWN。
預設情況下,只要有一個DOWN狀態存在,整體狀態就會被標記為DOWN。
因此,第一個元素的狀態被標記為DOWN。
當在負載均衡器等機制上進行健康檢查時,將參考第一個元素的狀態來進行判斷。

健康检查设置

可以通过管理健康(management.health)属性来限定执行健康检查的对象。
默认情况下,将根据“健康检查处理对象”中指定的条件进行健康检查,
但是可以通过设置属性来排除健康检查对象。

management:
    health:
        diskspace:
            enabled: false

在这个设定中,已将磁盘空闲空间的健康检查禁用。

添加健康检查处理

通过自己创建健康指示器,可以添加健康检查功能。如果在此处配置了stopFile,则添加一个强制将状态设为DOWN的健康检查指示器。

public class StopFileHealthIndicator extends AbstractHealthIndicator {

  private final File stopFile;

  public StopFileHealthIndicator(String filePath) {
    this.stopFile = new File(filePath);
  }

  @Override
  protected void doHealthCheck(Builder builder) throws Exception {
    if (stopFile.exists()) {
      builder.down().withDetail("stop-file-found", stopFile.getAbsolutePath());
    } else {
      builder.up().withDetail("stop-file-not-found", stopFile.getAbsolutePath());
    }

  }
}

将其注册为Spring的Bean。
在这里,我们同样使用属性来判断其是否可用,就像其他HealthIndicator一样。

@Bean
@ConditionalOnProperty(prefix = "management.health.stopfile", name = "enabled",
      matchIfMissing = true)
public HealthIndicator stopFileHealthIndicator() {
   return new StopFileHealthIndicator("./stop-file");
}

就这样。

请求终端点后能够看到已添加健康检查。

请用中文进行本地化转述:请访问本地主机的8080端口,获取健康状态。

{
    "status":"DOWN",
    "redis":{
        "status":"UP",
        "redisDataWriter" {"status":"UP","version":"2.8.21"},
        "redisDataReader":{"status":"UP","version":"2.8.21"}},
    "elasticsearch":{
        "status":"DOWN",
        "clusterName":"elaseticsearch_sample",
        "numberOfNodes":1,
        "numberOfDataNodes":1,
        "activePrimaryShards":7,
        "activeShards":7,
        "relocatingShards":0,
        "initializingShards":0,
        "unassignedShards":1},
    "stopFile":{
        "status":"UP",
        "stop-file-not-found":"./stopfile"}
    "db":{
        "status":"UP",
        "database":"Oracle","hello":1}
}
广告
将在 10 秒后关闭
bannerAds