本文将动手实现一个自定义Spring Boot Actuator端点来监控数据库连接池状态。
添加相关依赖
首先,添加Spring Boot Actuator依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
添加一个数据库连接池依赖,本文使用HikariCP,如下:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.5</version>
</dependency>
创建一个 POJO 类来表示连接池状态信息:
public class ConnectionPoolStatus {
private int activeConnections;
private int idleConnections;
private int maxConnections;
private int minConnections;
// getter and setter methods
}
注入数据源并获取连接池状态信息
创建一个服务类,注入数据源(DataSource),并提供一个方法来获取连接池状态信息。
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ConnectionPoolStatusService {
private final HikariDataSource hikariDataSource;
@Autowired
public ConnectionPoolStatusService(DataSource dataSource) {
if (dataSource instanceof HikariDataSource) {
this.hikariDataSource = (HikariDataSource) dataSource;
} else {
throw new IllegalArgumentException("DataSource must be an instance of HikariDataSource");
}
}
public ConnectionPoolStatus getConnectionPoolStatus() {
ConnectionPoolStatus status = new ConnectionPoolStatus();
status.setActiveConnections(hikariDataSource.getHikariPoolMXBean().getActiveConnections());
status.setIdleConnections(hikariDataSource.getHikariPoolMXBean().getIdleConnections());
status.setMaxConnections(hikariDataSource.getMaximumPoolSize());
status.setMinConnections(hikariDataSource.getMinimumIdle());
return status;
}
}
创建自定义端点
创建一个类,扩展AbstractEndpoint或实现Endpoint接口,以创建自定义端点。在这个类中,注入
ConnectionPoolStatusService并实现getConnectionPoolStatus方法,以获取和返回连接池状态。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.stereotype.Component;
@Component
@Endpoint(id = "connection-pool")
public class ConnectionPoolStatusEndpoint {
private final ConnectionPoolStatusService connectionPoolStatusService;
@Autowired
public ConnectionPoolStatusEndpoint(ConnectionPoolStatusService connectionPoolStatusService) {
this.connectionPoolStatusService = connectionPoolStatusService;
}
@ReadOperation
public ConnectionPoolStatus getConnectionPoolStatus() {
return connectionPoolStatusService.getConnectionPoolStatus();
}
}
测试自定义端点
访问 /actuator/connection-pool 端点时,将返回包含数据库连接池状态信息的 JSON 数据。例如:
{
"activeConnections": 5,
"idleConnections": 10,
"maxConnections": 20,
"minConnections": 5
}
通过查询这个接口,我们可以方便的知道数据库的连接池的状态信息。
自定义端点使用场景
Spring Boot Actuator自定义端点的一些场景如下,可以根据项目需要自行定义:
- 应用状态信息:创建一个自定义端点来显示应用程序的当前状态,如正在运行的任务数量、已完成的任务数量等。
- 性能监控:创建自定义端点来监控应用程序的性能指标,如内存使用情况、CPU使用率、线程数等。
- 功能开关:创建自定义端点以动态启用或禁用应用程序的某些功能,例如暂停或恢复任务处理、启用或禁用调试日志等。
- 配置信息:创建自定义端点来查看或更新应用程序的配置设置,例如查看或更改数据库连接字符串、更改日志级别等。
- 诊断和排错:创建自定义端点来收集和展示应用程序的诊断信息,如系统属性、JVM参数、类路径等,以帮助开发人员或运维人员排查问题。
- 应用程序版本信息:创建自定义端点来展示应用程序的版本信息,包括构建时间、版本号、Git提交哈希等。
- 用户会话管理:创建自定义端点来管理应用程序的用户会话,例如列出当前活动的会话、强制终止会话等。
- 缓存管理:创建自定义端点来管理应用程序的缓存,例如查看缓存状态、清除缓存等。
- 数据库监控:创建自定义端点来监控数据库连接池状态、慢查询日志等。
- 分布式追踪:创建自定义端点来展示分布式追踪信息,如请求链路、服务调用时间等。