Spring Boot Actuator自定义健康检查

本文介绍了如何在SpringBoot应用中自定义健康检查,包括使用预定义指标如DataSource、Mongo等,以及如何实现自定义HealthIndicator以监控服务状态。通过实例展示了组合健康检查和定制健康组件的方法,以确保应用的稳定监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Boot Actuator自定义健康检查

健康检查是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健康指标及相关配置、以及预定义的健康指标,同时介绍了如何自定义健康指标。

### Spring Boot Actuator 自定义监控页面 为了创建一个自定义Spring Boot Actuator 监控页面,可以按照以下方法实现: #### 创建基础项目结构 确保已经引入了 `spring-boot-starter-actuator` 依赖项。这可以通过在项目的构建文件中添加相应的 Maven 或 Gradle 配置来完成。 对于Maven, 添加如下配置到pom.xml 文件内: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` 对于Gradle,则是在build.gradle 中加入: ```groovy implementation 'org.springframework.boot:spring-boot-starter-actuator' ``` #### 启用Web端点暴露 为了让 Web 浏览器能够访问这些端点,在 application.properties 或者 yml 文件里设置属性以公开所有或特定的健康检查和其他信息端点[^1]: ```properties management.endpoints.web.exposure.include=* ``` 如果只希望开放某些指定端点的话,可以用逗号分隔它们的名字列表替换星号(*)。 #### 构建自定义仪表板视图 要提供定制化的 HTML 页面作为入口展示各个可用的服务状态指标数据,可以在 resources/templates 下面建立名为 index.html 的 Thymeleaf 模板文件,并编写所需的HTML/CSS/JavaScript 来呈现美观易读的内容。 下面是一个简单的例子用于说明如何显示应用程序基本信息以及环境变量详情: ```html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"/> <title>Custom Dashboard Page Example Tutorial</title> <link rel='stylesheet' href='/webjars/bootstrap/css/bootstrap.min.css'/> <script th:inline="javascript" type="text/javascript"> // Fetching data from /info and /env endpoints using JavaScript fetch API. const fetchData = async () => { const infoResponse = await fetch('/actuator/info'); const envResponse = await fetch('/actuator/env'); let infoData = {}; let envData = {}; try{ infoData = await infoResponse.json(); envData = await envResponse.json(); } catch(error){ console.error('Error fetching actuator endpoint:', error); } document.getElementById("appInfo").innerHTML = JSON.stringify(infoData.build.version || "N/A", null, '\t'); document.getElementById("envVars").innerHTML = Object.keys(envData.propertySources).map(key=>`${key}: ${JSON.stringify(envData.propertySources[key].name)}`).join("<br>"); } window.onload = fetchData; </script> <style> body { font-family: Arial; } .container{ margin-top:2em;} table tr td:first-child{font-weight:bold;} </style> </head> <body class="container"> <h1>Spring Boot Application Status</h1> <div class="row"> <div class="col-md-6"> <h3>Application Info:</h3> <pre id="appInfo"></pre> </div> <div class="col-md-6"> <h3>Environment Variables:</h3> <pre id="envVars"></pre> </div> </div> </body> </html> ``` 此模板利用Thymeleaf 和 Bootstrap 提供了一个简洁直观的应用程序概览界面,通过调用 `/actuator/info` 及 `/actuator/env` 接口获取并渲染相关信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值