Spring Boot Actuator自定义健康检查教程

作者:梦想画家 时间:2022-06-12 14:54:59 

健康检查是Spring Boot Actuator中重要端点之一,可以非常容易查看应用运行至状态。本文在前文的基础上介绍如何自定义健康检查。

1. 概述

本节我们简单说明下依赖及启用配置,展示缺省健康信息。首先需要引入依赖:


compile("org.springframework.boot:spring-boot-starter-actuator")

现在通过http://localhost:8080/actuator/health端点进行验证:


{"status":"UP"}

缺省该端点返回应用中很多组件的汇总健康信息,但可以修改属性配置展示详细内容:


management:
 endpoint:
   health:
     show-details: always

现在再次访问返回结果如下:


{
 "status": "UP",
 "components": {
   "diskSpace": {
     "status": "UP",
     "details": {
       "total": 214748360704,
       "free": 112483500032,
       "threshold": 10485760,
       "exists": true
     }
   },
   "ping": {
     "status": "UP"
   }
 }
}

查看DiskSpaceHealthIndicatorProperties文件的源码:


@ConfigurationProperties(prefix = "management.health.diskspace")
public class DiskSpaceHealthIndicatorProperties {
/**
 * Path used to compute the available disk space.
 */
private File path = new File(".");
/**
 * Minimum disk space that should be available.
 */
private DataSize threshold = DataSize.ofMegabytes(10);
public File getPath() {
 return this.path;
}
public void setPath(File path) {
 this.path = path;
}
public DataSize getThreshold() {
 return this.threshold;
}
public void setThreshold(DataSize threshold) {
 Assert.isTrue(!threshold.isNegative(), "threshold must be greater than or equal to 0");
 this.threshold = threshold;
}
}

上面结果显示当前项目启动的路径 . ,报警值 为10M ,这些属性都可以通过配置进行修改。

2. 预定义健康指标

上面Json响应显示“ping”和“diskSpace”检查。这些检查也称为健康指标,如果应用引用了数据源,Spring会增加db健康指标;同时“diskSpace”是缺省配置。

Spring Boot包括很多预定义的健康指标,下面列出其中一部分:

  • DataSourceHealthIndicator

  • MongoHealthIndicator

  • Neo4jHealthIndicator

  • CassandraHealthIndicator

  • RedisHealthIndicator

  • CassandraHealthIndicator

  • RabbitHealthIndicator

  • CouchbaseHealthIndicator

  • DiskSpaceHealthIndicator (见上面示例)

  • ElasticsearchHealthIndicator

  • InfluxDbHealthIndicator

  • JmsHealthIndicator

  • MailHealthIndicator

  • SolrHealthIndicator

如果在Spring Boot应用中使用Mongo或Solr等,则Spring Boot会自动增加相应健康指标。

3. 自定义健康指标

Spring Boot提供了一捆预定义健康指标,但并没有阻止你增加自己的健康指标。一般有两种自定义类型检查:

单个健康指标组件和组合健康指标组件。

3.1 自定义单个指标组件

自定义需要实现HealthIndicator接口并重新health()方法,同时增加@Component注解。假设示例应用程序与服务A(启动)和服务B(关闭)通信。如果任一服务宕机,应用程序将被视为宕机。因此,我们将写入两个运行状况指标。


@Component
public class ServiceAHealthIndicator implements HealthIndicator {
   private final String message_key = "Service A";
   @Override
   public Health health() {
       if (!isRunningServiceA()) {
           return Health.down().withDetail(message_key, "Not Available").build();
       }
       return Health.up().withDetail(message_key, "Available").build();
   }
   private Boolean isRunningServiceA() {
       Boolean isRunning = true;
       // Logic Skipped
       return isRunning;
   }
}

@Component
public class ServiceBHealthIndicator implements HealthIndicator {
   private final String message_key = "Service B";
   @Override
   public Health health() {
       if (!isRunningServiceB()) {
           return Health.down().withDetail(message_key, "Not Available").build();
       }
       return Health.up().withDetail(message_key, "Available").build();
   }
   private Boolean isRunningServiceB() {
       Boolean isRunning = false;
       // Logic Skipped
       return isRunning;
   }
}

