From e49baa1cf8d6219a3252494de05936bc80b85d8e Mon Sep 17 00:00:00 2001 From: Li Date: Tue, 21 Feb 2023 11:06:10 +0800 Subject: [PATCH] feat: add database endpoint for actuator (#3351) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind feature /milestone 2.3.x #### What this PR does / why we need it: #### Which issue(s) this PR fixes: Fixes #3263 #### Special notes for your reviewer: 测试方法: 1. 使用超级管理员登录 2. 查看接口 /actuator/info 查看是否存在 database 字段。 #### Does this PR introduce a user-facing change? ```release-note NONE ``` --- .../app/actuator/DatabaseInfoContributor.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/main/java/run/halo/app/actuator/DatabaseInfoContributor.java diff --git a/src/main/java/run/halo/app/actuator/DatabaseInfoContributor.java b/src/main/java/run/halo/app/actuator/DatabaseInfoContributor.java new file mode 100644 index 000000000..e0aa0b5cd --- /dev/null +++ b/src/main/java/run/halo/app/actuator/DatabaseInfoContributor.java @@ -0,0 +1,48 @@ +package run.halo.app.actuator; + +import io.r2dbc.spi.Connection; +import io.r2dbc.spi.ConnectionFactory; +import io.r2dbc.spi.ConnectionMetadata; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.springframework.boot.actuate.info.Info; +import org.springframework.boot.actuate.info.InfoContributor; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +@Component +public class DatabaseInfoContributor implements InfoContributor { + private static final String DATABASE_INFO_KEY = "database"; + + private final ConnectionFactory connectionFactory; + + public DatabaseInfoContributor(ConnectionFactory connectionFactory) { + this.connectionFactory = connectionFactory; + } + + @Override + public void contribute(Info.Builder builder) { + builder.withDetail(DATABASE_INFO_KEY, contributorMap()); + } + + public Map contributorMap() { + var map = new HashMap(); + var connectionMetadata = getConnectionMetadata().block(); + if (Objects.isNull(connectionMetadata)) { + return map; + } + map.put("name", connectionMetadata.getDatabaseProductName()); + map.put("version", connectionMetadata.getDatabaseVersion()); + return map; + } + + private Mono getConnectionMetadata() { + return Mono.usingWhen(this.connectionFactory.create(), + conn -> Mono.just(conn.getMetadata()), + Connection::close, + (conn, t) -> conn.close(), + Connection::close + ); + } +}