现在,我们看到健康监控响应中增加的指标。ServerA状态是UP,ServiceB是DOWN,因此整个监控检测状态为DOWN.


{
 "status": "DOWN",
 "components": {
   "diskSpace": {
     "status": "UP",
     "details": {
       "total": 214748360704,
       "free": 112483229696,
       "threshold": 10485760,
       "exists": true
     }
   },
   "ping": {
     "status": "UP"
   },
   "serviceA": {
     "status": "UP",
     "details": {
       "Service A": "Available"
     }
   },
   "serviceB": {
     "status": "DOWN",
     "details": {
       "Service B": "Not Available"
     }
   }
 }
}

3.2 自定义组合健康检查

前面示例很容易查看各个指标各自的状态。但有时需要基于几个指标查看资源的状态,则需要使用 HealthContributor ,该接口没有定义方法,仅用于标记。如果一个服务有另外两个动作组合进行实现,只有两者同时工作该服务状态才算正常。最后使用 CompositeHealthContributors组合多个指标:


public class ServiceAHealthIndicator
   implements HealthIndicator, HealthContributor {
...
}

下面定义组合健康检查指标:


@Component("UserServiceAPI")
public class UserServiceAPIHealthContributor
   implements CompositeHealthContributor {

private Map<String, HealthContributor>
         contributors = new LinkedHashMap<>();
 @Autowired
 public UserServiceAPIHealthContributor(
     ServiceAHealthIndicator serviceAHealthIndicator, ServiceBHealthIndicator serviceBHealthIndicator) {

contributors.put("serverA",  serviceAHealthIndicator);
   contributors.put("serverB", serviceBHealthIndicator);
 }
 /**
  *  return list of health contributors
  */
 @Override
 public Iterator<NamedContributor<HealthContributor>> iterator() {
   return contributors.entrySet().stream()
      .map((entry) -> NamedContributor.of(entry.getKey(), entry.getValue())).iterator();
 }

@Override
 public HealthContributor getContributor(String name) {
   return contributors.get(name);
 }
}

现在我们使用serverA和serverB组合新的检查UserServiceAPI。

4. 总结

本文我们学习了Spring Boot健康指标及相关配置、以及预定义的健康指标,同时介绍了如何自定义健康指标。

来源:https://blog.csdn.net/neweastsun/article/details/108933365

标签:Spring,Boot,Actuator,健康检查
0
投稿

猜你喜欢

  • 详谈hibernate,jpa与spring data jpa三者之间的关系

    2022-08-04 22:35:57
  • 详解C# 虚方法virtual

    2022-11-05 09:41:17
  • C++ 前置声明详解及实例

    2023-02-28 10:39:46
  • Springboot项目出现java.lang.ArrayStoreException的异常分析

    2022-05-13 05:48:20
  • C#实现合并多张图片为GIF动态图

    2022-12-13 04:16:35
  • Spring Boot项目如何同时支持HTTP和HTTPS协议的实现

    2023-11-19 19:57:05
  • java生成excel并导出到对应位置的方式

    2021-12-30 16:05:14
  • android动态加载布局文件示例

    2023-12-10 20:42:46
  • 浅析Android文件存储

    2023-06-16 09:07:37
  • 一篇文章带你了解Java Spring基础与IOC

    2021-07-06 07:54:49
  • SpringBoot集成Beetl后统一处理页面异常的方法

    2023-11-10 19:57:55
  • 在Framework 4.0中:找出新增的方法与新增的类(一)

    2021-07-07 05:26:07
  • C#解析json字符串总是多出双引号的原因分析及解决办法

    2022-10-22 02:40:46
  • Android AsyncTask详解及使用方法

    2022-09-24 04:53:29
  • SpringBoot配置shiro安全框架的实现

    2023-09-07 19:55:38
  • C# LINQ to XML应用介绍

    2021-06-11 05:59:07
  • 浅谈web服务器项目中静态请求和动态请求处理

    2022-03-01 21:26:12
  • Mybatis模糊查询之三种定义参数方法和聚合查询、主键回填实现方法

    2023-06-27 03:23:44
  • Android刮刮卡效果实现代码

    2023-08-24 01:29:58
  • Java反射机制的学习总结

    2022-08-30 07:20:39
  • asp之家 软件编程 m.aspxhome.com